5 / 37 · 概念
logic・wire・X/Zと明示的なビット幅
型宣言と記憶素子を区別し、リテラル・比較・拡張・未知値を検証します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
型・駆動元・記憶素子は別の問いです
logicは4状態データ型、wireはnet接続を表し、netも4状態値を伝えます。logic変数は言語の駆動規則に従って組合せ結果にもクロック状態にも使えます。名前だけではフリップフロップを保証しません。連続代入・組合せ手続き・エッジ手続きを確認します。通常のRTL信号は意図した駆動元を一つにします。多重駆動netや双方向接続は別の電気的・ツール契約を必要とし、この教材の単一駆動例の範囲外です。
幅と解釈を明示します
logic [7:0] uは符号なし8ビット、logic signed [7:0] sは同じ8ビットを2の補数で解釈します。8'hFFはuで255、sで−1です。packed vectorはビットを同時に伝え、時間順の8要素ではありません。
module typed_examples (
input logic [3:0] a, b,
input logic signed [7:0] s,
output logic [4:0] full_sum,
output logic signed [8:0] extended_s,
output logic negative,
output logic any_bit, all_bits, parity
);
assign full_sum = {1'b0, a} + {1'b0, b};
assign extended_s = {s[7], s};
assign negative = s < 8'sd0;
assign any_bit = |a;
assign all_bits = &a;
assign parity = ^a;
endmoduleextended_sは符号ビットを繰り返します。0を追加するだけだと−1を+255に変えます。連結式は符号なしなので、連結結果の符号付き算術には明示的な解釈または適切な中間宣言が必要です。この例は意図したビット列を符号付きの出力へ代入します。
幅が重要なら4'd15、8'hFF、8'sd0のようなサイズ付きリテラルを使います。サイズなし整数は式を広げる可能性があります。左オペランドだけが結果型を決めると考えず、両オペランドと代入文脈を確認します。
三種類の演算子を区別します
a & bは対応ビット、a && bは両ベクトルの論理的真偽を1ビットで返し、&aは全ビット1の縮約です。a=0011,b=0101なら0001、1、0です。^aはパリティで0011なら0です。幅や符号が不明な式は中間信号に分け、各信号の範囲を書けるようにします。
未知値は第三の物理電圧ではありません
Xは未知値、Zは高インピーダンス駆動状態を表すシミュレーション値です。2状態モデルは4状態動作を証明しません。Xを全て0へ隠さず、4状態テストベンチで状態を明示的にresetします。==は判定不能ならXになり得ます。テストベンチのactual !== expectedは既知の期待値に対するX/Zを明確な不一致にします。case equalityは一般回路が物理的なXを検出するという意味ではありません。
実習・拡張、加算、比較
a=15,b=1でfull_sum=10000。s=8'h80でextended_s=110000000,negative=1。s=8'h7Fでextended_s=001111111,negative=0を確認します。0、最大正数、最小負数、−1を別々に検査します。
拡張を{1'b0,s}に変えて負数検査の失敗を確認します。比較を!==から!=へ変え、actualにXを入れて条件が確実に失敗を報告するか調べます。検査結果自体が未知になると意図した検証を見逃す場合があります。