当前位置:网站首页>【数字IC验证快速入门】18、SystemVerilog学习之基本语法5(并发线程...内含实践练习)
【数字IC验证快速入门】18、SystemVerilog学习之基本语法5(并发线程...内含实践练习)
2022-07-07 13:22:00 【luoganttcc】
导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。
文章目录
一、内容概述
- 逻辑仿真工具的并发操作特性
- 线程:
fork...join | join_any | join_none
wait fork
disable fork
二、逻辑仿真工具的并发操作特性
2.1、并发性含义
- 对于所有的并发线程,在仿真工具的当前仿真时间内,安排好的事件在仿真步进到下一个仿真时间之前都会执行完成
2.2、并发线程执行
- 当一个线程执行时,只有遇到
wait
语句才会停止- 有正在执行的线程产生的子线程按照队列排序执行
- 当正在执行的线程遇到等待语句时,在队列中的
ready
状态的线程可以执行 - 当所有的线程进入
wait
状态时,仿真时间更新 - 等待语句的例子:
@(router.cb);
wait(var_a == 1);
##1 router.cb.din <= 4’hf;
join_any;
join
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2.3、并发线程执行模式
当一个线程执行时,其他所有的线程进入队列等待
READY
- 表示在当前仿真时间内执行的线程WAIT
- 表示语句被阻塞(线程不能执行),当遇到等待条件后可以继续执行
当正在执行的线程进入
WAIT
状态时,线程进入到WAIT
序列,下一个READY
状态的线程继续执行当所有的线程进入到
WAIT
状态时,仿真时间步进到下一个仿真周期
三、并发线程 thread
3.1、语句集合
Veilog
有典型的并发语句集合initial
语句:在整个仿真时间内只执行一次,initial 语句之间都是并发的always
语句:可以对组合电路和时序电路进行建模,always语句之间都是并发的assign
语句:可以对组合电路进行建模,assign 语句之间都是并发的begin...end
:语句从上到下,顺序执行fork...join
:语句并行执行,与语句顺序无关
fork...join
fork...join
语句块可以创建并行执行的进程;两个fork...join
在initial
中begin..end
之间,两个fork...join
是串行的关系,如果两个fork...join
两个外围又是fork...join
,那么两个fork...join
是并行的。
3.2、fork-join
创建并发线程
- 使用
fork-join
语句创建并发线程
int a, b, c;
fork
statement0; //线程1
begin //线程2
statement1;//线程2.1
statement2;//线程2.2
end
join | join_any | join_none
statement
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
fork-join
中的线程1和线程2是并行执行的fork-join
语句中的封装在begin-end
中的语句会形成单一的子线程(线程2.1
和线程2.2
),并按照语句的顺序,从上往下顺序执行- 并发线程没有固定的先后执行顺序
- 所有子线程共享父线程的变量
3.3、join
选项
注:这里父线程指的是
for...join
语句块之外下面的线程
fork...join
(与的关系)- 当所有的子线程执行完成后,父线程才会继续执行
- 在
fork...join
语句块中,可以使用begin...end
语句块封装一个独立的线程,该线程中的所有语句是顺序执行的
fork...join_any
(或的关系)- 当
fork...join_any
语句块中的任何一个子线程完成之后,父线程继续执行
- 当
fork...join_noe
- 父线程与for语句块中的子线程是并行执行的
- 当父线程执行一个阻塞语句后,子线程才开始执行(父线程先执行)
fork...join
和begin...end
例子
fork...join_any
和begin...end
例子
fork...join_none
和begin...end
例子
Q:上面的这些语句前都有标注时间单位,那如果一些语句前面没有时间单位,fork
语句如何执行呢?
- A:没有时间单位,这些语句的先后执行顺序在编译阶段就可以确定,编译阶段确定之后在实际运行时就是顺序执行。【实际工程肯定是有时间单位的!】
3.4、并发线程控制
wait fork
- 等待所有的
fork
并发进程执行完毕 - 在执行父线程之前,确保所有的
fork
并发子线程执行完成 - 等待所有的
fork
并发子线程全部执行完成
- 等待所有的
如果没有
wait fork
,exec5();需要等到fork...join_any
中任何一个执行完毕后后执行,而fork...join_none
需要等到exec5()
执行完毕后才去执行。disable fork
- 停止掉所有并发子线程的执行
3.5、测试题
- A: 2个;B:2个;C:1个;D:1个
- 不能正常仿真:线程1时钟在仿真0时刻行为,线程2是在5个时间单位后,把a变成5,线程是不会仿真到第5个时间单位!
- a = 4;b = 8;
- 虽然打印结果来看是并行,但是仿真器还做不到完全并行,下面的还是可以用上面的数值的!(有微小的
δ
时间差)
- a = 7; b = 4;
- 一般我们在工程上不会在for循环里使用
fork...join
- 这个错误了解即可!
X、实践练习
X.1、fork...join/join_any/join_none
Demo
module thread(); initial begin fork // Thread 1 begin #6; $display("******@%0t, fork join sub thread 1 begin", $time); end // Thread 2 begin #5; $display("******@%0t, fork join sub thread 2 begin", $time); end join $display("******@%0t, fork join father thread begin", $time); #20; fork // Thread 1 begin #6; $display("******@%0t, fork join_any sub thread 1 begin", $time); end // Thread 2 begin #5; $display("******@%0t, fork join_any sub thread 2 begin", $time); end join_any $display("******@%0t, fork join_any father thread begin", $time); #20; fork // Thread 1 begin #6; $display("******@%0t, fork join_none sub thread 1 begin", $time); end // Thread 2 begin #5; $display("******@%0t, fork join_none sub thread 2 begin", $time); end join_none $display("******@%0t, fork join_none father thread begin", $time); end endmodule
******@5000, fork join sub thread 2 begin ******@6000, fork join sub thread 1 begin ******@6000, fork join father thread begin ******@31000, fork join_any sub thread 2 begin ******@31000, fork join_any father thread begin ******@32000, fork join_any sub thread 1 begin ******@51000, fork join_none father thread begin ******@56000, fork join_none sub thread 2 begin ******@57000, fork join_none sub thread 1 begin
边栏推荐
- 【深度学习】图像超分实验:SRCNN/FSRCNN
- 微信小程序 01
- Discussion on CPU and chiplet Technology
- How to enable radius two factor / two factor (2fa) identity authentication for Anheng fortress machine
- 2. 堆排序『较难理解的排序』
- Introduction of mongod management database method
- Ctfshow, information collection: web9
- CTFshow,信息搜集:web4
- CTFshow,信息搜集:web2
- 使用Scrapy框架爬取网页并保存到Mysql的实现
猜你喜欢
MySQL installation configuration 2021 in Windows Environment
Niuke real problem programming - day13
asp. Netnba information management system VS development SQLSERVER database web structure c programming computer web page source code project detailed design
银行需要搭建智能客服模块的中台能力,驱动全场景智能客服务升级
Ctfshow, information collection: web2
如何在opensea批量发布NFT(Rinkeby测试网)
CTFshow,信息搜集:web2
How to enable radius two factor / two factor (2fa) identity authentication for Anheng fortress machine
[make a boat diary] [shapr3d STL format to gcode]
【服务器数据恢复】某品牌StorageWorks服务器raid数据恢复案例
随机推荐
2.Golang基础知识
Ctfshow, information collection: web4
[机缘参悟-40]:方向、规则、选择、努力、公平、认知、能力、行动,读3GPP 6G白皮书的五层感悟
CTFshow,信息搜集:web7
Ctfshow, information collection: web2
Runnable是否可以中断
Pat grade a 1103 integer factorizatio
IDA pro逆向工具寻找socket server的IP和port
【數字IC驗證快速入門】26、SystemVerilog項目實踐之AHB-SRAMC(6)(APB協議基本要點)
最安全的证券交易app都有哪些
【数字IC验证快速入门】29、SystemVerilog项目实践之AHB-SRAMC(9)(AHB-SRAMC SVTB Overview)
Qu'est - ce qu'une violation de données
Basic knowledge sorting of mongodb database
Ctfshow, information collection: web5
"Baidu Cup" CTF competition 2017 February, web:include
【跟着江科大学Stm32】STM32F103C8T6_PWM控制直流电机_代码
全日制研究生和非全日制研究生的区别!
What is the process of ⼀ objects from loading into JVM to being cleared by GC?
Briefly describe the working principle of kept
Ctfshow, information collection: web7