Vivado仿真中寄存器/触发器赋值未观测到时钟周期延迟问题咨询
问题原因解释
1. 测试平台中两个时钟边沿完全对齐
你当前写的测试代码中,clk(10ns周期)和ext_sample_clk(100ns周期)的跳变时刻完全重合:
clk跳变时刻为:0ns(高)、5ns(低)、10ns(高)、15ns(低)...ext_sample_clk跳变时刻为:0ns(高)、50ns(低)、100ns(高)、150ns(低)...
两者的上升沿在100ns、200ns等时刻完全重叠,从时序上满足了触发器的跳变沿采样条件。
2. Verilog仿真调度机制导致采样到新值
Verilog仿真的事件调度有明确的分区顺序:
- 主动事件区:执行阻塞赋值(
=)、连续赋值、原语输入更新等操作 - 非阻塞事件区:执行非阻塞赋值(
<=)更新
你生成ext_sample_clk用的是阻塞赋值,会在主动事件区先完成值的更新;而触发器采样用的是非阻塞赋值,在同一个时间步的非阻塞事件区才执行。因此当posedge clk触发时,采样到的ext_sample_clk已经是当前时刻跳变后的新值,最终波形看起来就像ext_sample_clk_r1没有延迟。
额外说明和修正建议
- 上述现象仅出现在仿真场景中:实际硬件里两个独立生成的时钟不可能完全边沿对齐,你当前的跨时钟域单级采样逻辑存在亚稳态风险,建议用两级同步寄存器先同步
ext_sample_clk到clk域,再做边沿检测生成脉冲。 - 如果要在仿真中复现你预期的1拍延迟,只需要给
ext_sample_clk的生成加一个微小的初始偏移即可,比如修改ext_sample_clk的生成逻辑:
调整后两个时钟边沿不再对齐,仿真时就能看到initial #1; // 偏移1ns,避免边沿对齐 always begin ext_sample_clk = 1'b1; #50; ext_sample_clk = 1'b0; #50; endext_sample_clk_r1比ext_sample_clk晚1个clk周期的效果。
内容的提问来源于stack exchange,提问作者user2532296
相关产品推荐
相关产品推荐

