在FPGA开发中编写仿真测试激励文件(testbench),经常会用到verilog的系统函数,使用系统函数非常方便,本文总结了常用的系统函数,并提供了说明和使用示例。
一、文件操作
1、打开文件$fopen和关闭文件$fclose
integer fp;
fp = $fopen("file_path/file_name","wb");
$fclose(fp);
打开文件$fopen函数:
第1个参数:文件路径,绝对路径和相对路径均可。
第2个参数:
定义 |
含义 |
r |
读操作 |
w |
写操作 |
a |
在文件末尾追加 |
rb,wb,ab |
以二进制的方式读、写、追加,推荐方式 |
返回值:0表示打开文件成功,非0值表示打开文件失败
关闭文件$fclose:参数是$fopen返回的整型变量。
2、写入文件:$fwrite,$fdisplay,$fmonitor,$fstrobe
$fdisplay(fp,"%d", dout);
$fwrite(fp,"%d", dout);
$fmonitor(fp, "%h", $time);
$fstrobe(fp, "%h", 16'h78)
$fdisplay等函数是将数据写入到指定文件中,第一个参数是文件指针,第二个参数是写入数据格式,第三个参数是写入数据。
写入数据格式:
%d |
十进制格式 |
%c |
单字符格式 |
%x |
16进制格式 |
说明:
$fdisplay 调用即执行,可以自动换行,
$fwrite调用即执行,换行则需写成“%d\n”。
$fmonitor只有在变量发生变化时,才会写入文件,在initial中调用一次即可。
$fstrobe语句执行完毕后写文件
3、读取文件:$fread,$readmemb,$readmemh,$fget
读取文件函数,需要设定存储器用来存储数据,存储器可设定为二维数组。
(1)$fread函数
$fread(mem, fd, start, count)
参数说明:mem是存储数组或寄存器变量 ,fp为文件指针,start 为文件起始地址,count 为读取长度。若 start和count省略,数据会全部填充至变量 mem。
(2)$readmemb和$readmemh函数
$readmemh("file_path/file_name",mem,start, end);
$readmemb("file_path/file_name",mem,start, end);
$readmemb是以2进制读取,$readmemh是以16进制读取
参数说明:file_path/file_name为文件路径,mem是存储数组或寄存器变量 ,start 为起始地址,end 为结束低至。若 start和end省略,数据会全部填充至变量 mem。
(3)$fgetc函数和 $fgets函数
$fgetc( fd ) ,按字符读取文件,每次执行读取8bit。
$fgets(str, fd),按行读取文件,每次执行读取一行。
localparam FILE_LEN = 1000;
localparam WIDTH = 8;
integer num, i;
reg [WIDTH-1:0] mem [0:FILE_LEN-1];
reg [WIDTH-1:0] mem_r;
reg [31:0] mem_load [3:0] ;
reg [99:0] line_buf [9:0] ;
//方法1
$fread(mem,fp,0,FILE_LEN);//数组型读取
$fread(mem_r,fp);//单个寄存器
//方法2
$readmemb("file_path/file_name", mem);
$readmemb("file_path/file_name", mem,0,FILE_LEN-1);
$readmemh("./DATA_WITHNOTE.HEX", mem_load);
//方法3
mem[0] = $fgetc(fp);
for(i=0;i<FILE_LEN;i=i+1) begin
mem[i] = $fgetc(fp);
end
//方法4
for(i=0;i<9;i=i+1) begin
$fgets(line_buf[i], fd);
end
4、文件定位
pos = $ftell( fd ) ; 获取文件位置函数,返回文件当前位置距离文件首部的偏移量,偏移量为字节。
$fseek(fd, offset, type) ; 重定位函数,offset 为偏移量,type 为偏移参考地址,0表示文件起始位置,1表示当前位置,2表示文件末尾地址。
$rewind( fd ) ; 等价于 $fseek( fd, 0, 0) ,重新将文件指针的位置指向文件首部
$feof(fd) ; 文件末尾检测函数,检测到文件末尾时返回值为 1,否则为 0。
pos = $ftell(fd);
$fseek(fd, 6, 0) ; //重定位到文件起始后的第6个地址
$fseek(fd, 6, 1) ; //重定位到当前地址后的第6个地址
$rewind(fd);//重新将文件指针的位置指向文件首部
二、显示/打印类
用于在终端显示打印出信息,常用函数:$display,$strobe,$monitor
$display("<string>", variables);
$strobe("<string>", variables);
输出格式:
%h 十六进制格式输出 %c ASCII 码格式输出
%d 十进制格式输出 %e 指数格式输出
%o 八进制格式输出 %f 浮点数 (real 型) 格式输出
%b 二进制格式输出 %t 当前时间格式输出
%s 字符串格式输出 %m 当前层次访问路径输出
转义字符:
\n |
换行符 |
%% |
百分号"%" |
\t |
制表符(Tab 键) |
\0 |
八进制代表的字符 |
\\ |
反斜杠"\"符 |
\0x |
十六进制代表的字符 |
\" |
双引号 |
说明:
$display不管是阻塞赋值还是非阻塞赋值,直接打印结果。
$strobe执行等到非阻塞赋值完成后再打印结果。
$monitor用于变量的持续监测,只要变量发生变化,就会打印显示。
三、其它
1、随机数产生函数
$random,用于产生随机数
//num为范围在 -(b-1):(b-1) 中的随机数, b为十进制整数
num = $random%b;
//产生随机正整数, 在 0:(b-1) 中的随机数
num = {$random}%b
2、仿真过程控制函数
$finish表示结束当前仿真,$stop表示暂停当前仿真。文章来源:https://www.toymoban.com/news/detail-741975.html
$finish;
$stop;
3、显示仿真时间
$time返回整数时间值,$realtime返回实数时间值,都是以仿真开始时的仿真时间为参考。 文章来源地址https://www.toymoban.com/news/detail-741975.html
$display($time,“ dout=%d”,dout);
到了这里,关于verilog常用系统任务和函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!