天天看点

SV线程及线程间通信

1、 在测试平台环境里,大多数语句块被模拟成事务处理器(transaction),运行在各自并发执行的线程里。

2、 线程间通信:event、事件控制、wait语句、mailbox、旗语

3、join none块后语句的执行早于块内的任何语句

4、 构造函数new只对数值进行初始化,并不启动任何线程,二者分开允许在执行transaction之前修改任何变量。

5、线程中的automatic变量。

如果在for循环语句中使用了fork join none,程序program回使用tr来匹配即将到来的事务,且tr的值在下一次循环时改变。所以在并发线程中必须使用automatic变量来保存数值i。否则最终得到的是不断被替换的tr最终数值。

initial begin
for(int i=1;i<4;i++)
    fork
        automatic int k=j;
        $write(k);
    join_none
#0$display;
end
           

或者直接声明 program automatic a;

6、 disablefork线程是停止所在的线程,处于某线程外不能实现终止。

7、 数据交换和控制的同步称为IPC线程间的通信,通过event、旗语、mailbox来完成

8、 在循环中使用事件,如果是wait (a.triggered());这是一个零时延循环,点ing敏感的阻塞语句将会一直触发;@(a),避免零时延循环,只在事件到来之后触发。边沿触发

9、wait fork等待多个线程;对触发事件进行计数来等待多个线程。

10、 mailbox构造函数0或无指定,则信箱无限大。

11、 两个线程之间可以通过mailbox传递信息,mb里存储的是句柄而不是对象

12、 mailbox实现同步:一个定容mb,步调不一致;

定容mb+peek() ,有阻塞但只在put第二个时才阻塞,所以还是早一个trans;

mb+event:通过发送数据后等待握手信号和处理数据后触发握手信号实现同步通信。

两个mb:最常用

mbx.put/get(i);

rst.get/put(k);

继续阅读