问题描述
这是一种常见的方法,可以通过将断言,覆盖点等与设计分开来进行处理,方法是将它们放在单独的模块或接口中,并使用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
的实例数量就无关紧要。每个向上引用均适用于其下方的特定实例。
在层次结构路径中引用顶级模块时,您一直在使用向上引用,而不必实现它。