verilog行为级建模(1)
发布日期:2022-02-28 20:48:40 浏览次数:20 分类:技术文章

本文共 3006 字,大约阅读时间需要 10 分钟。

verilog行为级建模(behavioral model)

Verilog HDL的抽象层级

  1. 行为级(behavioral) ,更高层级的对逻辑的行为进行建模;
  2. RTL级 逻辑在寄存器级(register level)进行建模;
  3. 结构级(structural) 逻辑在寄存器和门级进行建模;

程序块(procedural blocks)

Verilog的行为级代码一般要写在程序块内部,但也有例外。

Verilog中有两种程序块:
initial:initial块在零时刻开始执行,且仅执行一次。
always:always块一次次地循环执行,换言之,就像它的名字所说的那样,它一直(always)执行。

举例

module initia—l_example();reg clk, reset, enable, data;initial begin	clk = 0;	reset = 0;	enable = 0;	data = 0;endendmodule
module always_example();reg clk,reset,enable,q_in,data;always @ (posedge clk)	if (reset)  begin 		data <= 0;	end else if (enable) begin   		data <= q_in;	endendmodule

上例中,initial block从零时刻开始执行,不需要等待;always block需要等待“触发事件”的发生,此处为时钟的上升沿,执行过一次后,再次等待下一次“触发事件”的发生。

顺序赋值语句

1、顺序赋值语句给reg, integer, real或者time变量赋值,不能给nets(wire数据类型)赋值。

2、可以给寄存器(reg类型)赋值为net(wire类型)、常数、其他寄存器或一个特定值。

顺序赋值组(procedural assignment group)

如果一个顺序块包含了不止一条声明,这些声明应当被包括在:

1、顺序begin - end
2、并行frok - jion

使用 begin-end 时,可以给这个group起名,我们称之为 named blocks

举例

例一

module initial_begin_end();reg clk, reset, enable, data;initial begin$monitor(	"%g clk = %b reset = %b enable = %b data = %b",	$time, clk, reset, enable, data);	#1 clk = 1;	#10 reset = 1;	#3 enable = `;	#5 data = 0;	#1 $finish;endendmodule

begin:clk在延时一个时间单位后为0,reset延时11个时间单位后为0,16个时间单位后使能(enable),19个时间单位后data赋值为0。所有的语句顺序执行。

begin-end块的特点:

顺序执行
延时累积
块在最后一条语句之后结束

模拟结果:

0 clk=x reset=x enable=x data=x 1 clk=0 reset=x enable=x data=x 11 clk=0 reset=0 enable=x data=x 16 clk=0 reset=0 enable=0 data=x 19 clk=0 reset=0 enable=0 data=0

例二

1 module initial_fork_join();  2 reg clk,reset,enable,data;  3   4 initial begin  5  $monitor("%g clk=%b reset=%b enable=%b data=%b",   6    $time, clk, reset, enable, data);  7  fork  8     #1   clk = 0;  9     #10  reset = 0; 10     #5   enable = 0; 11     #3   data = 0; 12  join 13   #1  $display ("%g Terminating simulation", $time); 14  $finish; 15 end 16  17 endmodule

fork:一个时间单位后clk被赋值,10个时间单位后reset被赋值,5个时间单位后enable被赋值,3个时间单位后data被赋值。所有语句并行(同时)执行。

特点:

同时执行
块在最后一条语句完成后结束(延迟最高的语句,它可以是块中的第一条语句)

模拟结果:

0 clk=x reset=x enable=x data=x1 clk=0 reset=x enable=x data=x3 clk=0 reset=x enable=x data=05 clk=0 reset=x enable=0 data=010 clk=0 reset=0 enable=0 data=011 Terminating simulation

阻塞和非阻塞赋值(Blocking and Nonblocking assignment)

  • 阻塞赋值按照程序的排列顺序执行。
    因为直到当前语句执行完毕才能执行下一跳语句,即“阻塞”了下一条语句的执行,所以被称为阻塞赋值。

阻塞赋值用 “=”,如 a = b;

  • 非阻塞赋值是并行执行的。由于当前语句的执行不会阻塞下一条语句的执行,因此称为非阻塞语句。

非阻塞赋值用 “<=”,如 a <= b;

举例

1 module blocking_nonblocking();  2   3 reg a,b,c,d;  4 // Blocking Assignment  5 initial begin  6    #10  a = 0;  7    #11  a = 1;  8    #12  a = 0;  9    #13  a = 1; 10 end 11  12 initial begin 13    #10  b <= 0; 14    #11  b <= 1; 15    #12  b <= 0; 16    #13  b <= 1; 17 end 18  19 initial begin 20    c = #10 0; 21    c = #11 1; 22    c = #12 0; 23    c = #13 1; 24 end 25  26 initial begin 27    d <=  #10  0; 28    d <=  #11  1; 29    d <=  #12  0; 30    d <=  #13  1; 31 end 32  33 initial begin 34   $monitor("TIME = %g A = %b B = %b C = %b D = %b",$time, a, b, c, d); 35    #50  $finish; 36 end 37  38 endmodule

波形:

在这里插入图片描述

转载地址:https://blog.csdn.net/weixin_53381817/article/details/123042563 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mybatis笔记
下一篇:LInux下对目录的一些操作指令

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月28日 09时29分00秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

spring boot 与 Ant Design of Vue 实现删除组织(二十六) 2019-04-27
spring boot 与 Ant Design of Vue 实现获取用户列表(二十七) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增用户(二十八) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改用户(二十九) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除用户(三十) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系登录的实现(三十一) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系获取用户信息的实现(三十二) 2019-04-27
Druid连接池实现自定义场景的多数据库的连接 2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库 2019-04-27
基于VMware安装CentOs7的镜像 2019-04-27
PL/SQL数据库管理工具的使用 2019-04-27
史上最简单的spring-boot集成websocket的实现方式 2019-04-27
带你玩转属于自己的spring-boot-starter系列(一) 2019-04-27
带你玩转属于自己自己的spring-boot-starter系列(二) 2019-04-27
带你玩转属于自己的spring-boot-starter系列(三) 2019-04-27
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之基于seata的分布式事务的解决方案(十五) 2019-04-27