Verilog初级教程(13)Verilog中的块语句
文章目录
- 前言
- 正文
- 串行语句
- 并行语句
- 并行块内包含串行块的情况
- 块名称
- 往期文章回顾
前言
所谓的块语句,无非就是一组语句,例如在initial或者always中,使用begin…end或者fork…join包裹的语句,都可以称为块语句。块语句有两种:
- 串行语句
- 并行语句
下面分别介绍。
正文
串行语句
语句使用begin和end关键字进行包装,并将按照给定的顺序,一个接一个地依次执行。
延迟值相对于前一条语句的执行时间进行处理。在块内的所有语句执行完毕后,控制权可以传递到其他地方。
例如:
module design0;reg [31:0] data;// "initial" block starts at time 0initial begin// After 10 time units, data becomes 0xfe#10 data = 8'hfe;$display ("[Time=%0t] data=0x%0h", $time, data);// After 20 time units, data becomes 0x11#20 data = 8'h11;$display ("[Time=%0t] data=0x%0h", $time, data);end
endmodule
如上例,第一条语句从begin处开始,经过10个单位的延迟,执行第一条语句;
在经过20个时间单位的延迟,执行第二条语句。这就是串行执行的语句。
上述仿真log文件为:
[Time=10] data=0xfe
[Time=30] data=0x11
并行语句
并行块可以并发执行语句,延迟控制可以用来提供赋值的时间顺序。通过将语句包装在fork和join关键字中来并行启动。
例如:
initial begin#10 data = 8'hfe;fork#20 data = 8'h11;#10 data = 8'h00;join
end
其执行示意图如下:
位于fork…join中的语句是并行语句块,里面的每一条语句(使用分号或者begin…end分割)都并行执行,例如上例中的fork…join内部的语句,即使:
#20 data = 8'h11;
位于前面,但是它是要在语句:
#10 data = 8'h00;
后面执行。
上图也很明显地说明了,fork开始,10个时间单位时,执行:
#10 data = 8'h00;
在过10个时间单位执行:
#20 data = 8'h11;
这就是并行执行。
并行块内包含串行块的情况
上面举了这个例子:
initial begin#10 data = 8'hfe;fork#20 data = 8'h11;#10 data = 8'h00;join
end
在上面的例子中,fork-join块将在以10个时间单位执行语句后启动。在这个块中的语句将被并行执行,第一个被启动的语句将是数据被赋值为8’h00的语句,因为延迟是在fork-join启动后的10个时间单位。再过10个时间单位后,第一条语句将被启动,数据将得到8’h11的值。
我们上面也说了,并行块内的每一条语句都并行执行,我们对这里的每一条语句进行说明,使用begin…end包裹的语句块也属于一条语句,即块语句。
而begin…end中的语句是串行执行的,因此就存在并行中包含串行的情况,如下例:
initial begin#10 data = 8'hfe;fork#10 data = 8'h11;begin#20 data = 8'h00;#30 data = 8'haa;endjoin
end
很好理解,如下图:
语句:
#10 data = 8'h11;
与:
begin#20 data = 8'h00;#30 data = 8'haa;end
是并行的关系。
fork开始后的10个时间单位执行语句:
#10 data = 8'h11;
与
begin#20 data = 8'h00;#30 data = 8'haa;end
因为块本身(块内的第一条语句)与其他语句一同并行启动;
之后块内部的语句串行执行:
也就是说fork后的20个时间单位执行:
//begin#20 data = 8'h00;// #30 data = 8'haa;//end
不言而喻,在过30个时间单位,也就是fork后的50时间单位执行:
//begin// #20 data = 8'h00;#30 data = 8'haa;// end
注:这里强调的都是fork后的时间点,而不是initial begin后的,如果强调initial后的,需要算上第一条语句的10个时间单位。
块名称
顺串行块和并行块都可以通过在关键字begin和fork后面添加:name_of_block
来命名。这样,就可以在disable
语句中引用该块。
例如:
begin : name_seq[statements]
endfork : name_fork[statements]
join
往期文章回顾
Verilog初级教程(12)Verilog中的generate块
Verilog初级教程(11)Verilog中的initial块
Verilog初级教程(10)Verilog的always块
Verilog初级教程(9)Verilog的运算符
Verilog初级教程(8)Verilog中的assign语句
Verilog初级教程(7)Verilog模块例化以及悬空端口的处理
Verilog初级教程(6)Verilog模块与端口
Verilog初级教程(5)Verilog中的多维数组和存储器
Verilog初级教程(4)Verilog中的标量与向量
Verilog初级教程(3)Verilog 数据类型
Verilog初级教程(2)Verilog HDL的初级语法
Verilog初级教程(1)认识 Verilog HDL
芯片设计抽象层及其设计风格
Verilog以及VHDL所倡导的的代码准则
FPGA/ASIC初学者应该学习Verilog还是VHDL?
- 个人微信公众号: FPGA LAB
交个朋友
Verilog初级教程(13)Verilog中的块语句相关推荐
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
- Verilog初级教程(23)Verilog仿真中的显示任务
文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- Verilog初级教程(19)Verilog中的参数
文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...
- Verilog初级教程(16)Verilog中的控制块
文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...
- Verilog初级教程(9)Verilog的运算符
博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...
最新文章
- Opencv java 角点检测 preCornerDetect(15)
- Hinton神经网络公开课编程练习1 The perceptron learning algorithm
- linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁
- 用Socket 打造跨语言跨操作系统的网络MORPG游戏(二)
- JDBC Druid式link
- 双线性插值算法c 语言实现,双线性插值 - CristianoC的个人空间 - OSCHINA - 中文开源技术交流社区...
- 《大数据》第一届编委会顾问委员会议圆满召开
- 超过 40 款很有用而且很新的 jQuery 插件
- c语言大地坐标转空间直角坐标,大地坐标转换直角坐标的C++代码(高斯克吕格投影)...
- 香农编码的gui编码_香农编码
- ajax直接发PUT,DELETE请求报错500
- AP(接入点)模式、Router(无线路由)模式、Repeater(中继)模式、Bridge(桥接)模式、 Client(客户端)模式
- SAS(十二)PROC步
- 向内看 —— 自恋者的局限
- fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统
- c++课程设计自助点餐系统
- 商业分析师应如何构建一个商业故事
- ZYNQ有两个CPU?(二)——OCM共享内存
- (转)如何彻底的卸载anaconda(包括配置文件)
- Web大学生网页作业成品——仿腾讯游戏官网网站设计与实现(HTML+CSS+JavaScript)
热门文章
- Java基础学习笔记二十四 MySQL安装图解
- C++ 对象间通信框架 V2.0 ××××××× 之(五)
- RMI 自己创建的 过程
- Linux下screen的简单介绍
- cmake 学习笔记(三)
- Python实现AI贪吃蛇
- 在一个字符串中找到第一个只出现一次的字符, 并返回它的位置
- 计算机中dhcp服务器怎么找,如何查找网络中其他非法 DHCP 服务器Unix系统 -电脑资料...
- sonar jacoco 覆盖率为0_接口测试代码覆盖率(jacoco)方案分享
- 【亲测有效】macOS无法验证此App不包含恶意软件