SystemVerilog/Verilog的testbench中文件的写入和读取操作

在Testbench中很可能需要文件的读写操作,在可综合的设计中也可能会用到文件写入。SystemVerilog/Verilog提供的文件写入读取方法并不多,主要有两类。

第一类是writememb/writememh/readmemb/readmemh,第二类是$fscanf/$fwrite。第一类用法简单,但是功能弱,文件读取也不支持多维数组;第二类用法复杂一点,功能相对强大,配合循环语句可以处理多维数组。

1. writemem[b|h]/readmem[b|h]

writemem[b|h]主要有以下用法:

(1)$readmemb("<数据文件名>",<存储器名>);

(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);

(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);

其中起始地址和终止地址都是相对于“存储器名”指定的数据而言,而不是指写入文件时的位置。参考以下代码。

parameter WIDTH         = 8;
parameter INDEX0        = 16;
parameter FILE_PATH_B   = "E:/FPGA/PRACTICE/FileReadWrite/files/file_b.txt";
parameter FILE_PATH_H   = "E:/FPGA/PRACTICE/FileReadWrite/files/file_h.txt";
parameter FILE_PATH_F   = "E:/FPGA/PRACTICE/FileReadWrite/files/file_f.txt";
parameter FILE_PATH_HALF= "E:/FPGA/PRACTICE/FileReadWrite/files/file_half.txt";
 
reg     [WIDTH-1: 0]    dat0[INDEX0-1: 0], dat1[INDEX0-1: 0];
wire    [WIDTH-1: 0]    dat1_comp[INDEX0-1: 0];
reg     [WIDTH-1: 0]    dat0_read[INDEX0-1: 0];
integer i, j;
integer fid;
 
initial begin
    for( i=0; i

$writememb( FILE_PATH_B, dat0, 0 )将以二进制的格式写入数据,如下图所示。每个数据占据一行。注意,使用writememb写入的文件也要通过readmemb读出,否则数据可能是错误的

SystemVerilog/Verilog的testbench中文件的写入和读取操作

$writememb( FILE_PATH_B, dat0, 0 )将以二进制的格式写入数据。

$writememh( FILE_PATH_HALF, dat0, INDEX0/2 )将从dat0[8]开始按照十六进制写入数据,如下图所示。

SystemVerilog/Verilog的testbench中文件的写入和读取操作

$readmemb和$reamdmemh可以从文件中读取数据,其用法如下。

(1)$readmem[b|h]("<数据文件名>",<存储器名>);

(2)$readmem[b|h]("<数据文件名>",<存储器名>,<起始地址>);

(3)$readmem[b|h]("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);

其中起始地址是指从数据文件中读取的数据将从“存储器名”的指定地址开始填充,参考上文程序中的以下语句。

$readmemh( FILE_PATH_H, dat0_read, INDEX0/2 );

for( i=0; i

从FILE_PATH_H中读取的数据将从dat0_read的地址INDEX0/2的位置开始填充,而dat0_read中未初始化且未填充的数据为“x”,如下图所示。

SystemVerilog/Verilog的testbench中文件的写入和读取操作

注意,readmem[b|h]是将数据放在存储器中,所以dat0_read应该定义为reg型,而不是wire。

此外,readmem[b|h]是不能填充二维数据的。比如reg [M:N] dat[X:Y]是可以使用readmem[b|h]填充的,而reg [M:N] dat[X:Y] [A:B]是不可以用作readmem[b|h]的操作对象的。

2. $fwrite和$fscanf

2.1 基本用法

这两个系统函数的功能更强大,参考以下代码。

initial begin
    for( i=0; i   
              
                
            
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章