force之后,采样时怎么没生效呢?

电子说

1.2w人已加入

描述

RTL

经过远程的事故回放,可以说情况是非常明确的,这个代码的互连结构就是这么个典型结构:

RTL

如果用代码表示呢,大概其就是这样:

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赋值给右边啊:

RTL

那你mon连接的是u_tx_if,必然能够采样到drv本身驱动到interface上的值啊!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分