非定宽数
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 15 课,共 90 课。
未指定大小的数字是指没有指定位数的数字。写数字时如果不指定大小前缀,Verilog 默认会将其视为 32 位。
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // 与上面相同,但明确指定了位数未指定位数的数字只使用格式和值:[format][value]
format:数字的进制:二进制用b,十进制用d,十六进制用h,八进制用ovalue:实际的数字(例如,1010)
格式字母前仍然需要加撇号 ',但前面没有位数。
'b1010:32 位二进制数 1010'd255:32 位十进制数 255'hFF:32 位十六进制数 FF'b1:32 位二进制数 1(前面有 31 个前导零)
代码示例:
reg [7:0] data;
initial begin
data = 1010; // 未指定位宽:32 位的值(可能引发警告)
data = 'd255; // Unsized: 32-bit decimal 255
data = 'hFF; // 未指定位宽:32 位十六进制数 FF
end未指定位宽与指定位宽
| 未指定位宽 | 指定位宽 | |
|---|---|---|
| 示例 | 1010 或 'd255 | 8'b1010 或 8'd255 |
| 位宽 | 32 位(默认) | 显式指定(按指定值) |
| 撇号 | 使用进制格式时必需 | 必需 |
| 使用场景 | 简单的测试平台代码 | 硬件赋值 |
潜在问题
未指定大小的数字赋值给较小的寄存器时,可能会导致意外行为:
reg [3:0] small_reg;
small_reg = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small_reg = 'b10000; // 32 位的值,但太大了!(警告)第二个示例将一个 32 位的值 10000 赋给一个 4 位寄存器。只保留低 4 位(0000),这可能和你的预期不同。
何时使用未指定位宽的数字
未指定位宽的数字适用于:
- 测试平台中的简单数字
- 循环计数器
$display语句
对于实际的硬件赋值,使用指定大小的数字,这样表达更明确,也能避免警告。
挑战
下面的代码中,有些数字没有指定位宽。请将它们改成 8 位数字,以避免警告。
要做什么:
- 将
a改成表示 1010 的 8 位二进制数 - 将
b改成表示 255 的 8 位十进制数 - 将
c改成表示 FF 的 8 位十六进制数
亲手试试
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // 改为指定位宽的表示形式(8 位十进制)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器
检查进制转换: 进制转换器