我在系统verilog中定义了一个接口,并使用bind语句绑定到内部RTL信号。我希望能够通过接口强制内部RTL信号。然而,这导致RTL信号进入' x'如果我没有明确强制这些信号,那么它似乎与接口绑定具有驱动能力。我不希望RTL信号变为' x'在这种情况下什么都没有强迫它,不知道我在这里做错了什么?
我的代码看起来像DUT是设计:
interface myInf(
inout RTL_a,
inout RTL_b
);
bind DUT myInf myInf_inst(
.RTL_a(DUT.a),
.RTL_b(DUT.b)
);
bind DUT myDrv(myInf_inst);
其中myDrv是一个驱动myInf端口的模块。
在这种情况下,DUT.a和DUT.b是内部RTL信号,它们有来自设计的驱动程序,但我希望能够在需要时强制它们。然而,这些信号变成了' x'当我只是将它们绑定到myInf而不实际驱动它们时。
答案 0 :(得分:3)
inout
信号可能是非网络类型。最好在声明中明确并将它们定义为inout wire
。在interface
内,将网络分配给logic
并将logic
初始化为z
。当z
允许信号驱动时,非z
值将应用驱动程序。例如:
interface myInf(
inout wire RTL_a,
inout wire RTL_b
);
logic drv_a, drv_b;
initial {drv_a,drv_b} = 'z; // z means not driving
assign RTL_a = drv_a;
assign RTL_b = drv_b;
endinterface
可能存在冲突的驱动程序,例如设计中的正常驱动程序。在这种情况下,您将需要覆盖驱动程序。假设信号被覆盖是一种净类型,可以通过将assign语句更改为assign (supply1,suppl0) RTL_a = drv_a;
来完成。这是利用Verilog的驱动强度概念。分配给z
仍将是所有其他驱动程序。大多数网络的强度为strong1,strong0
,弱于supply1,supply0
。驱动强度不适用于非网络类型(例如logic
& reg
)。这些寄存器/变量类型使用last-assignment-wins方法。更多关于驱动力的内容阅读IEEE Std 1800-2012第28.11至28.15节
您的示例代码有一些错误。 myInf_inst
的引脚连接应使用相对于其目标范围的分层引用。除非在DUT
内有一个名为module DUT
的实例,否则应省略DUT.
(参见IEEE Std 1800-2012§23.11将辅助代码绑定到范围或实例)。 myDrv
的绑定语句缺少实例名称。代码应该是:
bind DUT myInf myInf_inst(
.RTL_a(a), // no DUT.
.RTL_b(b) // no DUT.
);
bind DUT myDrv myDrv_inst(myInf_inst);