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

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Verilog是一种硬件描述语言,用于描述数字电路。在Verilog,有许多系统函数(system functions)和任务(tasks),以下是一些常见的系统函数任务: 1. $display:用于在仿真打印消息。 2. $monitor:监视信号的值,并在信号发生变化时打印消息。 3. $random:生成随机数。 4. $time:返回当前仿真时间。 5. $finish:终止仿真。 6. $readmemh:从文件读取十六进制格式的数据。 7. $readmemb:从文件读取二进制格式的数据。 8. $fwrite:向文件数据。 9. $fopen:打开文件。 10. $fclose:关闭文件。 这些是Verilog一些常见的系统函数任务。除此之外,还有许多其他的系统函数任务,如$displayb、$stime、$fatal、$setup等。 ### 回答2: Verilog有一些常用系统函数可用于进行数据处理和仿真调试。以下是一些常见的Verilog系统函数: 1. $display():此函数用于在仿真运行时显示消息和变量的值。它使用类似于C语言的printf()函数的格式。 2. $monitor():此函数类似于$display()函数,但它会自动在系统的任何进程触发消息输出,并且不需要手动调用。 3. $strobe():此函数用于在仿真期间产生一个刺激脉冲。它通常在测试时用于控制输入信号的变化。 4. $time:此系统变量返回当前仿真的时间值,以时间单位来表示。它可以用于在仿真过程输出和比较时间信息。 5. $finish():此函数用于在仿真完成后结束仿真过程,即在仿真运行时终止仿真。 6. $random:此系统函数用于在仿真生成随机数。它可以用于产生随机模拟环境和测试用例。 7. $cast():此函数用于在不同的数据类型之间进行强制转换。它可以将一种数据类型转换为另一种数据类型,例如将整数转换为实数。 需要注意的是,这些系统函数在不同的Verilog仿真工具可能会有一些差异,因此在使用这些函数时应查阅相应的工具手册以获取正确的语法和用法。 ### 回答3: Verilog语言包含了一些系统函数,用于方便地处理数字逻辑设计的一些常见操作。下面是Verilog一些常用系统函数: 1. $display: 用于在仿真显示消息或变量的值。可以使用格式控制字符串来输出不同类型的数据。 2. $monitor: 用于监视变量的值变化,并在变化时立即显示消息或变量的值。 3. $finish: 用于结束仿真过程,并输出概要信息。 4. $time: 返回当前仿真时间的数值,以模拟时钟周期的单位表示。 5. $random: 生成一个随机数,可以通过参数设置随机数的范围和分布。 6. $strobe: 在仿真过程周期性地显示消息或变量的值,类似于$display。 7. $stop: 在仿真过程暂停进程,直到手动继续。 8. $test$plusargs: 用于在仿真运行时读取仿真启动参数。 9. $cast: 用于将一个数据类型转换为另一个数据类型。 10. $signed: 将无符号整数转换为有符号整数。 11. $unsigned: 将有符号整数转换为无符号整数。 12. $feof: 在文件结尾处检查文件是否已结束。 这些是Verilog一些常见的系统函数,用于在仿真过程方便地进行一些操作和输出信息。然而,需要注意的是,这些系统函数在硬件设计一般不会使用,它们主要用于仿真和调试过程的方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值