【发布时间】:2017-08-31 21:38:44
【问题描述】:
我想在零时间执行总是阻塞。 例如下面的代码不会在零时间执行。
always @* begin
//functional code
end
我在最后移动了敏感度列表,以便代码在零时间执行,
always begin
//funcitonal code
@*;
end
此代码在时间为零时执行,但在时间零之后根本不执行,即使块内使用的输入发生变化也是如此。例如看下面的代码及其输出:
module AlwaysTimeZeroTest_v();
reg reg_A;
initial begin
$display ("I'm in Initial begin block \tTime=%f, reg_A=%b\n",$stime,reg_A);
#1
reg_A=1'bZ;
#1
reg_A=1'b1;
#1
reg_A=1'b0;
#1
reg_A=1'bZ;
#5 $finish;
end
always @* begin
$display ("I'm in Non-time Zero always block\tTime=%f, reg_A=%b\n",$stime,reg_A);
end
always begin
$display ("I'm in time Zero always block \tTime=%f, reg_A=%b\n",$stime,reg_A);
@*;
end
endmodule
输出:
**I'm in Initial begin block Time=0.000000, reg_A=x
I'm in time Zero always block Time=0.000000, reg_A=x
I'm in Non-time Zero always block Time=1.000000, reg_A=z
I'm in Non-time Zero always block Time=2.000000, reg_A=1
I'm in Non-time Zero always block Time=3.000000, reg_A=0
I'm in Non-time Zero always block Time=4.000000, reg_A=z**
通过 $finish(1) 在时间 9 NS + 0 完成模拟
谁能解释为什么代码中的秒总是阻塞在时间为零之后根本不执行?
有没有一种方法可以实现总是阻塞,以便它在零时间执行而不使用初始块? (类似于 SV 中的 always_comb?)
【问题讨论】: