7

4 つの入力信号の値に基づいて 14 ビットの数値を出力する単純なモジュールを作成しようとしています。私の試みを以下に示します。

module select_size(
    input a,
    input b,
    input c,
    input d,
    output [13:0] size
);

    if (a) begin
        assign size = 14'h2222;
    end
    else begin
        if (b) begin
            assign size = 14'h1111;
        end
        else begin
            if (c) begin
                assign size = 14'h0777;
            end
            else begin
                assign size = 14'h0333;
            end
        end
    end

endmodule

コンパイル時に、次のエラーが表示されます。

エラー: HDLCompiler:44 - 67 行目: c は定数ではありません

その前の他の2つが機能している場合、その特定のifステートメントが機能しない理由がわかりません。条件を変更してみました

if (c == 1) begin

しかし、役に立たない。

このエラーを解決する方法を知っている人はいますか? ありがとうございました!

4

2 に答える 2

13

2 つの問題:

1)ブロックif内にステートメントを入れる必要があります。always

Verilog-2001 を使用する場合は、

always @*
   if ....
   end
end

それ以外の場合は、感度リストですべての入力を指定します。

always @(a or b or c or d)
   if ....
   end
end


2) if ステートメント内での定数の代入は許可されていません。

ブロックassign内のすべてのステートメントからキーワードを削除します。if

if (a) begin
    size = 14'h2222;
end

また、サイズを型として宣言する必要がありますreg

ただし、モジュール全体を条件演算子で書き直すことをお勧めします。読む方がはるかに好ましいと思います。次のモジュールでも同じ結果が得られます。

module select_size(
    input a,
    input b,
    input c,
    input d,
    output [13:0] size
);

    assign size = a ? 14'h2222 :
                  b ? 14'h1111 :
                  c ? 14'h0777 : 
                      14'h0333 ;

endmodule
于 2012-08-06T21:57:15.463 に答える
1

@Tim が既に回答しているように、ブロック内regまたは.alwayswireassign

@Tim は入れ子になった 3 項代入についても説明していますが、この例では非常にうまく書かれていますが、一般的に悪い習慣と見なされています。それらは非常に長い組み合わせパスを意味し、維持するのが難しい場合があります。組み合わせパスは、最適化された選択ロジックを備えたマルチプレクサを意味する合成によって最適化される場合があります。

コードの保守が容易であるほど、所有コストが低くなり、合成されたデザインが大きくならない限り、通常は好まれます。

私の実装は、casez を使用することです (? は気にしません)。各値の優先順位を確認/デバッグしやすいと思います。

module select_size(
  input a,
  input b,
  input c,
  input d,
  output logic [13:0] size //logic (SystemVerilog) or reg type
);

always @* begin
  casez ({a,b,c})
    3'b1?? : size = 14'h2222 ;
    3'b01? : size = 14'h1111 ;
    3'b001 : size = 14'h0777 ;
    3'b000 : size = 14'h0333 ;
    default: size = 'bx      ;
  endcase
end

endmodule
于 2012-08-08T08:00:22.960 に答える