前言
在systemverilog中提供了许多输入输出的系统任务和函数,本文主要介绍Memory 加载和下载任务。
三、Memory 加载和下载任务
3.1 $readmemb $readmemh
这两个系统任务用来从文件中读取数据到存储器中。
$readmemb("<数据文件名>",<存贮器名>)
$readmemb ("<数据文件名>",<存贮器名>,<起始地址>)
$readmemb ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)
$readmemh("<数据文件名>",<存贮器名>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)
示例:
module memory();
reg [7:0] my_mem [0:255];
initial
begin
/*$readmemh("file",mem_array,start_addr,stop_addr);*/
$readmemh("mem.list", my_mem);
$display("0x00: %h", my_mem[8'h00]);
$display("0x01: %h", my_mem[8'h01]);
$display("0x55: %h", my_mem[8'h55]);
$display("0x56: %h", my_mem[8'h56]);
end
endmodule
/*
//comments are allowed
0xab //addr 8'h00
0xba //addr 8'h01
@55 //jump to 8'h55
0x55 //addr 8'h55
0xaa //addr 8'h56
*/
3.2 $writememb $writememh
$writememb和$writememh分别以二进制和十六进制的方式,将数据写入文件中。
写的用法和读的基本一致,但有几点是需要注意的:
1、如果文件存在,并且调用了这里的写任务,那么原有文件中的数据将会被覆盖;
2、只能写入两态的数据,例如int;
3、地址跳跃(@)的方式不被允许;
program mtest;
initial begin
bit[128:0] ddr[100];
std::randomize(ddr) with {
foreach(ddr[i]) {
ddr[i] inside {[0:100]};
}
};
foreach(ddr[i])
$display("ddr[%0d]= %h", i, ddr[i]);
$writememh("./mtest_log", ddr, 0, 100-1 );
end
endprogram
总结
本文主要介绍systemverilog中,Memory 加载和下载任务的用法。