同步逻辑中非阻塞赋值的信号波形异常问题咨询
Verilog时序电路仿真问题解答
原代码
module gen_bits(input clk, input clear, input ld, input in, output reg[7:0] out); always @(posedge clk) begin if (clear) out <= 8'b00000000; else if (ld) out <= (2 * out + in); else out <= out; end endmodule
疑问解答
1. 25ns时clear=1但out仍为'XX'的原因
Verilog中reg类型变量默认初始值为X(未知状态),而该电路是上升沿触发的时序电路,所有对out的赋值仅在clk上升沿触发执行:
- 若25ns时刻无
clk上升沿:即使clear=1,赋值语句也不会执行,out保持初始的X状态。 - 若25ns时刻是
clk上升沿:需检查clear信号是否满足建立/保持时间要求。如果clear在clk上升沿附近才变化(setup时间不满足),仿真器可能采样到不稳定信号,导致赋值未触发。
2. 125ns时ld=0但out变为f1的原因
核心是对非阻塞赋值机制和时序采样规则的误解:
- 非阻塞赋值的执行逻辑:非阻塞赋值
<=的更新动作在clk上升沿的调度阶段完成,寄存器实际采样的是clk上升沿前一刻的ld状态。你看到的125ns时刻ld=0,可能是在时钟沿之后才变化的——若上升沿前ld=1,电路会执行out <= 2*out + in的计算(比如out此前为0x78,2*0x78=0xF0,加in=1后就是0xF1,与你看到的结果吻合)。 - 信号时序违规:如果
ld信号的变化时间距离clk上升沿过近(违反setup/hold时间),仿真器会采样到错误的ld值,误触发赋值操作。 - 波形显示误差:部分仿真工具的波形显示会对齐信号变化与时钟沿,可能导致你误判
ld在时钟沿时的状态。建议放大125ns附近波形,查看clk上升沿瞬间ld的实际值。
内容的提问来源于stack exchange,提问作者qian li
相关产品推荐
相关产品推荐

