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

如何在cocotb中时钟上升沿后无延时正确采样同步加法器输出?

在Cocotb+Xcelium环境下同步采样DUT输出的无延时方案

问题背景

用Cocotb测试同步加法器DUT,输出会在时钟上升沿更新。测试代码中必须插入await Timer(1, units="ns")才能采样到正确的输出值,移除后会读到未更新的旧值,使用的仿真器是Xcelium,希望找到无需硬编码延时的解决方法。

可行解决方案

  • 使用Cocotb内置的ReadOnly()同步点
    Cocotb的仿真事件调度模型中,RisingEdge仅等待时钟沿触发,但DUT的信号更新通常发生在沿之后的delta周期内。ReadOnly()会等待所有仿真事件完成、所有信号都更新到稳定状态后再继续执行,完全可以替代硬编码的延时。

    修改后的测试代码:

    for a_val, b_val in [(5, 10), (100, 50), (255, 1)]:
        dut.a.value = a_val
        dut.b.value = b_val
        await RisingEdge(dut.clk)
        await ReadOnly()  # 等待所有信号更新完成,替代Timer延时
        assert dut.y.value == (a_val + b_val) % 256, f"Mismatch: {dut.y.value} != {a_val + b_val}"
    
  • 调整Xcelium的仿真调度选项
    部分情况下,Xcelium默认的事件调度模式可能导致Cocotb的事件触发与DUT信号更新存在顺序差异。可以尝试在启动仿真时添加-delay_mode zero选项,强制仿真器在时钟沿后立即完成信号更新,消除delta周期的延迟影响。

  • 确认DUT的时序逻辑
    检查同步加法器的RTL代码,确保输出y确实是在时钟上升沿触发的寄存器输出(而非组合逻辑输出,组合逻辑可能存在毛刺或更新时序问题)。如果是组合逻辑输出,建议改为寄存器同步输出,从根源上规范采样时序。


内容的提问来源于stack exchange,提问作者Pierre G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 13:03:21