安全なcaseデコード
CoddyのVerilogジャーニー「RTL設計と検証」セクションの一部。レッスン 4/38。
完全一致する制御コードには通常の case 文を使用します。サポートされていないコードには default の動作を指定し、すべての出力を assign します。casex によるワイルドカードデコードは、シミュレーションで未知の制御ビットを隠してしまう可能性があるため、デバッグ中に未知の値を可視のままにしておく必要がある場合には適していません。
関連する抜粋です。周囲の宣言と接続は課題で提供されます。
always @* begin
y = 0;
invalid = 0;
case (op)
0: y = a & b;
1: y = a | b;
default: invalid = 1;
endcase
endサポートされていないコードでは、以前の出力を保持するのではなく、明示的なステータスが生成されます。
サポートされていない制御コードを明示的に定義し、未知の制御コードを casex で隠さないでください。
チャレンジ
中級8ビットの論理ユニットを実装してください。op 0では a AND b、op 1では a OR b、op 2では a XOR bを計算し、op 3では invalidを1に設定してゼロを返します。サポートされている演算では invalidはゼロです。出力列は y、invalid です。すべての刺激値は既知のバイナリ値です。
design.vを完成させ、モジュール名とポートを保持してください。ロックされた testbench.v は入力を変更し、値が安定した後に出力を表示します。+CASE=1 のようなシミュレータ引数を使用してシナリオを選択します。標準入力は必要ありません。designに出力、遅延、またはシミュレーション終了処理を追加しないでください。期待される出力は、各観測につき10進値の行を1行ずつ出力し、値は1つのスペースで区切り、改行で終わる形式です。
自分で試してみよう
module dut (input [1:0] op, input [7:0] a, input [7:0] b, output reg [7:0] y, output reg invalid);
// このプレースホルダーをあなたの設計に置き換えてください。
initial y = 0;
initial invalid = 0;
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
RTL設計と検証のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ