系统任务和编译指令
目录
(1)获取仿真时间的系统函数:$time,$realtime,$stime
(5)用于暂停和退出仿真的系统任务:$stop和$finish
7.1、系统任务和系统函数
系统任务和系统函数是Verilog汇总预习定义好的,都以符号“$”开头,用于控制和检测仿真模拟过程。以下是几类常用的系统任务和系统函数:
(1)获取仿真时间的系统函数:$time,$realtime,$stime
$time返回一个64位的整数时间值;
$realtime返回的结果是实数时间值(更为精确);
$stime返回一个32位整数时间值。
(2)显示和打印系统任务:$display,$write
语法结构为:
$display([“format_specifiers”,]<argument_list>);//[ ]内为可选;
$write([“format_specifiers”,]<argument_list>);
(3)选通与监控系统任务:$strobe和$monitor
选通任务$strobe提供一种显示数据的机制,在所有同一时间单元内赋值语句执行完毕后才执行。(调用时的参数定义与$display有相同的参数列表格式,不同的是$display显示的变量值是执行该语句时变量的值,而$strobe显示的是执行该语句的仿真时刻的所有与执行完毕后的结果。)
监视任务$monitor能持续监控和输出参数列表中的表达式或变量值,持续监测(参数列表中)一个或多个信号的变化,即每当被监测的信号值发生变化,就将在当拍结束时显示该信号值。($monitor是唯一的不断输出信号值的系统任务,$monitor和$strobe一样,显示参数列表中信号的稳定状态值)
(4)用于文件操作的系统任务
- 文件的打开和关闭 $fopen,$fclose
在向文件写入数据或读出数据之前,都要使用$fopen打开一个文件,操作结束后要使用$fclose关闭文件。
- 写文件
四个格式化显示任务($display、$write、$monitor、$strobe)都有相对应的系统任务用于向指定任务输出,即
$fdisplay、$fwrite、$fmonitor、$fstrobe
- 读文件
系统任务$redmemb和$readmemh分别用于将文件中的二进制或十六进制读到存储器(即寄存器数组中)。
(5)用于暂停和退出仿真的系统任务:$stop和$finish
- $stop暂停仿真过程,但不会退出仿真环境,表现形式:
$stop;//同stop(1)
$stop(n);//n=0,1,2
其中,stop(0)表示暂停时不输出任何信息;stop(1)表示仿真暂停时输出当前仿真时刻和暂停处在程序中的位置;stop(2)表示除了完成stop(1),还给运行统计数据行,如仿真程序占用内存大小和CPU时间。
- $finish结束仿真并退出仿真过程(n=0,1,2,参数意义与stop相同)
(6)用于产生随机数的系统任务:$random
表现形式:
$random %b; // 其中b>0,给出范围在(-b+1,b-1)中的随机数;
Number = $random;// 返回一个32位的随机数,是一个带符号的整数;
Number = $random(seed);//每次调用会根据不同seed,返回不同的随机数。($random产生的随机数是伪随机序列)
7.2、预编译指令
Verilog可以对程序进行预编译处理,其使用方式为反引号“`”后跟预编译指令关键字。预编译指令的有效作用范围为定义命令之后到该文本结束或其他预编译指令替代该指令之处。
(1)宏定义和宏取消 `define和 `undef
`define是一个宏定义命令,其作用是用一个指定的标识符来代表一个字符串。其定义形式为:`define <MACRO_NAME> <MACRO_TEXT>
预编译处理时,这条指令将程序中所有该指令后的宏名MACRO_NAME都替换为宏文本MACRO_TEXT。
`undef用来取消前面已定义的宏,其定义形式为:`undef <MACRO_NAME>
使用`define和 `undef时需注意:
- 必须在一行内完成`define和 `undef,不能再行末加分号;
- MACRO_NAME可以用大写或小写字母表示,建议用大写字母,以与变量名区分,注意回避Verilog关键字;
- 宏文本不能被注释行、字符串标识符、确认符、关键字等分隔开;
- `define可出现在模块定义内或模块定义外,其有效范围为宏定义之后到源文件结束或其他命令替代该命令之处;
- 用宏名替换文本段或字符串,只做简单替换,不做语法检查;
- 在宏定义时,可饮用已定义的宏名,实现层层替换。
(2)时间尺度指令`timescale
`timescale用来说明该命令后模块的仿真时间单位和时间精度。仿真时间单位是模块仿真时间和延时的基准单位,仿真时间精度是模块是模块仿真时间和延时的精确程度,必须小于或等于仿真时间。
使用形式:`timescale 时间单位/时间精度
仿真时间和精度的单位 | |
时间单位 | 说明 |
s | 秒(1s) |
ms | 毫秒(10-3s) |
us | 微秒(10-6s) |
ns | 纳秒(10-9s) |
ps | 皮秒(10-12s) |
fs | 飞秒(10-15s) |
(3)条件编译指令`ifdef、`else、`endif
一般情况下Verilog源程序中所有的行都将参加编译,但如果希望根据环境需要只对一部分代码有选择地进行编译,就要使用条件编译,如对同一代码施加不同的Testbench。
`ifdef宏名已被定义过,则
程序段1;
`else
程序段2;
`endif
表示当宏名已被定义过,则对程序段1进行编译,忽略程序段2;否则编译程序段2,忽略程序段1.其中的`else部分也可以没有,即:
`ifdef宏名已被定义过,则
程序段;
`endif
(4)文件包含处理指令`include
文件包含处理是指一个源文件可将另外的源文件内容全部包含进来,使用时,包含的源文件内容全部插入到文件包含语句处。
其一般形式为:`include “filename”
其中:
- Filename可以是相对路径名,也可以是绝对路径名;
- 一条`include语句只能指定一个被包含文件,每条`include语句后不加分号;
- include命令可放在程序中任意需要的地方,但重复包含一个文件会引起错误。