verilog常用系统任务和函数

        在FPGA开发中编写仿真测试激励文件,经常会用到verilog的系统函数,使用系统函数会非常方便,本文总结了常用的系统函数,并提供了说明和使用示例。

一、文件操作

1、打开文件和关闭文件

integer fp;
fp = $fopen("file_path/file_name","wb");
$fclose(fp);

打开文件$fopen函数:

        第1个参数:文件路径,绝对路径和相对路径均可。

        第2个参数:

        返回值:0表示打开文件成功,非0值表示打开文件失败

        关闭文件$fclose函数:参数是$fopen返回的整型变量

2、写入文件

$fdisplay(fp,"%d", dout);
$fwrite(fp,"%d", dout);
$fmonitor(fp, "%h", $time);
$fstrobe(fp, "%h", 16'h78)

        $fdisplay等函数是将数据写入到指定文件中,第1个参数是文件指针,第二个参数是写入数据格式,第3个参数是写入数据。

        写入数据格式:

说明:

        $fdisplay 调用即执行,可以自动换行,

        $fwrite调用即执行,换行则需写成“%d\n”。

        $fmonitor只有在变量发生变化时,才会写入文件,在initial中调用一次即可。

        $fstrobe语句执行完毕后写文件

3、读取文件

        读取文件函数,需要设定存储器用来存储数据,存储器可设定为二维数组。

$fread(mem, fd, start, count)

        参数说明:mem是存储数组或寄存器变量 ,fp为文件指针,start 为文件起始地址,count 为读取长度。若 start和count省略,数据会全部填充至变量 mem即停。

$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。

        $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);

        输出格式:

        转义字符:

说明:

        $display不管是阻塞赋值还是非阻塞赋值,直接打印结果。

        $strobe执行等到非阻塞赋值完成后再打印结果。

        $monitor用于变量的持续监测,只要变量发生变化,就会打印显示。

三、其它

1、随机数产生函数

        $random,用于产生随机数

//num为范围在 -(b-1):(b-1) 中的随机数, b为十进制整数
num = $random%b;
//产生随机正整数, 在 0:(b-1) 中的随机数
num = {$random}%b

2、仿真过程控制函数

        $finish表示结束当前仿真,$stop表示暂停当前仿真。

$finish;
$stop;

3、显示仿真时间

        $time返回整数时间值,$realtime返回实数时间值,都是以仿真开始时的时间为参考。

$display($time,“ dout=%d”,dout);

猜你喜欢

转载自blog.csdn.net/jk_101/article/details/129793734
今日推荐