Verilogのカスタムモジュールの配列への単一入力
質問
だから、2つの異なるセレクター信号に基づいて読み書きできるようにしたい4つのRAMモジュールの配列があります。現在、中間信号を使用してRAMをインスタンス化しています:
genvar i;
generate
for (i = 0; i < regnum; i=i+1) begin: regs
rfram_generic rf (clk,rst,ce_a_int[i],addr_a_int[i],do_a_int[i],
ce_b_int[i],addr_b_int[i],do_b_int[i],
ce_w_int[i],we_w_int[i],addr_w_int[i],
di_w_int[i]);
end
endgenerate
そして、 head
または tail
信号(2ビットベクトル)を使用して、使用するRAMを選択します。これを行う方法はありますか?
解決
私はここに新しく、まだ質問にコメントすることはできませんが、マーティへの回答として:ほとんどのFPGA合成ツールは、可能であれば、トライステート値を持つ内部マルチソース信号をMUXのようなロジックに変換します。たとえば、古いトライステートからロジックへの動作の説明を参照してください。正確に聞こえます。
Adamへの推奨事項として、トライステートを使用するよりも自分でマスキングを実行することで、コード内でこれを明示的にした方がおそらく良いでしょう。これにより、移植性が向上し、より予測可能な結果が得られ、誰かがコードを再検討する必要がある場合に自己文書として機能します。
ただし、ソリューションに基づいていくつかの推測を行う場合、書き込みポートのクロックイネーブルを単純にマスクし、読み取りポートの出力を多重化することはおそらく意味があります。例えば:
reg [WIDTH-1:0] do_a,do_b;
always @(*) do_a = do_a_int[head];
always @(*) do_b = do_b_int[tail];
generate
genvar i;
for (i = 0; i < regnum; i=i+1) begin: regs
rfram_generic rf (clk,rst,
ce_a,addr_a,do_a_int[i],
ce_b,addr_b,do_b_int[i],
ce_w,head==i?we_w:1'b0,addr_w,di_w);
end
endgenerate
これにより、ソリューションよりも複雑なロジック( i.e。、優れた面積と遅延)が得られる可能性があります。
他のヒント
私はそれを理解したと思う、生成ステートメントを使用する必要があります:
genvar i;
generate
for (i = 0; i < regnum; i=i+1) begin: sigassign
//read from the checkpoint in progress
assign ce_a_int[i] = (head == i) ? ce_a : 'bz;
assign addr_a_int[i] = (head == i) ? addr_a : 'bz;
assign do_a = (head == i) ? do_a_int[i] : 'bz;
//write to the checkpoint in progress
assign ce_w_int[i] = (head == i) ? ce_w : 'bz;
assign we_w_int[i] = (head == i) ? we_w : 'bz;
assign addr_w_int[i] = (head == i) ? addr_w : 'bz;
assign di_w_int[i] = (head == i) ? di_w : 'bz;
//read from the last stable checkpoint
assign ce_b_int[i] = (tail == i) ? ce_b : 'bz;
assign addr_b_int[i] = (tail == i) ? addr_b : 'bz;
assign do_b = (tail == i) ? do_b_int[i] : 'bz;
end
endgenerate
問題の解決策を見つけられたことをうれしく思います。私はあなたが何をしていたかを完全に理解していなかったことを認めなければなりませんが、1つのコメント、あなたは生成ステートメント内で if
を使用して、異なるモジュールをインスタンス化するか、 genvarに依存する異なる信号を使用することもできます
、例:
generate
genvar i;
for (i = 0; i < regnum; i=i+1) begin: regs
if (i == head) begin
rfram_generic_a rf(...);
end else if (i == tail) begin
rfram_generic_b rf(...);
end else begin
rfram_generic_c rf(...);
end
end
endgenerate