Altifigence Academy

7 / 37 · 概念

切片、拼接和重复运算的位宽

计算拼接信号的总位宽与数值保留条件,构建数据通路。

拼接运算不是加法

{a,b} 将 b 的比特接在 a 后面。若位宽分别为 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×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};

将四个符号位与原四位拼接,总共得到八位。符号扩展不是因为 MSBMSB 权重最高的比特。其索引取决于向量声明方向,不能总认为它是编号最大的位。了解更多 为 1 就加上 1 的算术操作,而是扩展位布局以保留解释后的数值。

使用 q[N-2:0] 的通用移位电路,在 N=1 时该范围不成立。应限制最小支持位宽,或用 generate 分支单独处理 N=1。参数化并非只把数字替换成变量就完成。

自己试试

a 为三位 101,b 为两位 11。{a,b} 的位宽与数值是什么?将其存入四位后会留下什么?

阅读解释

位宽为五位,位串为 10111,值为 5⋅4+3=235\cdot4+3=23。存入四位后丢弃高位,留下 0111,即 7。

你的选择适用于此浏览器,可随时在页脚更改。