verilog读取的二进制与十六进制文件的格式问题

本文介绍了在Verilog中遇到的十六进制文件格式问题,指出网上常见的Intel Hex格式并不适用于Verilog的$readmemh命令。正确的格式应包含地址和数据,如@example AA 55。此外,还提到了Model Sim中的$readmem和$readmemh函数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 今天一个上午的时间,都被这个问题所困扰,在网上查询十六进制文件的一般格式,都是这么说的,文件由一条条的记录组成,每条记录都有固定的几个部分组成。具体的格式如下:
:10008000AF5F67F0602703E0322CFA92007780C361
:1000900089001C6B7EA7CA9200FE10D2AA00477D81
:0B00A00080FA92006F3600C3A00076CB
:00000001FF
第一行,":"符号表明记录的开始. 后面的两个字符表明记录的长度,这里是10h. 后面的四个字符给出调入的地址,这里是0080h. 后面的两个字符表明记录的类型;0 数据记录 1 记录文件结束 2 扩展段地址记录 3 开始段地址记录 4 扩展线性地址记录 5
开始线性地址记录后面则是真正的数据记录, 最后两位是校验和检查,它加上前面所有的数据和为0.最后一行特殊,总是写成这个样子.
扩展Intel Hex的格式(最大1M): 由于普通的Intel的Hex记录文件只能记录64K的地址范围,所以大于64K的地址数据要靠扩展Intel Hex格式的文件来记录.对于扩展形式Hex文件,在每一个64K段的开始加上扩展的段地址规定,下面的数据地址均在这个段内,除非出现新的段地址定义.
一个段地址 定义的格式如下:
起始符 长度 起始地址 扩展段标示 扩展段序号 无用 累加和
: 02 0000 02 3000 EC

尝试了很多遍,却发现这种文件格式是verilog不能读出来的,总是提示一个这样的warning:Too many digits......

后来再从网上找了找,发现verilog中所说的十六进制文件格式并不是这样,如下:
Verilog提供了$readmemb和$readmemh命令来读ASCII格式文件,以初始化存储器内容。这个命令也可以在仿真中用来初始化Xilinx的BlockRAM或者SelectRAM元件。其语法格式如下:
$readmemb (“<design.mif>”,design_instance);
MIF是由coregen生成的存储器初始化文件,其内容由用户来定义。

在 Mod

### 实现Verilog读取十进制文件Verilog中处理外部数据文件通常涉及使用系统任务 `$readmemb` 或者 `$readmemh` 来加载内存初始化文件的内容到模块内部定义的记忆体数组里。然而,这些命令主要用于十六进制二进制格式的数据。对于需要逐行解析并转换成数值形式的十进制文件,则需采用不同的方法。 为了能够读取十进制文件,在仿真环境中可以利用FPGA厂商提供的特定函数或是通过编写自定义的任务来完成此操作。一种常见的方式是借助于SystemVerilog中的高级特性,比如使用C语言接口(DPI-C),这允许调用外部编写的C程序来进行复杂的输入/输出操作[^2]。 如果目标是在纯Verilog环境下工作而不依赖额外工具链支持的话,那么可以通过创建一个顶层测试平台(Testbench),在这个平台上运用 `$fopen`, `$fgets`, 和 `$fclose` 这样的标准I/O库函数来打开、读取以及关闭文本文件。下面给出了一段简单的代码片段用于说明如何实现这一点: ```verilog module tb_read_decimal_file; integer fd; // File descriptor string line; // Buffer for storing each line from file reg [31:0] data_reg; // Register to store converted decimal values initial begin // Open the file for reading fd = $fopen("decimal_data.txt", "r"); if (fd == 0) begin $display("Failed to open file."); $finish; end while (!$feof(fd)) begin : read_loop // Read one line at a time until EOF reached $fgets(line, fd); // Convert ASCII string representation of number into an integer data_reg = line.atoi(); // Process 'data_reg' as needed... $display("Read value %d", data_reg); end // Close the opened file after done with processing all lines $fclose(fd); end endmodule ``` 这段脚本展示了怎样在一个模拟环境下的Testbench中执行基本的文件IO流程,并且将每一行字符串表示的整数转化为实际可用的形式以便后续计算或其他用途。值得注意的是 `line.atoi()` 方法假设每行仅包含有效的整型数字字符;如果有更复杂的情况则可能还需要加入错误检测逻辑以确保稳健性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值