天天看點

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);

繼續閱讀