Verilog D触发器的输出不符合预期

Verilog D触发器的输出不符合预期,verilog,modelsim,Verilog,Modelsim,它是异步重置。D触发器当我将复位从一改为零时,它不会立即将输出从零提高到一。但当我添加@always(posedge clk或posedge reset或nedge reset)时,它会立即改变 Verilog: 模块dff\u异步\u复位( 数据,//数据输入 时钟,//时钟输入 重置,//重置输入 q//q输出 ); //-----------输入端口--------------- 输入数据、时钟、复位; //-----------输出端口--------------- 输出q; //---

它是异步重置。D触发器当我将复位从一改为零时,它不会立即将输出从零提高到一。但当我添加@always(posedge clk或posedge reset或nedge reset)时,它会立即改变

Verilog:
模块dff\u异步\u复位(
数据,//数据输入
时钟,//时钟输入
重置,//重置输入
q//q输出
);
//-----------输入端口---------------
输入数据、时钟、复位;
//-----------输出端口---------------
输出q;
//------------内部变量--------
reg q;
//-------------代码从这里开始---------
始终@(posedge clk或posedge重置)
开始
如果(重置)
q=0;
其他的

q它完全按照您的要求执行:模拟一个带异步高电平复位的触发器。代码中的以下行

always @ (posedge clk or posedge reset)
说明:“当
clk
进行转换
0-->1
reset
进行转换
0-->1
时,执行此程序块”。换句话说,当
reset
进行转换
1-->0
时,将不计算此始终块

您的值
q
只会在
clk
的正边缘更新,这正是您想要设计触发器的地方

当您将
nedge reset
添加到您的灵敏度列表中时,当您退出重置状态(即逻辑中的
1-->0
)时,它确实会立即改变。然而,这通常是不需要的。相当地引自上述网站:

大多数设计的建模方式都需要异步 重置断言和同步反断言。大多数人的要求 这些设计中有:

  • 当重置被断言时,它传播到所有设计;无论时钟是否在切换,都会使其处于重置状态;i、 e.断言应 异步
  • 当复位解除时,等待时钟边缘,然后根据FSM(有限状态机)将系统移动到下一个状态;即 取消评估应该是同步的

“”但是在这张图片中,重置的解除是与时钟一起的,为什么输出没有转到1,尽管clk是1,D是1啊,我最初错过了你问题中的图片!原因可能是您定义时钟信号的方式。请看一下Sutherland&Mills的《Gotcha 29》。本章描述了由于使用非阻塞分配生成时钟而可能出现的竞争条件。(此外,通常应在完整的时钟周期内保存数据。)
always @ (posedge clk or posedge reset)