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

Can a sequential always block be triggered by a short pulse from a combi block

顺序总是块是否可以由来自组合块的短暂脉冲触发?

我试图通过分配一个值并将值设置回 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

我希望通过将 1 分配给 pulse_trigger 来激活 "always@(pulse_trigger)" 块,但在我的 VCS 模拟中,情况似乎并非如此。

可能是因为脉冲触发在同一个组合块中赋值1和未赋值1,仿真时间为0,所以pulse_trigger可能看起来没有改变值。或者此方法应该触发 "always@(pulse_trigger)" 并执行“...某些代码第 2 部分...”,因为我正在查看错误的值?

在 verilog 模拟中,一次只能评估一个 always 块。因此,在您的 always_comb 完成之前,无法评估其他 always 块。因此,模拟不会检测到 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.

内是不允许的

结果不确定。编写 SystemVerilog 标准是为了让仿真器可以随时在独立进程之间自由跳转。但大多数等待事件或时间控制在跳转到另一个之前暂停进程。

如果要保证触发,请在对 pulse_trigger 的第二个赋值中使用 non-blocking 赋值或使用命名事件。

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