当前位置:网站首页>【数字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 forkdisable 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...joinfork...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
边栏推荐
猜你喜欢

Bye, Dachang! I'm going to the factory today

【數字IC驗證快速入門】26、SystemVerilog項目實踐之AHB-SRAMC(6)(APB協議基本要點)

写一篇万字长文《CAS自旋锁》送杰伦的新专辑登顶热榜

Unity之ASE实现全屏风沙效果

CTFshow,信息搜集:web8

CTFshow,信息搜集:web2

Ctfshow, information collection: Web3

Change win10 Screensaver
![[data mining] visual pattern mining: hog feature + cosine similarity /k-means clustering](/img/a4/7320f5d266308f6003cc27964e49f3.png)
[data mining] visual pattern mining: hog feature + cosine similarity /k-means clustering

【数据挖掘】视觉模式挖掘:Hog特征+余弦相似度/k-means聚类
随机推荐
【數據挖掘】視覺模式挖掘:Hog特征+餘弦相似度/k-means聚類
Introduction of mongod management database method
Ctfshow, information collection: web8
[server data recovery] a case of RAID data recovery of a brand StorageWorks server
Configure mongodb database in window environment
Do you know the relationship between the most important indicators of two strong wind control and the quality of the customer base
2022年5月互联网医疗领域月度观察
Ctfshow, information collection: Web3
Read PG in data warehouse in one article_ stat
leetcode 241. Different Ways to Add Parentheses 为运算表达式设计优先级(中等)
[quick start of Digital IC Verification] 22. Ahb-sramc of SystemVerilog project practice (2) (Introduction to AMBA bus)
【跟着江科大学Stm32】STM32F103C8T6_PWM控制直流电机_代码
CTFshow,信息搜集:web4
STM32F103C8T6 PWM驱动舵机(SG90)
【OBS】RTMPSockBuf_Fill, remote host closed connection.
使用Scrapy框架爬取网页并保存到Mysql的实现
什么是数据泄露
Lidar knowledge drops
Promoted to P8 successfully in the first half of the year, and bought a villa!
jacoco代码覆盖率