[解決済み] ベリログ・ノンネット値割り当て
2022-01-25 16:32:01
質問
32ビット加算器4個を使って、cmdに応じた結果を出すモジュールを作っています。 cmdが0の場合、dout0 = a0+b0、その他のdoutは0になります。 cmdが1の場合、dout1 = a1+b1、その他のdoutは0になります。 cmd が 2 または 3 の場合も同様です。 cmd が 4 の場合は dout0,1,2,3 が前者の結果になります。
エラーメッセージはこのようなものです。
ERROR - VRFC 10-529 non-net dout0 への同時代入は許可されていません ~/sim_1/new/adder_array.v:63
なぜこのようなエラーが発生するのでしょうか、また、どのようにすればこの問題を解決できるのでしょうか。
以下は、v.23~69のコードです。
module adder_array(
cmd,
ain0, ain1, ain2, ain3,
bin0, bin1, bin2, bin3,
dout0, dout1, dout2, dout3,
overflow);
input [2:0] cmd;
input [31:0] ain0, ain1, ain2, ain3;
input [31:0] bin0, bin1, bin2, bin3;
output reg [31:0] dout0, dout1, dout2, dout3;
output [3:0] overflow;
wire [31:0] a[3:0];
wire [31:0] b[3:0];
wire [31:0] d[3:0];
wire ovf[3:0];
assign {a[0],a[1],a[2],a[3]} = {ain0,ain1,ain2,ain3};
assign {b[0],b[1],b[2],b[3]} = {bin0,bin1,bin2,bin3};
assign overflow = {ovf[3], ovf[2], ovf[1], ovf[0]};
parameter size = 4;
genvar i;
generate for(i = 0 ; i < size - 1 ; i = i + 1)
begin:adder
if (i == 0) begin
my_add adder(.ain(a[0]), .bin(b[0]), .dout(d[0]), .overflow(ovf[0]));
end
else if (i == size - 1 ) begin
my_add adder(.ain(a[i]), .bin(b[i]), .dout(d[i]), .overflow(ovf[i]));
end
else begin
my_add adder(.ain(a[i]), .bin(b[i]), .dout(d[i]), .overflow(ovf[i]));
end
end
endgenerate
assign dout0 = (cmd == 0 || cmd == 4) ? d[0] : 0;
assign dout1 = (cmd == 1 || cmd == 4) ? d[1] : 0;
assign dout2 = (cmd == 2 || cmd == 4) ? d[2] : 0;
assign dout3 = (cmd == 3 || cmd == 4) ? d[3] : 0;
endmodule
解決方法は?
を使用したい場合
assign
ステートメントを作成します。
dout0
a
wire
型の代わりに
reg
.
なぜこのようなエラーが発生したのかを書くこともできますが、すでにCliff Cummingsによる素晴らしい回答がここにあります。 Verilogで出力REGに値を「代入」する方法は?
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン