首页 > 解决方案 > Verilog 对于 $readmemb 中未指定的高位的默认值是多少?

问题描述

如果我有一个 12 位宽的 Verilog 内存,并且我使用$readmembVerilog 二进制文件初始化它,该文件的条目是 5 位宽,那么值[11:5]是多少?

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

测试台.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

test_mem.bin:

11111
10000
10000
11111
11011
11010
10001
10001

标签: verilog

解决方案


IEEE 1800-2017 SystemVerilog LRM在第21.4节从文件中加载内存阵列数据中说,除了没有宽度或基数之外,数字的读取方式与它们在 SystemVerilog 源描述中的读取方式相同。只需假设它'h在数字前面,$readmemh并且'b在数字前面$readmemb。使用5.7.1 Integer literal constants中的规则,它说

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

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


推荐阅读