SystemVerilog`force`如何工作?

Gau*_*tam 2 verilog system-verilog

我有一个模块层次结构,我试图force在不同的模块接口上获得不同的值.我正在研究一个组件,其任务是将事务注入层次结构中的模块,绕过层次结构中较高层的模块.我想我可以使用force控制信号,以便从更高的模块中脱离驱动器并开始进入感兴趣的模块.所以我一直试图看看力量是如何运作的.完整代码位于http://www.edaplayground.com/x/69PB.特别是,我试图理解initial块内这两个语句的效果:

force u_DataReceiveTop.u_DataReceiveWrap.DataReceiveIfWrp_inst.valid = 1'b0;
force u_DataReceiveTop.valid = 1'b1;
Run Code Online (Sandbox Code Playgroud)

我所期望的价值观是:

u_DataReceiveTop.u_DataReceiveWrap.DataReceiveIfWrp_inst.valid == 0
u_DataReceiveTop.valid == 1
Run Code Online (Sandbox Code Playgroud)

但我从波浪中看到:

u_DataReceiveTop.u_DataReceiveWrap.DataReceiveIfWrp_inst.valid == 1
u_DataReceiveTop.valid == 1
Run Code Online (Sandbox Code Playgroud)

force u_DataReceiveTop.valid = 1'b1;即使存在另一种力量,就好像第二种力量陈述已经沿着等级传播.这里发生了什么?

dav*_*_59 6

wireVerilog中的A 是一个驱动器和接收器网络,它们都连接到同一个信号.该信号的值是所有驱动器的一些分辨率函数和电线的类型.当您通过端口连接两根电线时,两根电线会折叠成一个信号,但您仍然有两个不同的名称用于同一信号.

force在线路上使用该语句时,将覆盖网络上的所有驱动程序,直到遇到另一个force或release语句.在您的示例中,第二个force语句替换第一个语句force.我在哪个层次参考中使用并不重要,force因为它们都指的是相同的信号.

如果您想要您期望的行为,则需要使用变量而不是电线.将变量连接到端口时,SystemVerilog会根据端口的方向创建隐式连续分配.SystemVerilog不允许对变量进行多次连续赋值,这就是为什么不能将变量与inout端口一起使用的原因.因此,您需要更加小心端口方向.

  • 设计和验证工程师需要团队合作。设计人员需要更改代码的结构方式以便对其进行测试,或者验证工程师需要修改代码以执行所需的测试。 (2认同)
  • `force` 是一个临时的连续赋值。RHS 上的更改会不断更新 LHS。 (2认同)