组合块的短脉冲是否可以触发顺序始终块

时间:2019-05-29 15:20:01

标签: verilog compiler-optimization system-verilog hdl

可以从组合块发出的短时脉冲触发顺序始终块吗?

我试图通过分配一个值并将该值设置回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部分..”,因为我在看错误的值?

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 @块,然后调用函数而不是触发事件。