Altifigence Academy

7 / 37 · 概念

スライス・連結・繰返し演算の幅

連結する信号の総幅と値の保存条件を計算し、データパスを構成します。

連結演算は足し算ではありません

{a,b} は a のビットの後ろに b のビットをつなげます。幅が M と N なら、結果幅は M+N です。両方が unsignedunsigned ビット列を非負整数として解釈する規則です。n ビットの範囲は 0 から 2^n−1 で、同じビット列の signed 解釈と異なる場合があります。 詳しく見る のビット列なら、数値的には次の式です。

{a,b}=a⋅2N+b\{a,b\}=a\cdot2^N+b

a=2'b10、b=3'b101 なら、連結結果は 5'b10101、つまり 21 です。算術和の 7 とは異なる演算です。

a のビットは b の幅だけ上位へ移ります。この連結演算連結演算 ビット列を横につなげる演算です。結果幅はオペランド幅の合計で、数値の足し算とは異なります。は a+b ではなく、a×2³+b と読みます。

ビットの連結と数値の加算
  1. a = 10: 幅 2 ビット、整数 2
  2. b = 101: 幅 3 ビット、整数 5
  3. {a,b} = 10101: 幅 5 ビット、2×8+5=21

式の横に幅を書く

SystemVerilog
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 値として扱われる場合があるので、符号付き演算の前に意味を再確認します。

符号拡張と繰返し連結

SystemVerilog
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、値は 5⋅4+3=235\cdot4+3=23 です。4 ビットに格納すると上位ビットを捨て、0111、つまり 7 が残ります。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。