SystemVerilog的readmemh函数
chatGPT的回答
基本用法
SystemVerilog的readmemh
函数用于从十六进制文件中读取数据并存储到内存中。该函数的文件格式遵循以下规则:
- 每行表示一个十六进制数。
- 每个十六进制数可以包含0-9和A-F(大写或小写)的字符。
- 每个十六进制数可以有可选的前缀"0x"或"0X"。 实际上我发现0x开头数据会报错
- 可以在每个十六进制数之间使用空格、制表符或逗号进行分隔。
- 可以在每行的末尾添加注释,注释以"//“或”/* */"的形式表示。
下面是一个示例十六进制文件的内容:
000A
00B2
00CD
以上示例文件包含了三个十六进制数。每行表示一个十六进制数,可以有可选的地址指定。每个十六进制数可以包含0-9和A-F(大写或小写)的字符,并且可以使用空格、制表符或逗号进行分隔。
接下来,我们可以使用readmemh
函数将文件中的数据读取并存储到内存中。以下是一个使用readmemh
函数的例子:
module Example;
reg [7:0] memory [0:2]; // 声明一个大小为3的字节内存数组
initial begin
$readmemh("data_file.txt", memory); // 从文件中读取数据并存储到内存中
$display("Memory contents:");
for (int i = 0; i < 3; i++)
$display("memory[%0d] = %h", i, memory[i]);
end
endmodule
在上述例子中,我们声明了一个大小为3的字节内存数组memory
,然后使用$readmemh
函数从名为data_file.txt
的文件中读取数据并存储到memory
数组中。最后,我们使用$display
函数显示内存的内容。
假设data_file.txt
文件的内容如上所示,运行上述代码将输出以下结果:
Memory contents:
memory[0] = 0A
memory[1] = B2
memory[2] = CD
这样,文件中的十六进制数据将被读取并存储到内存数组中的相应位置。
指定地址的hex
在SystemVerilog的readmemh
函数中,每一行开头是可以指定地址的。你可以在每一行的开头使用地址值,后跟一个冒号(:),然后是十六进制数。
以下是一个示例文件,其中每一行都有地址指定:
// Example.hex
// This is a sample hexadecimal file with address
@0 200A
@1 1F 2C 3D
@2 0x4E, 5f, 6a
在上述示例中,每一行的开头都有一个地址值,后跟一个冒号。readmemh
函数将读取该文件并将地址及对应的十六进制数存储到内存中。
假设你有一个SystemVerilog数组:
reg [7:0] memory [3:0];
你可以使用readmemh
函数将文件中的数据加载到该数组中:
initial begin
$readmemh("Example.hex", memory);
end
在上述示例中,readmemh
函数将文件"Example.hex"中的地址及对应的十六进制数存储到memory
数组中,其中memory[0]
将存储地址0对应的十六进制数,memory[1]
将存储地址1对应的十六进制数,依此类推。
实测结果
1、 @地址开头的格式:
实测发现下面这种格式是支持的:
2、不带地址的数据格式:
bin文件转换脚本如下:
#!/bin/python3
# -*- coding: utf-8 -*-
import sys
def bin_to_hex_string(bin_file, hex_file):
with open(bin_file, 'rb') as f_in, open(hex_file, 'w') as f_out:
while True:
data = f_in.read(4) # read 4 bytes data
if not data:
break
hex_string = ''.join(f'{byte:02x}' for byte in data[::-1]) #covert to little-endian
f_out.write(hex_string + '\n')
if __name == '__mian__':
if(len(sys.argv) < 3):
print('Usage: python3 bin_to_hex.py <bin_path> <hex_path>')
sys.exit(1)
bin_file = sys.argv[1]
hex_file = sys.argv[2]
bin_to_hex_string(bin_file, hex_file)
转出文件格式如下, 实测支持:
3、地址: 数据格式的hex:
结论:不支持这种格式
实测: 不支持0x开头的地址或数据
实测, 不支持十六进制格式的地址:
实测, 十进制格式地址也不支持: