verilog行为级建模(1)
发布日期:2022-02-28 20:48:40
浏览次数:20
分类:技术文章
本文共 3006 字,大约阅读时间需要 10 分钟。
verilog行为级建模(behavioral model)
Verilog HDL的抽象层级
- 行为级(behavioral) ,更高层级的对逻辑的行为进行建模;
- RTL级 逻辑在寄存器级(register level)进行建模;
- 结构级(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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,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
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