在仿真过程中,为什么触发器取转换前的值,而条件(if)语句取转换后的值?
During simulation, why do flip-flops take the value preceding the transition while conditional(if) statements take the value after the transition?
正如您在下面的游标中看到的那样,if 语句在转换之后查看(它看到 rst = 0 并因此设置等于 in)而不是看到 rst = 1。
但是也可以看出 c 在转换之前取了 a 的值。
我想知道这是为什么。假设你想用一个在时钟周期上延迟的使能门控一个寄存器,那么你不能使用 if (enable_delayed) 因为(理想情况下)下降转换将发生在时钟的上升沿,因此不是在模拟中检测到。
我没有成功地在线找到我的问题。很难解释和搜索。谢谢您的帮助。
代码:
module project_test
( input logic clk, rst,
input logic in,
output logic a,
output logic b,
output logic c
);
always@(posedge clk)
if(rst) a <= 1'b0;
else a <= in;
always@(posedge clk)
if(a) b <= a;
always@(posedge clk)
c <= a;
endmodule: project_test
我猜你设置 rst
的时间比你想象的要早,当模块内部的逻辑观察到正 clk
边缘时,它已经 0
。
如果您将 rst
设置为 0
作为 @(posedge clk)
的结果,事情会按您预期的那样工作,但我怀疑 rst
正在更改与 clk
.
并行
在调试这类东西时,我总是试图延迟赋值。也就是说,在您的模块中,将 <=
替换为 <= #1
.
首先是一根线(一个输入端口是一根线,至少在verilog中是这样),所以不断地给它赋值。所以当它在时钟的上升沿被采样时,它的值已经是 0。
另一方面,'a' 是一个 reg(触发器),因此在时钟的上升沿对其进行采样时的值仍然是其先前的值。它的值只会改变'right after the clock'。这就是为什么 'c' 仍然得到 'a' 之前的值。
我认为这就是这里发生的事情。
正如您在下面的游标中看到的那样,if 语句在转换之后查看(它看到 rst = 0 并因此设置等于 in)而不是看到 rst = 1。
但是也可以看出 c 在转换之前取了 a 的值。
我想知道这是为什么。假设你想用一个在时钟周期上延迟的使能门控一个寄存器,那么你不能使用 if (enable_delayed) 因为(理想情况下)下降转换将发生在时钟的上升沿,因此不是在模拟中检测到。
我没有成功地在线找到我的问题。很难解释和搜索。谢谢您的帮助。
代码:
module project_test
( input logic clk, rst,
input logic in,
output logic a,
output logic b,
output logic c
);
always@(posedge clk)
if(rst) a <= 1'b0;
else a <= in;
always@(posedge clk)
if(a) b <= a;
always@(posedge clk)
c <= a;
endmodule: project_test
我猜你设置 rst
的时间比你想象的要早,当模块内部的逻辑观察到正 clk
边缘时,它已经 0
。
如果您将 rst
设置为 0
作为 @(posedge clk)
的结果,事情会按您预期的那样工作,但我怀疑 rst
正在更改与 clk
.
在调试这类东西时,我总是试图延迟赋值。也就是说,在您的模块中,将 <=
替换为 <= #1
.
首先是一根线(一个输入端口是一根线,至少在verilog中是这样),所以不断地给它赋值。所以当它在时钟的上升沿被采样时,它的值已经是 0。 另一方面,'a' 是一个 reg(触发器),因此在时钟的上升沿对其进行采样时的值仍然是其先前的值。它的值只会改变'right after the clock'。这就是为什么 'c' 仍然得到 'a' 之前的值。 我认为这就是这里发生的事情。