System Verilog线程——fork join的理解使用
本文参考绿皮书第七章,线程及其线程间的通信,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的理解使用相关推荐
- (40)System Verilog线程停止(disable fork)
(40)System Verilog线程停止(disable fork) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程停止(di ...
- (38)System Verilog线程并行执行(fork-join_none)
(38)System Verilog线程并行执行(fork-join_none) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程并 ...
- (39)System Verilog线程停止(disable)
(39)System Verilog线程停止(disable) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程停止(disable ...
- (37)System Verilog线程并行执行(fork-join_any)
(37)System Verilog线程并行执行(fork-join_any) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程并行 ...
- (36)System Verilog线程并行执行(fork-join)
(36)System Verilog线程并行执行(fork-join) 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog线程并行执行(f ...
- System Verilog 线程间的通信——事件,信箱与旗语
本文参考绿皮书第七章节,主要介绍System Verilog线程间通信的方式与基本的使用.包括事件,mailbox,semaphore.简而言之,事件可以实现线程间的通信,mailbox用于线程间的数 ...
- System Verilog线程与通信
在测试平台的环境里,大多数语句块被模拟成事务处理器,并运行在各自的线程thread(进程process)里. 线程:SV的调度器就像交通警察,总是不停地选择下一个要运行的线程. 线程之间通信:解决环境 ...
- Java线程Fork/Join思想及实现
最近在看线程这一块的东西,所以之前的那篇文章就是用来记录的,但看起来好简单的样子,哈哈哈! 这两天看的是Fork/Join 分而治之的思想,Doug Lea大师的JUC还是挺强的,学并发编程应该没有人 ...
- Verilog中fork...join 的用法
特点 中间的语句并行执行:(延时不累加) 不能用于综合: 代码 module signal_gen; reg wave; parameter cycle = 5; initial beginforkw ...
最新文章
- 基于HTML5的Google水下搜索
- 回调函数与Delphi的事件模型
- Stream 和Byte[] 之间的转换
- 部分 CM11 系统 Android 平板执行植物大战僵尸 2 黑屏的解决的方法
- Hibernate Mysql 写入中文乱码 解决方法
- (需求实战_01) SpringBoot2.x 整合RabbitMQ_生产端
- 解决dropbear在busybox中使用无法使用本地用户登录问题
- 初级网优工程师需要符合什么标准?华为初级认证重点知识!
- 小和尚打水问题_老和尚和小和尚打水问题
- bzoj4134 ljw和lzr的hack比赛 trie树合并
- Cisco交换机配置VTP
- 计算商品总金额以及购物券总金额
- 【数据分析】基于时间序列的预测方法(2021-01-08)时间序列预测
- GNS3 思科(Cisco)PIX虚拟防火墙简单配置
- 动态向下箭头,实现整屏翻页
- 搭建自己的frp服务器
- linux安装Node.js(详细)Node.js安装教程
- 局域网计算机配置扫描系统,fly42局域网计算机配置检测系统
- htc 手机解锁 unlock bootloader
- 一款能统计能存储日志设置超时时间的ping工具