2016-07-27 124 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节(“内部分配时间控制”)指出:“分配内延迟或事件控制应延迟将新值分配到左侧,但右侧表达应在延迟之前进行评估,而不是在延迟之后进行评估。“如果您将内部分配延迟添加到非阻塞分配,则执行后立即执行,并在延迟后执行分配。所以,你正在有效地安排将来某个时间发生的事件。 –