组合块的短脉冲是否可以触发顺序始终块
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 @
块,然后调用函数而不是触发事件。
顺序总是块是否可以由来自组合块的短暂脉冲触发?
我试图通过分配一个值并将值设置回 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 @
块,然后调用函数而不是触发事件。