SystemVerilog`force`如何工作?

时间:2016-06-12 12:57:43

标签: 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;

我所期望的价值是:

u_DataReceiveTop.u_DataReceiveWrap.DataReceiveIfWrp_inst.valid == 0
u_DataReceiveTop.valid == 1

但我从波浪中看到:

u_DataReceiveTop.u_DataReceiveWrap.DataReceiveIfWrp_inst.valid == 1
u_DataReceiveTop.valid == 1

就好像第二个强制语句force u_DataReceiveTop.valid = 1'b1;已经在层次结构中向下传播,即使存在另一个力。这里发生了什么?

1 个答案:

答案 0 :(得分:6)

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

在线路上使用force语句时,会覆盖网络上的所有驱动程序,直到遇到另一个forcerelease语句。在您的示例中,第二个force语句替换了第一个force。我在force中使用哪种层次结构引用并不重要,因为它们都引用相同的信号。

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