2008-09-15 29 views
6

我有一个“watcher”模块,它当前正在使用全局层次结构。我需要使用第二个全局层次结构来实例化第二个实例。将层次结构传递到Verilog模块

目前:

module watcher; 
wire sig = `HIER.sig; 
wire bar = `HIER.foo.bar; 
... 
endmodule 

watcher w; // instantiation 

期望:

module watcher(input base_hier); 
wire sig = base_hier.sig; 
wire bar = base_hier.foo.bar; 
... 
endmodule 

watcher w1(`HIER1); // instantiation 
watcher w2(`HIER2); // second instantiation, except with a different hierarchy 

我的最好的办法是使用VPP(Verilog的预处理器)穷举生成两个实际上,相同的模块(一个与每个层次) ,但是有没有更优雅的方式?

回答

8

我的首选项是在测试台中包含一个模块(或少量模块),其中包含所有探测器但不包含其他功能。需要探针的测试台中的所有其他模块将连接到该“探针模块”。如果这是您的选择,请使用SystemVerilog接口优先于原始电线。这避免了你的问题,因为没有观察者需要全局层次结构,并且你的测试平台总体上将更容易维护。请参阅Law of Demeter

或者......(但是这使层次在你的实例...)

module watcher(sig, bar); 
    input sig; 
    input bar; 
... 
endmodule 

watcher w1(`HIER1.sig, `HIER1.foo.bar); // instantiation 
watcher w2(`HIER2.sig, `HIER2.foo.bar); // second instantiation, except with a different hierarchy 

随后你还可以:

`define WATCHER_INST(NAME, HIER) watcher NAME(HIER.sig, HIER.foo.sig) 

`WATCHER_INST(w1, `HIER1); 
`WATCHER_INST(w2, `HIER2); 
+0

感谢您的回应,我当然同意你的一般观点。 不幸的是,在这种情况下,模块内部有大约100根探针导线,所以将它们转换为明确的输入,虽然更清晰,但是相当混乱。 – pdq 2008-09-16 04:59:21

2

你能使用SystemVerilog的bind关键字模块绑定到需要它的每个层次结构中? (这要求你使用SystemVerilog,并且有一个模拟器的许可证。)

使用绑定就像以正常方式实例化一个模块,不同之处在于你提供了一个层级的路径,模块被“远程”实例化:

bind top.my.hier my_module instance_name(.*); 
bind top.my_other.hier my_module instance_name(.*); 

甚至更​​好:假设您绑定到的每个层次结构都是同一模块的单独实例。然后:

bind remote_module my_module instance_name(.*); 

此绑定你的模块到目标的每个实例,不管它是在设计中。如果您的模块是验证检查器,这非常强大。