用于访问绑定文件中局部变量的分层路径?

问题描述

这是一种常见的方法,可以通过将断言,覆盖点等与设计分开来进行处理,方法是将它们放在单独的模块或接口中,并使用bind将其附加到设计中,例如,@H_502_3@

module foo (input a);
  wire b = a;
endmodule

interface foo_assertions (input a,b);
  initial #1 assert (b == a);
endinterface
bind foo foo_assertions i_foo_assertions(.*);

与此有关的一个问题是,它需要维护foo_assertions中的端口列表。但是,如果foo具有bar子模块,则可以使用断言文件中相对于bar的分层引用方便地访问foo内部的信号,例如assert (i_bar.sig == a) @H_502_3@

是否还可以使用分层路径语法访问直接在foo中声明的变量,从而无需使用foo_assertions中的端口列表?请注意,foo不一定是顶层模块,因此$root.b将不起作用。看起来foo.b可行,但是当顶层存在多个foo实例时,这是否安全?@H_502_3@

解决方法

Verilog始终使用向上的名称引用,这就是foo.b起作用的原因(请参见IEEE 1800-2017 SystemVerilog LRM中的23.8节)。只要您将foo绑定到名为foo_assertions的模块中,foo的实例数量就无关紧要。每个向上引用均适用于其下方的特定实例。

在层次结构路径中引用顶级模块时,您一直在使用向上引用,而不必实现它。