You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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仿真的事件调度有明确的分区顺序:

  1. 主动事件区:执行阻塞赋值(=)、连续赋值、原语输入更新等操作
  2. 非阻塞事件区:执行非阻塞赋值(<=)更新
    你生成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; 
    end
    
    调整后两个时钟边沿不再对齐,仿真时就能看到ext_sample_clk_r1比ext_sample_clk晚1个clk周期的效果。

内容的提问来源于stack exchange,提问作者user2532296

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:36:03