在 Verilog 中,文件操作任务 $readmemh 和 $readmemb 用于从外部文件中读取数据,并将其加载到内存数组中。这两个系统任务的区别主要在于数据的格式:
$readmemh:从文件中读取十六进制格式的数据(h 代表 Hexadecimal)。
$readmemb:从文件中读取二进制格式的数据(b 代表 Binary)。
使用方法
语法
$readmemh("filename", memory_array); // 读取十六进制文件
$readmemb("filename", memory_array); // 读取二进制文件
$display("memory[%0d] = %h", i, memory[i]);//数据打印
参数说明:
filename:外部文件的名称,包含待加载的十六进制或二进制数据。文件路径可以是绝对路径或相对路径。
memory_array:Verilog 中的数组,数据将被加载到该数组中。
文件操作的用途
这两个系统任务常用于将 ROM、RAM 或 LUT 的初始化数据加载到数组中。
它们适合加载较大数据集,避免在代码中直接硬编码数据。
代码案例分析
module tb;
reg [3:0] memory [0:3]; // 存储数据的4位宽数组,存储4个数据
integer i;
initial begin
// 从文本文件读取二进制数据到 memory 数组
// 使用 readmemb 读取二进制文件,使用 readmemh 读取十六进制文件
$readmemb("data.txt", memory); // 如果是十六进制数据则使用 $readmemh
// 输出读取的数据以验证
for (i = 0; i < 4; i = i + 1) begin
$display("memory[%0d] = %b", i, memory[i]);
end
// 结束仿真
$finish;
end
endmodule
代码功能总结
这段 Verilog 代码的功能是通过一个测试平台(testbench)从外部文件中读取二进制数据或十六进制数据,并将其加载到内存数组中,随后将内存中的数据输出到仿真器控制台,以验证数据的正确性。最后,它在仿真完成后自动结束。
主要功能点:
1.内存数组声明:
声明了一个 4 个 4 位宽的 memory 数组,用于存储从文件读取的 4 个数据值。
2.文件读取:
使用 $readmemb 从 data.txt 文件中读取二进制数据,并将其存储到 memory 数组中。
如果需要读取十六进制数据,可以将 $readmemb 替换为 $readmemh,读取十六进制格式的数据。
3.数据输出:
通过 for 循环遍历 memory 数组,并使用 $display 将每个内存单元的数据以二进制格式输出到仿真器控制台,显示其对应的值。
4.仿真结束:
读取和输出操作完成后,调用 $finish 系统任务,结束仿真。