2016-07-27 120 views
1

我正嘗試使用下面的代碼在verilog中生成波形,但結果與預期不符。在verilog中生成自定義波形

initial begin 
    d = 1'b0; 
#8 d <= 1'b1; 
#15 d <= 1'b0; 
end 

其初始值爲0(OK),在t = 8,它的1(行),但在t = 23,其爲0。相反,我希望它是0在t = 15相對於T = 0而不是t = 8(即前面的陳述)。

有沒有辦法做到這一點?我嘗試過交換阻塞和非阻塞任務,但沒有運氣!

感謝,
開發

回答

2

你可以這樣做:

initial fork 
    d = 1'b0; 
#8 d = 1'b1; 
#15 d = 1'b0; 
join 

所有內部fork join語句將被執行同時

或者你可以這樣做:

initial  d = 1'b0; 
initial #8 d = 1'b1; 
initial #15 d = 1'b0; 

顯然,三個初始塊將同時進行。

如果你真的想從程序(順序)代碼附表3點的事件,那麼你可以這樣做:

initial begin 
    d =  1'b0; 
    d <= #8 1'b1; 
    d <= #15 1'b0; 
end 

它使用內部分配延遲與非阻塞賦值在一起。

http://www.edaplayground.com/x/4MiS

+0

這是否意味着使用賦值間延遲推進仿真時間? –

+0

@devvaibhav我不確定你的意思。然而,IEEE1800-2012的第9.4.5節(「內部分配時間控制」)指出:「分配內延遲或事件控制應延遲將新值分配到左側,但右側表達應在延遲之前進行評估,而不是在延遲之後進行評估。「如果您將內部分配延遲添加到非阻塞分配,則執行後立即執行,並在延遲後執行分配。所以,你正在有效地安排將來某個時間發生的事件。 –