シミュレーション コードでの Verilog genvar 生成インスタンスへのアクセス
-
27-10-2019 - |
質問
これは Verilog 関連の質問です。開発環境として XILINX ISE を使用しています。
genvar を使用して自動的に生成されるシミュレーション内の変数にアクセスしようとしていますが、次のエラーが表示されます -> HDLCompiler:71
問題の例:
genvar i;
generate
for(i=0; i < N; i=i+1)
begin:Sys_Modules
TypeXModule #(.width(10)) xmod(.dataY(dataY)));
end
endgenerate
合成またはシミュレーションを実行すると、Sys_Modules[0..N-1].xmod インスタンスが作成されていることがわかります。
Sys_Modules 配列にアクセスする行をシミュレーションに追加しようとすると、次のようになります。
Sys_Modules[i].xmod.dataY
次のエラーが表示されます。
HDLCompiler:71 dataY が接頭辞 xmod で宣言されていません
シミュレーションで自動的に生成された値にアクセスする方法はありますか?
ありがとう!
解決
生成されたインスタンスへの階層参照を記述することは正当です。この機能については、IEEE Verilog 標準のセクション 2.7.2 および 12.1.3 で説明されています。ただし、インスタンスの添字はコンパイル時に解決できるように定数である必要があります。
他のヒント
合成された Verilog では、インスタンス間の階層参照を使用できません。
あなたは運が悪いと思います。あなたが発見したように、シミュレーターは生成されたブロックを指すモジュール外参照 (OOMR) を好まないようです。
最近、パラメータ化可能なテストベンチ モニターを作成したときに同様の問題に遭遇しました。インスタンス化されるサブブロックの数は、 parameter
. 。この中で、トップレベルが必要でした .start()
を呼び出したタスク .start()
インスタンス化された各モジュール内のタスク。使えなかった for
この OOMR 問題のため、ループでこれを実行します。
それで私は最終的に次のことをしなければならなくなりました:
- を定義する
reg
それはトップレベル.start()
タスクが切り替わりました - 書く
always @
これでブロックがトリガーされましたreg
- 書く 別の
generate
この内のセクションは常に呼び出すブロックです.start()
各サブモジュールで。
本当に覗き見する必要がある場合は、 generate
d モジュールについては、上記のような回避策を試してみてはいかがでしょうか?たとえば、トップレベルにバスがあり、generate
オリジナルの中身を覗くステートメント generate
d インスタンス化して、対象の信号をこのトップレベルのバスにコピー/割り当てます。