【问题标题】:How does SystemVerilog `force` work?SystemVerilog `force` 是如何工作的?
【发布时间】:2016-06-12 12:57:43
【问题描述】:

我有一个模块层次结构,我试图在其中执行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 system-verilog


    【解决方案1】:

    Verilog 中的wire 是一个由驱动器和接收器组成的网络,它们都连接到同一个信号。该信号的值是所有驱动器和电线类型的某种分辨率功能。当您通过一个端口连接两条线时,两条线会合并为一个信号,但对于同一信号,您仍然有两个不同的名称。

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

    如果你想要你所期望的行为,你需要使用变量而不是连线。当您将变量连接到端口时,SystemVerilog 会根据端口的方向创建隐式连续赋值。 SystemVerilog 不允许对一个变量进行多次连续赋值,这就是为什么不能使用带有inout 端口的变量的原因。所以你需要更加小心港口的方向。

    【讨论】:

    • 感谢您的回答。我现在明白发生了什么。现在看来我无法用force 实现我想要做的事情。关于如何防止更高层模块在我感兴趣的模块上驱动信号以便我可以将一组不同的事务注入模块的任何提示?
    • 我需要提一下,我不允许更改设计代码。我需要一些如何从测试台上做到这一点。我需要能够在需要时将事务注入到所需的模块中,在一些如何脱离更高的模块之后,它们不会驱动任何东西。
    • 设计和验证工程师需要团队合作。设计人员需要更改代码的结构方式以便对其进行测试,或者验证工程师需要修改代码以执行所需的测试。
    • 戴夫,如果我在我的信号上使用变化为 force 的寄存器或电线,“力”是否会不断地将变化的值分配给信号,或者强制值保持不变,等于“强制”时的值 reg/wire? force@always 一样吗?
    • force 是临时连续赋值。 RHS 的变化不断更新 LHS。
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2014-01-30
    • 2011-11-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2017-12-11
    相关资源
    最近更新 更多