问题描述
如果我有一个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