跳转到内容
新建笔记

位宽、进制与有符号数

Verilog 常用格式是 位宽'进制数值:

8'hA5 // 8 位十六进制 A5
12'd1000 // 12 位十进制 1000
4'b10x1 // 四态仿真值,含未知位 x
'0 // 按目标宽度填 0
'1 // 按目标宽度填 1

工程代码优先写明位宽。无尺寸常量可能参与表达式自定宽和符号传播,结果常与直觉不同。

logic [7:0] a, b;
logic [8:0] sum;
assign sum = {1'b0, a} + {1'b0, b};

两个 8 位数相加可能需要 9 位保存进位。乘法结果通常需要两个操作数位宽之和;赋给更窄目标会截掉高位。

logic signed [15:0] sample;
logic signed [31:0] extended;
assign extended = {{16{sample[15]}}, sample};

二进制位本身没有正负,signed 决定解释和扩展规则。混合有符号/无符号运算时应显式转换:$signed(...)、$unsigned(...),不要依赖隐式规则。

值含义主要用途
x未知、冲突或未初始化暴露复位、驱动和条件判断问题
z高阻态芯片顶层双向/三态引脚

FPGA 内部通常不会实现真正三态总线;综合工具会将内部三态改写为选择逻辑。不要为了“仿真好看”把未知值强行改成 0,这会掩盖缺陷。

  • 每个计数器是否能表示终值?可用 $clog2(N) 计算最小宽度。
  • 加减乘、移位和拼接后的宽度是否明确?
  • 比较两侧的符号属性是否一致?
  • 截断是设计意图还是无意丢失高位?
  • 跨模块端口是否保持同一宽度和符号定义?