文章目录

  • 前言
  • 正文
    • 串行语句
    • 并行语句
    • 并行块内包含串行块的情况
    • 块名称
  • 往期文章回顾

前言

所谓的块语句,无非就是一组语句,例如在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中的块语句相关推荐

  1. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  2. Verilog初级教程(11)Verilog中的initial块

    文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...

  3. Verilog初级教程(23)Verilog仿真中的显示任务

    文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...

  4. Verilog初级教程(21)Verilog中的延迟控制语句

    文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...

  5. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...

  6. Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...

  7. Verilog初级教程(14)Verilog中的赋值语句

    文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...

  8. Verilog初级教程(19)Verilog中的参数

    文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...

  9. Verilog初级教程(16)Verilog中的控制块

    文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...

  10. Verilog初级教程(9)Verilog的运算符

    博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...

最新文章

  1. Opencv java 角点检测 preCornerDetect(15)
  2. Hinton神经网络公开课编程练习1 The perceptron learning algorithm
  3. linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁
  4. 用Socket 打造跨语言跨操作系统的网络MORPG游戏(二)
  5. JDBC Druid式link
  6. 双线性插值算法c 语言实现,双线性插值 - CristianoC的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 《大数据》第一届编委会顾问委员会议圆满召开
  8. 超过 40 款很有用而且很新的 jQuery 插件
  9. c语言大地坐标转空间直角坐标,大地坐标转换直角坐标的C++代码(高斯克吕格投影)...
  10. 香农编码的gui编码_香农编码
  11. ajax直接发PUT,DELETE请求报错500
  12. AP(接入点)模式、Router(无线路由)模式、Repeater(中继)模式、Bridge(桥接)模式、 Client(客户端)模式
  13. SAS(十二)PROC步
  14. 向内看 —— 自恋者的局限
  15. fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统
  16. c++课程设计自助点餐系统
  17. 商业分析师应如何构建一个商业故事
  18. ZYNQ有两个CPU?(二)——OCM共享内存
  19. (转)如何彻底的卸载anaconda(包括配置文件)
  20. Web大学生网页作业成品——仿腾讯游戏官网网站设计与实现(HTML+CSS+JavaScript)

热门文章

  1. Java基础学习笔记二十四 MySQL安装图解
  2. C++ 对象间通信框架 V2.0 ××××××× 之(五)
  3. RMI 自己创建的 过程
  4. Linux下screen的简单介绍
  5. cmake 学习笔记(三)
  6. Python实现AI贪吃蛇
  7. 在一个字符串中找到第一个只出现一次的字符, 并返回它的位置
  8. 计算机中dhcp服务器怎么找,如何查找网络中其他非法 DHCP 服务器Unix系统 -电脑资料...
  9. sonar jacoco 覆盖率为0_接口测试代码覆盖率(jacoco)方案分享
  10. 【亲测有效】macOS无法验证此App不包含恶意软件