https://www.runoob.com/w3cnote/verilog2-file.html
经常使用的系统任务主要包括:
- 文件开、闭:$fopen, $fclose, $ferror
- 文件写入:$fdisplay, $fwrite, $fstrobe, $fmonitor
- 字符串写入:$sformat, $swrite
- 文件读取:$fgetc, $fgets, $fscanf, $fread
- 文件定位:$fseek, $ftell, $feof, $frewind
- 存储器加载:$readmemh, $readmemb
文章目录
一、fopen fclose
二、文件写入
写文件的系统任务主要包括:$fdisplay, $fwrite, $fstrobe, $fmonitor,以及它们对应的自带格式的系统任务 $fdisplayb, $fdisplayh, $fdisplayo 等。
调用格式 任务描述
$fdisplay(fd, arguments) ; 按顺序或条件写文件,自动换行
$fwrite(fd, arguments) ; 按顺序或条件写文件,不自动换行
$fstrobe(fd, arguments) ; 语句执行完毕后选通写文件
$fmonitor(fd, arguments) ; 只要数据有变化就写文件
相对于标准显示任务 $display, $write, $strobe, $monitor,写文件系统任务除了用法格式上需要多指定文件描述符 fd,其余打印条件、时刻特性等均与其对应的显示任务保持一致。
$fwrite(file_result[0], "%c", data[7:0 ]
//(2) write file
integer fd ;
integer err, str ;
initial begin
fd = $fopen("./DATA_RD.HEX", "a+"); //末尾追加的方式打开
err = $ferror(fd, str);
if (!err) begin
$fdisplay(fd, "New data1: %h", fd) ;
$fdisplay(fd, "New data2: %h", str) ;
$fdisplay(fd, "New data3: %h", err) ;
//$write(fd, "New data3: %h", err) ; //最后一行不换行打印
end
$fclose(fd);
end
三、文件读取
file_read_functions ::=
$fgetc ( fd )
| $ungetc ( c , fd )
| $fgets ( str , fd )
| $fscanf ( fd , format , args )
| $sscanf ( str , format , args )
| $fread ( integral_var , fd )
| $fread ( mem , fd [ , [ start ] [ , count ] ] )
1. $fgetc
$fgetc 从文件中读取一个字符, 每执行一次$fgetc,就从文件中读取一个字符, 文件的指针自动加一。 当读取到文件结束时, $fgetc 返回 -1, 可以通过-1(EOF) 来定位文件读取结束。
A single character can be read from a file using $fgetc. For example:
Example 1:
integer c;
c = $fgetc ( fd );
2. $ungetc
Example 2:
integer code;
code = $ungetc ( c, fd );
$ungetc inserts the character specified by c into the buffer specified by file descriptor fd. The character c shall be
returned by the next $fgetc call on that file descriptor. The file itself is unchanged.
3. $fscanf
按照格式将文件中的数据读到变量中, 格式可以参考$display 中的格式化内容。如果遇到空格或者换行,表示一次读取结束。 读取时,如果发生错误 则返回值为0,正常读取数据时为1, 读取文件结束时为-1。
4. $fread
$fread
integer ;
= $fread(,<file_desc>);
= $fread(,<file_desc>, );
= $fread(,<file_desc>, , );
= $fread(,<file_desc>, , );
integer:整型数值,返回本次$fread 读取的真实字节数量,当返回值为0 ,表示错误读取或者文件结束。
store:将二进制文件中的数据读取到寄存器或者二维数组中。
file_desc:为打开的文件句柄
start: 为二维数组的起始地址
count: 从起始地址开始, 写入二维数组的数量。
四、文件定位
https://www.runoob.com/w3cnote/verilog2-file.html
- 文件定位:$fseek, $ftell, $feof, $frewind
1. $fseek 使用 (转 )
= $fseek(<file_desc>, <offset_value>, <operation_number>);
integer:定义整型变量,用于
f
s
e
e
k
的返回值。如果
fseek的返回值。如果
fseek的返回值。如果fseek成功执行,返回0; $fseek执行失败,返回-1。
file_desc:为打开的文件句柄
offset_value:相对于文件的参考指针,偏移的位置, 可以是正数,也可以是负数。
operation_number:定位文件指针的起始位置。 0,文件的起始位置;1,文件的当前位置; 2 文件结束的位置。
`timescale 1ns / 1ps
module sim_top(
);
reg stop_flag = 0;
localparam F_START = 0,
F_CURR = 1,
F_END = 2;
localparam FILE_TXT = "../../../test.txt";
integer fd;
integer ret;
integer i;
integer pos;
reg [7:0] fbuf = 0;
initial begin
i = 0;
ret = 0;
fd = $fopen(FILE_TXT, "r");
if(fd == 0)
begin
$display("$open file failed") ;
$stop;
end
$display("\n ============= file opened... ============= ") ;
ret = $fseek(fd, 1,F_START);
if($signed(ret) == -1)
begin
$display("$fseek failed") ;
$stop;
end
pos = $ftell(fd);
$display("pos = %d", pos) ;
fbuf = $fgetc(fd);
pos = $ftell(fd);
$display("pos = %d", pos) ;
#10;
$write("%c", fbuf) ;
i = i + 1;
ret = $fseek(fd, -5,F_END);
if($signed(ret) == -1)
begin
$display("$fseek failed") ;
$stop;
end
while ($signed(fbuf) != -1)
begin
fbuf = $fgetc(fd);
#10;
$write("%c", fbuf);
i = i + 1;
end
#10;
$fclose(fd) ;
$display("\n ============= file closed... ============= ") ;
stop_flag = 1;
#100;
$stop;
end
endmodule
ret = $fseek(fd, 1,F_START); 是从文本文件的起始位置,向后偏移一个字节。 然后开始读取文本文件的数据;ret = $fseek(fd, -5,F_END); 是将文件指针定位到文件结束的位置,向前偏移 5 个字节, 然后开始读取文本文件的数据。
2. $ftell使用
获取文件位置
= $ftell(<file_desc>);
- reg:返回文件当前位置距离文件首部的偏移位置,初始位置为0.
- file_desc:为打开的文件句柄
- 这个系统函数的作用是找到当前的位置(距离文件首部),是以字节为单位的。
- 配合 $fseek 使用。
可以看到,$fseek (fd, 1, F_START); 后 使用 pos = $ftell(fd); 输出为1; 在读取一个字节后(fbuf = $fgetc(fd);), 再使用 pos = $ftell(fd),输出结果为 2。
3. $feof使用
= $feof(<file_desc>);
reg:检查文件指针是否到达文件尾部, 如果到达文件尾部,返回1; 否则返回0;
file_desc:为打开的文件句柄
五、Verilog 显示任务
关键词:$display, $write, $strobe, $monitor
1. $display,$write
$display与$write的区别是:$display会在每次显示信息后自动换行,$write不会换行。
2. $strobe
$strobe
$strobe 为选通显示任务。$strobe 使用方法与 $display 一致,但打印信息的时间和 $display 有所差异。
当许多语句与 $display 任务在同一时间内执行时,这些语句和 $display 的执行顺序是不确定的,一般按照程序的顺序结构执行。
$strobe 则是在其他语句执行完毕之后,才执行显示任务。该时间是当前仿真时间的结束时间
3. $monitor
$monitor 为监测任务,用于变量的持续监测。只要变量发生了变化,$monitor 就会打印显示出对应的信息。
reg [3:0] cnt ;
initial begin
cnt = 3 ;
forever begin
# 5 ;
if (cnt<7) cnt = cnt + 1 ;
end
end
initial begin
$monitor("Counter change to value %d at the time %t.", cnt, $time);
end
六、Memory load/dunp tasks
$readmemh和$readmemb
Verilog文件读写是指在Verilog编程中,读取或写入文件的操作。这些文件可以是文本文件、二进制文件或其他格式的文件。在Verilog中,可以使用$readmemh和$readmemb函数来读取文本文件,$fread和$fwrite函数来读写二进制文件。
$readmemh和$readmemb函数用于读取文本文件中的十六进制或二进制数据。这些函数的语法如下:
$readmemh(filename, arrayname);
$readmemb(filename, arrayname);
其中,filename是要读取的文件名,arrayname是要将数据存储到的数组名。例如,以下代码将从名为“data.txt”的文件中读取十六进制数据,并将其存储到名为“data”数组中:
reg [31:0] data[0:255];
$readmemh("data.txt", data);
$writememb $writememh
七、Command line input
$test$plusargs
是SystemVerilog中用于获取命令行参数的系统任务。它允许你在运行仿真时从命令行传递参数给仿真器。这在调试和配置仿真环境时特别有用。
以下是一个简单的示例,说明了如何使用 $test$plusargs
:
module testbench;
initial begin
string arg_value;
if ($test$plusargs("input_file=%s", arg_value)) begin
$display("Input file specified: %s", arg_value);
// 在这里可以处理输入文件名
end else begin
$display("No input file specified");
end
end
endmodule
在这个例子中,$test$plusargs
任务尝试从命令行参数中匹配指定的格式,如果匹配成功,它会将参数值赋给指定的变量,并返回1。如果没有匹配成功,则返回0。
例如,如果你运行仿真器时输入以下命令:
vsim -c -do "run -input_file=test.txt" testbench
那么 $test$plusargs
将匹配 -input_file=test.txt
,并将test.txt
保存到arg_value
中。
希望这个简单的示例能够帮助你理解 $test$plusargs
的使用。如果你有其他问题,欢迎继续提问。
————————————————————————————————————————————————————————
在 SystemVerilog 中,$value$plusargs
是用于从命令行参数中获取一个带有特定格式的字符串值的系统函数。这个函数可以用于从仿真器的命令行中提取特定格式的参数值,然后在仿真过程中使用这些值。
下面是一个简单的示例,展示了如何使用$value$plusargs
:
module testbench;
string input_file;
int debug_level;
initial begin
if ($value$plusargs("input_file=%s", input_file)) begin
$display("Input file specified: %s", input_file);
end
if ($value$plusargs("debug_level=%0d", debug_level)) begin
$display("Debug level specified: %0d", debug_level);
end
end
endmodule
在这个例子中,$value$plusargs
函数尝试从命令行参数中匹配指定的格式,并将匹配的值赋给相应的变量。如果匹配成功,则函数返回1;否则返回0。
例如,如果你在运行仿真器时输入以下命令:
vsim -c -do "run -input_file=test.txt +debug_level=2" testbench
那么 $value$plusargs
将匹配 -input_file=test.txt
和 +debug_level=2
,并将分别将test.txt
保存到input_file
中,将2
保存到debug_level
中。