Blocking
blocking assignment 是用 = 將等號右邊的值assign到等號左邊,會照著code的順序一行一行執行下去,但是是在同一個時間平行的執行。
1 | module tb; |
例子中有兩個initial block,他們會在simulation開始的時候同時執行
Output
1 | # run 1000 |
上面的例子結果都是在t:0輸出,並照著程式碼的順序執行下來
Non-Blocking
Non-Blocking assignment 是用 <= 將等號右邊的值assign到等號左邊,他不會卡住接下來要執行的程式碼。把上面的code全部改成non-blocking的話:
1 | module tb; |
執行結果如下:
1 | # run 1000 |
上面全部的output都印出”xx”,因為在non-blocking右邊(RHS)的statement會先全部被capture起來然後移動到下一個statement,然後這些右邊的值會等到這個timestamp最後才assign到左邊(LHS)。
再一個例子可以如上面第一個initial blocking,a是在timestamp最後才被assign值,所以第一個display的output中a是unknown值,所以會看見a是在第二個display之後才會是AA,相同的道理b也是在第三個display值才會是BB。
1 | module tb; |
1 | # run 1000 |