2008-09-15 2 views
6

私は現在、その内部にグローバル階層を使用している「ウォッチャー」モジュールを持っています。私は2番目のグローバル階層でこの2番目のインスタンスをインスタンス化する必要があります。現在階層を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のプリプロセッサ)を使用することですが、2事実上、同一のモジュール(各階層との1)を生成しますしかし、よりエレガントな方法がありますか?

答えて

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

+1

こんにちはpdq。私はそれがSVインターフェイスを述べた理由だと思う。少なくとも、それらを複数の論理グループにカプセル化し、ドット表記を使用してモジュール内部からワイヤにアクセスすることができます。 – DMC

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(.*); 

これは、ターゲットのすべてのインスタンス、それはデザインであるにかかわらずにあなたのモジュールをバインドします。モジュールが検証チェッカーである場合、これは非常に強力です。