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

时间:2014-02-11 00:28:16

标签: system-verilog

我在系统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而不实际驱动它们时。

1 个答案:

答案 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);

示例代码:http://www.edaplayground.com/x/2NG