System Verilog视频学习笔记(5)- Concurrency
Concurrency(并发操作)
内容来自启芯-System Verilog视频
==============================================================
目录结构:
1、仿真器中的Concurrency(并发操作)
2、并发线程产生fork-join
3、Join选项
4、等待子线程结束
5、调试
6、总结
==============================================================
本章目标:
掌握并发操作概念和相关语句
1、仿真器中的并发操作
图1、并发操作
2、并发线程产生fork-join
并发线程产生关键字fork-join
例子:
int a, b, c;
fork
statement0;
begin
statement 1;
statement 2;
end
join | join_any | join_non
statement 3;
线程statement0和线程statement1/2和线程statement3并发执行
线程和子线程
3、Join选项
图2、Join选项
fork-join:在statement3执行前所有的子线程必须完成
fork-join_any:fork-join_any内任意一个子线程执行完成,statement3就可执行
fork-join_none:statement3先执行,子线程排队不执行,直到父线程等到wait语句或者完成才执行。
线程执行
执行模式:
(1)Ready:当前将被执行
(2)wait:当执行的线程进入等待状态,将执行下个Ready的线程
图3、线程执行模型
图4、上述程序是否执行?
答案:不能执行
怎样才能执行?需要在for循环中进行时间更新,否则造成程序死锁。
修改如下:
图5、修改后可以执行的程序
图6、上图仿真在0时刻执行退出,why?
send是子线程,父线程initial…begin,在父线程没有执行完毕,父线程没有进行时间更新,子线程#1进入等待状态,等父线程到执行到end后,仿真执行结束,等待的进程没有被执行,怎么进行时间更新?用好automatic参数
4、等待子线程结束
wait fork:等所有子线程结束
disable fork:结束所有子线程
5、调试
%m:打印出文件结构
$display():显示调试信息
6、总结
本章主要讲并发操作和一些错误,课后掌握好fork-join的用法,