【问题标题】:system verilog bind used together with interface系统verilog绑定与接口一起使用
【发布时间】:2023-03-04 13:30:01
【问题描述】:

我在系统 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”。

【问题讨论】:

  • 在这种情况下,您的 RTL 信号似乎会有多个驱动程序,如果我错了,请纠正我,但如果所有驱动程序的值不同,多个驱动程序将无法解析为稳定值。此外,信号的默认值(除非它们被声明为新的 systemverilog 类型)是“X”。哦,另一件事是您需要“释放”强制信号。

标签: system-verilog


【解决方案1】:

inout 信号可能是非网络类型。最好在声明中明确并将它们定义为inout wire。在interface 中,将网络分配给logic,并将logics 初始化为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 <b>(supply1,suppl0)</b> RTL_a = drv_a; 来完成。这是利用驱动强度的 Verilog 概念。分配给z 仍将是所有其他驱动程序。大多数网络以strong1,strong0 的强度驱动,比supply1,supply0 弱。驱动强度不适用于非网络类型(例如logicreg)。这些寄存器/变量类型使用最后分配获胜的方法。有关驱动强度的更多信息,请阅读 IEEE Std 1800-2012 第 28.11 至 28.15 节


您的示例代码有一些错误。 myInf_inst 的引脚连接应使用相对于其目标范围的分层引用。除非在module DUT 中存在名为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多