可以从组合块发出的短时脉冲触发顺序始终块吗?
我试图通过分配一个值并将该值设置回0来触发Always块,以尝试触发顺序的Always块,但无济于事,以下是伪代码
always_comb begin
...some code...
pulse_trigger = 1;
load_var= driver_var // assigning some values
pulse_trigger = 0;
...some code...
end
always @(pulse_trigger)begin
...some code part 2...
end
我希望通过为pulse_trigger分配1来激活“ always @(pulse_trigger)”块,但是在我的VCS仿真中似乎并非如此。
这可能是因为在同一组合块中为脉冲触发器分配了1,而未分配1,这花费了0个模拟时间,因此pulse_trigger似乎没有更改的值。还是该方法应该触发“ always @(pulse_trigger)”并执行“ ...某些代码第2部分..”,因为我在看错误的值?
答案 0 :(得分:3)
在Verilog仿真中,一次只能评估一个Always块。因此,在您的always_comb
完成之前,无法评估任何其他Always Block。因此,模拟不会检测到pulse_trigger
的更改(因为所有更改都发生在单个always块内。
您可以通过添加延迟来进行类似的操作(假设这不是可合成的代码):
always @* begin
pulse_trigger = 1;
load_var= driver_var // assigning some values
#1 // << this will stop execution of the block for 1 time unit and allow others.
pulse_trigger = 0;
end
但是,上述代码不可可综合,但可以成为测试平台的一部分。
另外,always_comb
内也不允许。
答案 1 :(得分:1)
结果不确定。编写SystemVerilog标准的目的是使仿真器可以随时在独立进程之间自由切换。但是大多数都在等待事件或时间控件暂停该过程,然后再跳转到另一个事件或时间控件。
如果要保证触发,请在pulse_trigger
的第二个分配中使用非阻塞分配,或使用命名事件。
always @* begin
pulse_trigger = 1;
load_var= driver_var // assigning some values
pulse_trigger <= 0; // adds a delta cycle or <= #1 delay without blocking the process
end
更好的方法是用函数声明替换第二个always @
块,然后调用函数而不是触发事件。