SystemVerilog `force` 是如何工作的?
How does SystemVerilog `force` work?
我有一个模块层次结构,我正在尝试执行 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;
已经向下传播了层次结构,即使还有另一个力。这里发生了什么?
Verilog 中的 wire
是一个驱动器和接收器网络,它们都连接到同一信号。该信号的值是所有驱动器和电线类型的某种分辨率函数。当您通过一个端口连接两条线时,这两条线会合并为一个信号,但对于同一个信号您仍然有两个不同的名称。
当您在网络上使用 force
语句时,它将覆盖网络上的所有驱动程序,直到遇到另一个 force
或 release
语句。在您的示例中,第二个 force
语句替换了第一个 force
。您在 force
中使用哪个层次结构引用并不重要,因为它们都引用相同的信号。
如果你想要你期望的行为,你需要使用变量而不是连线。将变量连接到端口时,SystemVerilog 会根据端口的方向创建隐式连续赋值。 SystemVerilog 不允许对一个变量进行多次连续赋值,这就是为什么不能使用带有 inout
端口的变量。因此,您需要更加注意端口方向。
我有一个模块层次结构,我正在尝试执行 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;
已经向下传播了层次结构,即使还有另一个力。这里发生了什么?
Verilog 中的 wire
是一个驱动器和接收器网络,它们都连接到同一信号。该信号的值是所有驱动器和电线类型的某种分辨率函数。当您通过一个端口连接两条线时,这两条线会合并为一个信号,但对于同一个信号您仍然有两个不同的名称。
当您在网络上使用 force
语句时,它将覆盖网络上的所有驱动程序,直到遇到另一个 force
或 release
语句。在您的示例中,第二个 force
语句替换了第一个 force
。您在 force
中使用哪个层次结构引用并不重要,因为它们都引用相同的信号。
如果你想要你期望的行为,你需要使用变量而不是连线。将变量连接到端口时,SystemVerilog 会根据端口的方向创建隐式连续赋值。 SystemVerilog 不允许对一个变量进行多次连续赋值,这就是为什么不能使用带有 inout
端口的变量。因此,您需要更加注意端口方向。