7 / 37 · 概念
スライス・連結・繰返し演算の幅
連結する信号の総幅と値の保存条件を計算し、データパスを構成します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
連結演算は足し算ではありません
{a,b} は a のビットの後ろに b のビットをつなげます。幅が M と N なら、結果幅は M+N です。両方が unsignedunsigned ビット列を非負整数として解釈する規則です。n ビットの範囲は 0 から 2^n−1 で、同じビット列の signed 解釈と異なる場合があります。 詳しく見る のビット列なら、数値的には次の式です。
a=2'b10、b=3'b101 なら、連結結果は 5'b10101、つまり 21 です。算術和の 7 とは異なる演算です。
a のビットは b の幅だけ上位へ移ります。この連結演算連結演算 ビット列を横につなげる演算です。結果幅はオペランド幅の合計で、数値の足し算とは異なります。は a+b ではなく、a×2³+b と読みます。
- a = 10: 幅 2 ビット、整数 2
- b = 101: 幅 3 ビット、整数 5
- {a,b} = 10101: 幅 5 ビット、2×8+5=21
式の横に幅を書く
logic [7:0] word;
logic [3:0] upper, lower;
logic [7:0] swapped;
assign upper = word[7:4];
assign lower = word[3:0];
assign swapped = {lower, upper};入力が 8'hA3 なら swapped は 8'h3A です。スライススライス ベクトルから連続するビット範囲を選ぶ演算です。選択範囲が結果の幅とビット順を定めます。範囲を一つ誤ると、幅または値が変わります。部分選択は元のベクトルが signed でも別の unsigned 値として扱われる場合があるので、符号付き演算の前に意味を再確認します。
符号拡張と繰返し連結
logic signed [3:0] small;
logic signed [7:0] extended;
assign extended = {{4{small[3]}}, small};符号ビット四つと元の四ビットをつなぎ、合計 8 ビットにします。符号拡張は MSBMSB 最も高い桁の重みを持つビットです。ベクトルの宣言方向でインデックスが変わるため、常に最大番号とは限りません。 詳しく見る が 1 だから 1 を足す演算ではなく、解釈した値を保存するようビット配置を広げる操作です。
q[N-2:0] を使う汎用シフト回路は N=1 で範囲が成立しません。最小幅を制限するか、generate 分岐で N=1 を別扱いにします。パラメータ化は数字を変数に置き換えるだけでは完成しません。
自分で考えてみましょう
a は 3 ビットの 101、b は 2 ビットの 11 です。{a,b} の幅と値は何ですか。4 ビットに格納すると何が残りますか。
解説を見る
幅は 5 ビット、ビット列は 10111、値は です。4 ビットに格納すると上位ビットを捨て、0111、つまり 7 が残ります。