Menu
CoddyTech

非定宽数

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 15 课,共 90 课。

未指定大小的数字是指没有指定位数的数字。写数字时如果不指定大小前缀,Verilog 默认会将其视为 32 位。

a = 'b1010;        // Unsized: Verilog treats this as 32 bits
a = 32'b1010;    // 与上面相同,但明确指定了位数

未指定位数的数字只使用格式和值:[format][value]

  • format:数字的进制:二进制用 b,十进制用 d,十六进制用 h,八进制用 o
  • value:实际的数字(例如,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 或 'd2558'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 语句

对于实际的硬件赋值,使用指定大小的数字,这样表达更明确,也能避免警告。

challenge icon

挑战

下面的代码中,有些数字没有指定位宽。请将它们改成 8 位数字,以避免警告。

要做什么:

  1. 将 a 改成表示 1010 的 8 位二进制数
  2. 将 b 改成表示 255 的 8 位十进制数
  3. 将 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器

检查进制转换: 进制转换器