Verilog带异步复位DFF串行比较器输出未知X状态原因求解
问题根因分析
- 复位信号有效时长不足:testbench中
reset从0跳变到1没有设置任何延时,相当于复位脉冲宽度为0,仿真器无法识别到有效的复位事件,导致异步复位逻辑没有生效,内部存储节点q0_p/q0_n/q1_p/q1_n初始值均为未知态X,且会通过组合逻辑环路持续传播,无法被刷新。 - 门级连续赋值实现的D触发器存在纯组合逻辑环路,事件驱动仿真时若时序匹配不当也会导致X态无法消除。
修复方案
1. 修改testbench复位逻辑
给复位信号留出足够的有效保持时间,确保内部节点完成复位状态赋值,将testbench中原复位代码:
reset = 0; reset = 1;
修改为:
reset = 0; #2 reset = 1; // 保持复位有效2个时间单位,覆盖一个时钟周期
修改完成后再运行仿真,输出即可退出X态,正常输出比较结果。
2. 可选优化:替换门级DFF为行为级描述
如果不需要严格按照指定门级电路实现,推荐用标准行为级异步复位DFF写法,可彻底避免组合环路和仿真竞争问题:
reg q0_p, q0_n, q1_p, q1_n; always @(posedge clk or negedge reset) begin if(!reset) begin q0_p <= 1'b0; q0_n <= 1'b1; q1_p <= 1'b0; q1_n <= 1'b1; end else begin q0_p <= d0; q0_n <= ~d0; q1_p <= d1; q1_n <= ~d1; end end
内容的提问来源于stack exchange,提问作者user14572697
相关产品推荐
相关产品推荐

