在模拟过程中,为什么触发器在转换之前取值,而条件(IF)语句在转换之后取值? [英] During simulation, why do flip-flops take the value preceding the transition while conditional(if) statements take the value after the transition?

查看:16
本文介绍了在模拟过程中,为什么触发器在转换之前取值,而条件(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)语句在转换之后取值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆