本文介绍了在模拟过程中,为什么触发器在转换之前取值,而条件(IF)语句在转换之后取值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
正如您在下面的光标中看到的那样,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
。
这篇关于在模拟过程中,为什么触发器在转换之前取值,而条件(IF)语句在转换之后取值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!