4

(3ビット)入力の2の補数表現を返すモジュールを構築しようとしています(最初のビットは符号です)。次のコードは概念的には正しいと思いますが、おそらくその構造について何かが欠けている可能性があります。コンパイルしようとすると、次のエラーが発生します。

(vlog-2110) Illegal reference to net "f_o".
(vlog-2110) Illegal reference to net "f_o".
(vlog-2110) Illegal reference to net "f_o".

そのエラーを検索すると、変数を同時に入力と出力として使用すると通常見られることが示されましたが、それは私の場合ではありません。エラーの場所を指摘していただけますか?

module ca2 (a_i,f_o);
  input  [2:0] a_i;
  output [2:0] f_o;

  always @(a_i[2:0] or f_o[2:0])
  begin
    if (a_i[2] == 1)
    begin
      f_o[2]   = a_i[2];
      f_o[1:0] = (~a_i[1:0] + 'b1);
    end
    else
    begin
      f_o = a_i;
    end
  end
endmodule
4

3 に答える 3

2

f_oreg として宣言する必要があります。output reg [2:0] f_o.

また、あなたが何を計算しているのかわかりません。それは標準的な 2 の補数ではありません。

module ca2 (
  input      [2:0] a_i,
  output     [2:0] twos_comp,
  output     [2:0] also_twos_comp
);

  assign      twos_comp = ~a_i + 1'b1;
  assign also_twos_comp = -a_i ;
endmodule

エンコードされた入力を扱っている可能性がありますが、twos_complement は、符号ビット (MSB) が変化すると予想される数値を否定することです。これを符号ビットと呼んでいますが、値に関する情報も含まれているため、単に取り除いて数値を変更しないままにすることはできません。

于 2012-10-31T07:31:59.550 に答える
2

Verilog では、宣言されていない識別子は、ほとんどの状況で暗黙のワイヤ宣言と見なされます。f_o は宣言されていないため、コンパイラはこれを変数ではなくワイヤと見なします。これにより、コンパイラはすべての割り当てについて不平を言います。

// What was typed
module ca2 (a_i,f_o);
  input  [2:0] a_i;
  output [2:0] f_o;

// What the compiler implicitly declares
  wire   [2:0] a_i;
  wire   [2:0] f_o;

これを修正するには、変数を宣言するか、ポートと変数の両方を宣言します。

module ca2 (a_i,f_o);
  input  [2:0] a_i;
  output [2:0] f_o; 
  reg [2:0] f_o;

module ca2 (a_i,f_o);
  input      [2:0] a_i;
  output reg [2:0] f_o; 
于 2012-10-31T03:43:15.763 に答える