Verilog 如何将检查器连接到任意实例?

Verilog 如何将检查器连接到任意实例?,verilog,system-verilog,Verilog,System Verilog,假设我有一个进入$root.I_dut的检查器,并在那里检查一些信号。一个简单的例子: module CheckOverflow(input logic clk); assert property (@(posedge clk) $root.i_dut.overflow == 1'b0); endmodule 如果我想在测试台中使用这个检查器,而我想检查的东西不一定被实例化为“$root.I_dut”,该怎么办?有没有一种方法,比如说,将对实例的引用传递给实例化的检查器 似乎UVM通过使用

假设我有一个进入$root.I_dut的检查器,并在那里检查一些信号。一个简单的例子:

module CheckOverflow(input logic clk);
  assert property (@(posedge clk) $root.i_dut.overflow == 1'b0);
endmodule
如果我想在测试台中使用这个检查器,而我想检查的东西不一定被实例化为“$root.I_dut”,该怎么办?有没有一种方法,比如说,将对实例的引用传递给实例化的检查器


似乎UVM通过使用接口解决了这个问题。我很想知道是否有一种方法可以通过引用而不是接口来实现这一点。

在这种情况下,您可以使用
绑定。这使得在层次结构中的任意位置实例化检查器成为可能

首先,您需要将溢出信号作为输入,而不是依赖于分层路径:

module CheckOverflow(input bit clk, input logic overflow);
在顶级测试台中,您将添加:

bind dut_module_name CheckOverflow assertions(
  .clk(<name of the clock signal in the DUT>),
  .overflow(overflow)
);
绑定dut\u模块\u名称检查溢出断言(
.clk(),
.溢出(溢出)
);
这将导致检测器在DUT模块下使用名称断言进行实例化,并连接到指定的DUT信号,而无需修改DUT代码


您可以在上找到一个工作示例。

我将尝试它,尽管与SystemVerilog LRM 3.1a第17.15节中的示例相比,语法是向后看的(这一部分非常精简)。关于更好的文档描述“bind”的正确使用有什么建议吗?@JonathanMayer这可能是错误的,我记不清,而且我没有打开LRM。让它工作后,请随意更正它。我通常会在谷歌上查找类似的内容,最终会访问asicworld.com或testbench.in等网站