位宽、进制与有符号数
字面量
跳转到“字面量”Verilog 常用格式是 位宽'进制数值:
8'hA5 // 8 位十六进制 A512'd1000 // 12 位十进制 10004'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
跳转到“x 和 z”| 值 | 含义 | 主要用途 |
|---|---|---|
x | 未知、冲突或未初始化 | 暴露复位、驱动和条件判断问题 |
z | 高阻态 | 芯片顶层双向/三态引脚 |
FPGA 内部通常不会实现真正三态总线;综合工具会将内部三态改写为选择逻辑。不要为了“仿真好看”把未知值强行改成 0,这会掩盖缺陷。
检查清单
跳转到“检查清单”- 每个计数器是否能表示终值?可用
$clog2(N)计算最小宽度。 - 加减乘、移位和拼接后的宽度是否明确?
- 比较两侧的符号属性是否一致?
- 截断是设计意图还是无意丢失高位?
- 跨模块端口是否保持同一宽度和符号定义?