什么是Verilog';$readmemb中未指定高位的默认值是多少?

什么是Verilog';$readmemb中未指定高位的默认值是多少?,verilog,Verilog,如果我有一个12位宽的Verilog内存,我使用Verilog二进制文件中的$readmemb对其进行初始化,比如说,该文件的条目是5位宽,那么[11:5]的值是多少 下面是SSCCE。我用iverilog运行它,它用0填充高位,但我想知道这个假设是可移植的还是未指定的行为 testbench.v: module testbench(); reg [11:0] memory [0:7]; initial begin: main integer i; for (i = 0

如果我有一个12位宽的Verilog内存,我使用Verilog二进制文件中的
$readmemb
对其进行初始化,比如说,该文件的条目是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, 0, 7);
    for (i = 0; i < 8; i = i + 1) $display("%h", memory[i]);
  end
endmodule

在第21.4节中,从文件加载内存阵列数据时说,数字的读取方式与SystemVerilog源描述中的读取方式相同,只是没有宽度或基数。假设
'h
位于
$readmemh
的数字前面,
'b
位于
$readmemb
的数字前面。使用5.7.1整数文本常量中的规则,它说

如果无符号数字的大小小于指定的大小 对于文字常量,无符号数字应填充到 左边是零。如果无符号数字中最左边的位是x或 一个z,然后一个x或一个z应分别用于向左焊盘。 如果无符号数字的大小大于指定的大小 对于文字常量,无符号数字应从 左派


您可以在许多模拟器中尝试这一点,它们都会产生相同的结果

“这些数字的读取方式与SystemVerilog源描述中的读取方式相同”。如果我将reg/logic声明为有符号的,则没有一个verilog编译器会扩展。我上面引用的文本说,文本填充总是带有零。我曾假设,如果文件中的整数被读入的内存是有符号的,则文件中的整数将被视为有符号的。5.7.1的第7段似乎澄清了这一点:“如果只使用基本格式,则数字应被视为……无符号整数。”因为21.4说“数字[在bin或hex文件中]既没有规定的长度,也没有规定的基本格式”,在我看来,Verilog规范没有明确说明这些数字是被视为有符号整数还是无符号整数。然而,所有的实现者似乎都做出了(合理的)假设,文件中的数字应该被视为未签名。
$readmem
早在
signed
添加到Verilog之前就存在了,可能没有人回去澄清这种行为。(15年)
11111
10000
10000
11111
11011
11010
10001
10001