System Verilog视频学习笔记(5)- Concurrency

来源:互联网 发布:mac os x10.10.5迅雷 编辑:程序博客网 时间:2024/06/15 02:17

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并发执行

线程和子线程

 

3Join选项

图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的用法,

0 0
原创粉丝点击