2008-09-15 68 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(.*); 

此綁定你的模塊到目標的每個實例,不管它是在設計中。如果您的模塊是驗證檢查器,這非常強大。