2017-05-04 8 views
0

いくつかの入力といくつかのパラメータが必要なカスタムモジュールがVerilogにあります。私が使用している特定のハードウェアに関連する様々な理由のため追加のパラメータを使用してVerilogでカスタムモジュールのベクトルをインスタンシエート

module modA ( 
    input inp1, input inp2, ... output out); 
    parameter my_addr; 
... 
endmodule 

、私はこのモジュール、異なるパラメータを有する各時間(my_addrはメモリ内の特定の場所に対応するので、私は多くのインスタンスを作成する必要がありますホストからのアクセス)。さらに、すべての出力に簡単にアクセスしたいと思います。私は、それでは、私はall_modAの要素のベクトルを持っているでしょう

wire [9:0] outputs; 
modA #(.my_addr) all_modA[9:0](.inp1(inp1), .inp2(inp2), .out(outputs)); 

のような何かを考え、出力のn番目の要素はMODAのn番目のインスタンス化に対応することになります。それはうまくいくように聞こえますが、私は各インスタンシエーションに一意のアドレスを渡す必要があります。一度に1つのインスタンス化を行っていただけでは、パラメータを定義するのは非常に簡単でしたが、毎回一意の識別子をどのように渡すことはできません。

これを行う方法はありますか?問題は、forループを使用すると、各modAを一意の識別子でどのようにインスタンス化できるかわかりません。 forループを使用しないと、一意の識別子を追加する方法がわかりません。

答えて

2

ここでgenerateブロックを使用できます。 生成ブロックは、デザインの作成中に評価されます。それらはシミュレーション時には実行されず、結果はシミュレーションの開始前に決定されます。したがって、生成スキームのすべての式は、定義式であり、エラボレーション時に確定的でなければなりません。

my_addrに異なる値を指定してください。また、のラベル識別子begin-endブロックに適用することもできます。これはオプションブロックとしてとして生成されますが、が非常に強く推奨されます。そうすることによって、のユニークな階層パスは、各モジュールごとに異なるmodAのすべてのインスタンスで見ることができます。

あなたのコードでは、変更する値がmy_addroutputsのバスをout信号に変更してモジュールをインスタンス化するテストベンチを作成しました。詳細については

module modA #(parameter int my_addr) (input inp1, input inp2,output out); 

    initial $display("%m: %d",my_addr); 
endmodule 

module top(); 
wire [9:0] outputs; 
    genvar i; // generate iterator 
    generate 
    for(i=0;i<9;i++) begin: some_identifier 
     // my_addr = i+1 for every module 
     modA #(.my_addr(i+1)) all_modA(.inp1(inp1), .inp2(inp2), .out(outputs[i])); // Multiple modules 
     end 
    endgenerate 
endmodule 

、27同様の質問がherehereを見つけることができますIEEE 1800-2012セクションを参照してください。

+0

some_identifierが何であるかはどのように判断できますか? – user147177

+0

** 'begin..end'ブロックの** **識別子です。これは、生成ブロックのユーザー定義ラベルです。ここでは任意の文字列を使用できます。 – sharvil111

+0

私の場合、各出力は16ビットのワイヤです。 "wire [15:0] outputs [0:10];"と書くか? – user147177

関連する問題