本文参考绿皮书第七章,线程及其线程间的通信,Verilog HDL A guide to digital design and synthesis 2nd第七章。主要对于begin…end,fork…join等进行简单总结。然后给出相对应的实例进行理解。有问题欢迎同学指出。

System Verilog线程——fork join的理解使用

  • 概述
  • 顺序块与并发块(Sequential and Parallel Blocks)
    • begin...end块
    • fork...join块
  • fork...join_any与fork...join_none
  • 停止进程disable
  • 附录
    • 线程与进程的关系

概述

在Verilog中,存在组合逻辑与时序逻辑,需要仿真器对于两者进行模拟。因此测试平台需要并发执行某些操作,称之为并发的线程。在verilog中存在begin…end,以及fork…join两中分组方式,用于顺序或者是并发执行。在system vrilog中,引入了fork…join_any以及fork…join_none新的方法用于创建线程。最后解释停止进程。

顺序块与并发块(Sequential and Parallel Blocks)

begin…end块

关键字begin和end用于将语句分组为顺序块。
顺序块具有以下特征:

  • 顺序块中的语句按指定顺序处理。只有在前一条语句完成执行后,才会执行该语句。
  • 如果指定了延迟或事件控制,则该延时或事件与块中的前一条语句完成执行时的模拟时间有关。
    分别举例如下
//案例 1: Sequential block without delay
module
reg x, y;
reg [1:0] z, w;
initial beginx = 1'b0;y = 1'b1;z = {x, y};w = {y, x};
end
endmodule

对应案例 1: Sequential block without delay

//案例2: Sequential blocks with delay.
reg x, y;
reg [1:0] z, w;
initial beginx = 1'b0; //completes at simulation time 0#5 y = 1'b1; //completes at simulation time 5#10 z = {x, y}; //completes at simulation time 15#20 w = {y, x}; //completes at simulation time 35
end

对应案例2: Sequential blocks with delay.

注意这里的仿真时间,对w的赋值时间再35ns处

fork…join块

由关键字fork和join指定的并行块提供了有趣的模拟特征。平行块具有以下特征:
•并行块中的语句并行执行。
•语句的顺序由分配给每个语句的延迟或事件控制来控制陈述
•如果指定了延迟或事件控制,则它与执行块的时间有关进入。
案例1:

module tb();
reg x, y;
reg [1:0] z, w;
initial forkx = 1'b0; //completes at simulation time 0#5 y = 1'b1; //completes at simulation time 5#10 z = {x, y}; //completes at simulation time 10#20 w = {y, x}; //completes at simulation time 20
join
endmodule


注意这里的仿真时间,在20ns已经结束了对w的赋值
案例2:

module tb();
reg x, y;
reg [1:0] z, w;
initial forkx = 1'b0;y = 1'b1;z = {x, y};w = {y, x};
join
endmodule


产生同样波形的原因是存在竞争问题。本例中特意引入了竞争条件。所有语句都在模拟时间0开始。语句的执行顺序未知。如果先执行x=1’b0和y=1’b1,变量z和w将得到值1和2。如果x=1’b0和y=1’b1最后执行,变量z和w将得到值2’bxx和2’bxx。因此,z和w的结果是不确定的,并且取决于模拟器的实现。在模拟时,fork-join块中的所有语句都会立即执行。然而,在现实中,运行模拟的CPU一次只能执行一条语句。不同的模拟器以不同的顺序执行语句。因此,竞争条件是模拟器的限制,而不是fork-join块的限制。

fork…join_any与fork…join_none

前面对于fork的引入是为了更好的理解如下点。
join 父进程会阻塞直到这个分支产生的所有进程结束。
join_any 父进程会阻塞直到这个分支产生的任意一个进程结束。 然后继续执行
join_none 父进程会继续与这个分支产生的所有进程并发执行。在父线程执行一条阻塞语句之前,产生的进程不会启动执行。

简单的测试如下


停止进程disable

关键字disable提供了一种终止命名块执行的方法。disable可用于根据控制信号跳出循环、处理错误条件或控制代码段的执行。禁用块会将执行控制传递给紧随该块之后的语句。对于C程序员来说,这与用于退出循环的break语句非常相似。区别在于break语句只能中断当前循环,而关键字disable允许禁用设计中的任何命名块。
在下面的这个例子中,等待时钟或者是等待到特定信号的下降沿。就会推出这个fork线程。两种写法都是可以的。

task get_payload();pkt2cmp_payload.delete();//清除之前缓存的数据fork begin : wd_timer_forkfork : frameo_wd_timer  @(negedge rtr_io.cb.frameo_n[da]);  //这里是第一个线程(thread)begin                    //begin...end这里是第二个线程startrepeat(100) @(rtr_io.cb);$display("\n%m\n[ERROR]%t Frame signal timed out!\n", $realtime);$finish;end                          //begin...end这里是第二个线程endjoin_any : frameo_wd_timer//disable fork;                   //等待失败,或者是等到下降沿,推出fork join。执行下面的内容disable frameo_wd_timer;       //同disable fork;end : wd_timer_forkjoin

后需要在进行补充吧~

附录

线程与进程的关系

摘自绿皮书第七章绪论注释

System Verilog线程——fork join的理解使用相关推荐

  1. (40)System Verilog线程停止(disable fork)

    (40)System Verilog线程停止(disable fork) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程停止(di ...

  2. (38)System Verilog线程并行执行(fork-join_none)

    (38)System Verilog线程并行执行(fork-join_none) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程并 ...

  3. (39)System Verilog线程停止(disable)

    (39)System Verilog线程停止(disable) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程停止(disable ...

  4. (37)System Verilog线程并行执行(fork-join_any)

    (37)System Verilog线程并行执行(fork-join_any) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程并行 ...

  5. (36)System Verilog线程并行执行(fork-join)

    (36)System Verilog线程并行执行(fork-join) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程并行执行(f ...

  6. System Verilog 线程间的通信——事件,信箱与旗语

    本文参考绿皮书第七章节,主要介绍System Verilog线程间通信的方式与基本的使用.包括事件,mailbox,semaphore.简而言之,事件可以实现线程间的通信,mailbox用于线程间的数 ...

  7. System Verilog线程与通信

    在测试平台的环境里,大多数语句块被模拟成事务处理器,并运行在各自的线程thread(进程process)里. 线程:SV的调度器就像交通警察,总是不停地选择下一个要运行的线程. 线程之间通信:解决环境 ...

  8. Java线程Fork/Join思想及实现

    最近在看线程这一块的东西,所以之前的那篇文章就是用来记录的,但看起来好简单的样子,哈哈哈! 这两天看的是Fork/Join 分而治之的思想,Doug Lea大师的JUC还是挺强的,学并发编程应该没有人 ...

  9. Verilog中fork...join 的用法

    特点 中间的语句并行执行:(延时不累加) 不能用于综合: 代码 module signal_gen; reg wave; parameter cycle = 5; initial beginforkw ...

最新文章

  1. 基于HTML5的Google水下搜索
  2. 回调函数与Delphi的事件模型
  3. Stream 和Byte[] 之间的转换
  4. 部分 CM11 系统 Android 平板执行植物大战僵尸 2 黑屏的解决的方法
  5. Hibernate Mysql 写入中文乱码 解决方法
  6. (需求实战_01) SpringBoot2.x 整合RabbitMQ_生产端
  7. 解决dropbear在busybox中使用无法使用本地用户登录问题
  8. 初级网优工程师需要符合什么标准?华为初级认证重点知识!
  9. 小和尚打水问题_老和尚和小和尚打水问题
  10. bzoj4134 ljw和lzr的hack比赛 trie树合并
  11. Cisco交换机配置VTP
  12. 计算商品总金额以及购物券总金额
  13. 【数据分析】基于时间序列的预测方法(2021-01-08)时间序列预测
  14. GNS3 思科(Cisco)PIX虚拟防火墙简单配置
  15. 动态向下箭头,实现整屏翻页
  16. 搭建自己的frp服务器
  17. linux安装Node.js(详细)Node.js安装教程
  18. 局域网计算机配置扫描系统,fly42局域网计算机配置检测系统
  19. htc 手机解锁 unlock bootloader
  20. 一款能统计能存储日志设置超时时间的ping工具

热门文章

  1. vue中axios访问Java后端跨域问题解决
  2. 在LaTeX中使用BibTeX时的一个问题及其解决:编译PDF不随bib文件更新
  3. 解决setInterval计时器不准的问题
  4. sun.misc.BASE64Encoder找不到的解决方法
  5. 将先前的提交分成多个提交
  6. 使用Git版本控制查看文件的更改历史记录
  7. SpringMVC@RequestMapping请求方法限定与请求参数限定
  8. AT指令:常见的AT命令
  9. mac 图形化安装mysql,mac安装mysql图形化工具?
  10. php无重复字符的最长子串,无重复字符的最长字串问题