对于$ readmemb中未指定的更高位,Verilog的默认值是什么?

问题描述

如果我有一个12位宽的Verilog内存,并使用$readmemb一个Verilog二进制文件(其条目为5位宽)中对其进行初始化,那么[11:5]的值将是多少?

下面的SSCCE。我已经用iverilog运行了它,并用0填充了高位,但是我很想知道这个假设是否可以移植,或者这是否是未指定的行为。

testbench.v:

module testbench();
  reg [11:0] memory [0:7];

  initial begin: main
    integer i;
    for (i = 0; i < 8; i = i + 1) memory[i] = 12'hxx;
    $readmemb("test_mem.bin",memory,7);
    for (i = 0; i < 8; i = i + 1) $display("%h",memory[i]);
  end
endmodule

test_mem.bin:

11111
10000
10000
11111
11011
11010
10001
10001

解决方法

IEEE 1800-2017 SystemVerilog LRM 21.4从文件加载内存数组数据部分中说,读取数字的方式与在SystemVerilog源描述中的读取方式相同,只是没有宽度或基地。只需假设'h位于数字$readmemh的前面,并且'b位于$readmemb数字的前面。使用 5.7.1整数文字常量中的规则,它表示

如果无符号数字的大小小于指定的大小 对于文字常量,无符号数字应填充到 左为零。如果无符号数字的最左位是x或 z,则x或z分别用于向左填充。 如果无符号数字的大小大于指定的大小 对于文字常量,无符号数应从 左边。

您可以在许多模拟器中尝试此方法,它们都会产生相同的结果。 https://edaplayground.com/x/67_C