Altifigence Academy

7 / 37 · 概念

切片、串接與重複運算的寬度

計算串接訊號的總寬度與保值條件,建立資料路徑。

串接運算不是加法

{a,b} 將 b 的位元接在 a 之後。寬度分別為 M、N 時,結果寬度為 M+N。兩運算元若為 unsigned無符號(unsigned)將位元序列解讀為非負整數。n 位元範圍為 0 至 2^n−1;相同位元序列的帶符號解讀可能得到不同數值。 詳細內容 位元序列,數值上為:

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

a=2'b10、b=3'b101 時,串接結果為 5'b10101,即 21;不同於算術總和 7。

a 的位元升高 b 的寬度個位置。串接串接運算將位元序列相鄰接合。結果位寬等於各運算元位寬的總和,與數值加法不同。應讀成 a×2³+b,而非 a+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 值,因此進行 signed 運算前應再次確認意義。

符號擴展與重複串接

SystemVerilog
logic signed [3:0] small;
logic signed [7:0] extended;
assign extended = {{4{small[3]}}, small};

四個符號位元與原本四位串接,形成 8 位元。Sign extension 不是看到 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。

此選擇適用於本瀏覽器,隨時可從頁尾變更。