电子说
经过远程的事故回放,可以说情况是非常明确的,这个代码的互连结构就是这么个典型结构:
如果用代码表示呢,大概其就是这样:
assign vid_in = u_tx_if.valid;
assign data_in = u_tx_if.data;
initial begin
force vid_in = 1'b0;
end
然后肇事者做个了什么操作呢,他去对RTL的接口进行了force。说句题外话,讲真的其实个人是不太理解在环境与RTL进行互连的时候为什么会有force操作的,在我看来assign是完成能够互连任务的。
唯一一种我能想到的场景就是RTL分别例化在BT和SST环境时,为了省力气不想重新做互连结构所以通过force的方式进行驱动,除此之外不太能理解force的出现了。
还有一个原因让我一直避免force,刚毕业的时候有大佬和我讲,force、callback和宏是验证环境里的三口“毒品”,用起来虽然很爽能快速的达到目的但是无异于饮鸩止渴,给环境带来了很大的不确定和不可控风险。
扯远了,回到刚刚的问题,肇事者对RTL的接口进行了force,而后出现的现象就是,monitor通过u_tx_if采样时还是采样到了1也就是driver驱动的数值而不是force在接口上的数值。
为什么还会采样到1呢?显然这里犯了一个形而上学的bug,仿真工具只是在模拟真实电路的行为,不是真的在内部搭了一个电路,不是说通过assign a = b之后a和b就真的通过一根线给连在一起绑在一艘船上了!仿真时只会把assign等号右边的值u_tx_if.valid赋值给左边,不会把左边的vid_in赋值给右边啊:
那你mon连接的是u_tx_if,必然能够采样到drv本身驱动到interface上的值啊!
全部0条评论
快来发表一下你的评论吧 !