verilog - Verilog 对于 $readmemb 中未指定的高位的默认值是多少?
问题描述
如果我有一个 12 位宽的 Verilog 内存,并且我使用$readmemb
Verilog 二进制文件初始化它,该文件的条目是 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
解决方案
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
推荐阅读
- javascript - 通过_id匹配并提取两个对象数组之间的元素
- angular - Angular 8嵌套的ngFor - 点击事件影响所有其他项目
- elasticsearch - 在 Elasticsearch 中根据 document 生成 Document id
- react-native - 后退按钮反应本机 Web 视图
- javascript - 从另一个数组中的数组中删除对象
- php - 引导输入标签应用所需的验证
- vue.js - 为什么类星体开发不工作,当执行类星体开发?
- python - 为什么我们在 python 中使用多态性和抽象类
- python-3.x - Python Pandas:如何插入一个新列,该列是另一列的下一个“n”(也可以是分数)值的总和?
- angular - *ngIf 没有按预期隐藏/显示组件