这是一个我在工作中遇到的问题,简单记录一下解决方法,方便以后回顾,或者能够帮助到陷入相同困境的同学。
首先看一下interface部分的代码,可以更直观的看到cb和clk分别是什么位置:
interface stream_if(input bit clk, input bit rst_n);
...
clocking cb @(posedge clk);
...
endclocking
endinterface
简单来说就是在driver中发送激励时,使用了固定次数的循环,其中需要添加时钟保证发送的激励和rtl的时钟可以对上。比如语句:
@vif.cb;
又或者:
@vif.clk;
这两者都能帮助driver与rtl或者说interface进行同步,但是又有不同,cb(clocking block)仅会由上沿触发(或者说根据这个clocking block的敏感列表),而clk的双沿均会触发,错误地使用它们会使激励的发送节奏过快/过慢,导致循环不能正确结束,卡住整个用例的进程。
如果使用了循环,又出现了用例卡死,不妨检查一下clocking block的相关代码~