如何在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.
相关产品推荐
相关产品推荐

