SystemVerilog的readmemh函数

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开头的地址或数据
在这里插入图片描述

实测, 不支持十六进制格式的地址:
在这里插入图片描述

实测, 十进制格式地址也不支持:
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值