Verilog ケース ステートメント
case
ステートメントは、指定された式がリスト内の他の式のいずれかと一致するかどうかをチェックし、それに応じて分岐します。通常、マルチプレクサを実装するために使用されます。 if-else コンストラクトは、チェックする条件が多数あり、マルチプレクサではなくプライオリティ エンコーダに統合される場合には適していない可能性があります。
構文
Verilog ケース ステートメントは case
で始まります キーワードであり、endcase
で終わります キーワード。括弧内の式は 1 回だけ評価され、記述されている順序で代替のリストと比較され、代替が指定された式に一致するステートメントが実行されます。複数のステートメントのブロックはグループ化され、begin
内にある必要があります と end
.
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2,
case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default : <statement>
endcase
ケース項目のいずれも指定された式に一致しない場合、default
内のステートメント アイテムが実行されます。 default
ステートメントはオプションであり、default
は 1 つだけ存在できます case ステートメント内のステートメント。 Case ステートメントは入れ子にすることができます。
どのアイテムも式に一致せず、default
例
以下に示す設計モジュールには、他の 3 つの 3 ビット入力の 1 つを出力信号 out にルーティングするための 2 ビット選択信号があります。 case
ステートメントは、sel の値に基づいて正しい入力を出力に割り当てるために使用されます。 sel は 2 ビット信号なので、2
2
を持つことができます。 組み合わせ、0 から 3。デフォルト ステートメントは、sel が 3 の場合に出力を 0 に設定するのに役立ちます。
module my_mux (input [2:0] a, b, c, // Three 3-bit inputs
[1:0] sel, // 2-bit select signal to choose from a, b, c
output reg [2:0] out); // Output 3-bit signal
// This always block is executed whenever a, b, c or sel changes in value
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output is a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is anything else, out is always 0
endcase
end
endmodule
ハードウェア回路図
rtl コードは、4 対 1 のマルチプレクサを表すハードウェア回路図を取得するために作成されます。
sel が 3 の場合、出力はゼロであり、他の値の割り当てられた入力に対応することを確認してください。
シミュレーションログncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0 [10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5 [20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5 [30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1 [40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
case ステートメントでは、式の各ビットが 0、1、x、z などの選択肢の 1 つと一致する場合にのみ、比較が成功します。上記の例では、sel のいずれかのビットが x または z の場合、default
他の選択肢が一致しなかったため、ステートメントが実行されます。このような場合、出力はすべてゼロになります。
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
設計のケース ステートメントのケース アイテムの選択肢に x と z がある場合、結果はまったく異なります。
module my_mux (input [2:0] a, b, c,
[1:0] sel,
output reg [2:0] out);
// Case items have x and z and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz : out = a;
2'bzx : out = b;
2'bxx : out = c;
default : out = 0;
endcase
end
endmodule
シミュレーションログ ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5 ncsim: *W,RNQUIE: Simulation is complete.
ケースと if-else の違いは?
case
ステートメントは if-else-if
とは異なります 2 つの方法で:
if-else
で与えられた式 ブロックはcase
にある間はより一般的です ブロック、単一の式が複数のアイテムと一致しますcase
式に X 値と Z 値がある場合、決定的な結果が得られます
Verilog