System verilog 与接口一起使用的系统verilog绑定

System verilog 与接口一起使用的系统verilog绑定,system-verilog,System Verilog,我在系统verilog中定义了一个接口,并使用bind语句绑定到内部RTL信号。我希望能够通过接口强制内部RTL信号。然而,这会导致RTL信号变为“x”,如果我没有明确强制这些信号,那么绑定到接口似乎具有驱动能力。在这种情况下,我不希望RTL信号在没有任何强迫的情况下变为“x”,不确定我在这里做错了什么 我的代码是这样的,DUT是这样设计的: interface myInf( inout RTL_a, inout RTL_b ); bind DUT myInf myInf_ins

我在系统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信号,它们的驱动程序来自设计,但我希望能够在需要时强制它们。但是,当我只是将这些信号绑定到myInf而没有实际驱动它们时,这些信号会变成“x”。inout信号可能是非网络类型。最好在声明中显式,并将它们定义为
inout-wire
。在
接口
内,将网络分配给
逻辑
,并将
逻辑
s初始化为
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

示例代码:

在这种情况下,似乎您的RTL信号将有多个驱动程序,如果我错了,请纠正我,但如果所有驱动程序的值不相同,则多个驱动程序将无法解析为稳定值。此外,信号的默认值(除非声明为新的systemverilog类型)为“X”。哦,还有一件事你需要“释放”被强迫的信号。
bind DUT myInf myInf_inst(
   .RTL_a(a), // no DUT.
   .RTL_b(b) // no DUT.
);

bind DUT myDrv myDrv_inst(myInf_inst);