7

現在、内部でグローバル階層を使用している「ウォッチャー」モジュールがあります。これの 2 番目のインスタンスを 2 番目のグローバル階層でインスタンス化する必要があります。

現在:

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 つ) を力ずくで生成することですが、もっと洗練された方法はありますか?

4

2 に答える 2

8

私の好みは、すべてのプローブを含み、他の機能を含まない単一のモジュール(または少数のモジュール)をテストベンチに置くことです。プローブを必要とするテストベンチ内の他のすべてのモジュールは、その「プローブモジュール」に接続します。必要に応じて、生のワイヤよりもSystemVerilogインターフェイスを使用してください。これにより、ウォッチャーがグローバル階層を必要とせず、テストベンチ全体の保守が大幅に容易になるため、問題が回避されます。デメテルの法則を参照してください。

または...(ただし、これによりインスタンス化に階層が配置されます...)

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);
于 2008-09-16T00:56:11.680 に答える