$monitoron
和 $ monitoroff
的作用是通过打开和关闭监控标志来控制监控任务 $monitor
的启动和停止
$time
可以返回一个 64 位的整数来表示的当前仿真时刻,该时刻是以模块的仿真时间尺度位基准的
$finish
和 $finish(n)
用于退出仿真器。该语句可以携带参数 0、1、2,如果不带参数,默认 $finish
的参数值为 1,不同参数命令如下:
- 0 不输出任何信息
- 1 输出当前仿真时刻和位置
- 2 输出当前仿真时刻、位置和在仿真过程中所用 memory 以及 CPU 时间的统计
$stop
用于将 EDA 工具(例如仿真器)置成暂停模式,在仿真环境下给出一个交互式的命令提示符,将控制权交给用户。格式与 $finish
类似,不同参数命令如下:
- 0:不输出任何信息;
- 1:输出当前仿真时刻和位置;
- 2:输出当前仿真时刻、位置和仿真过程中所用的 memory 及 CPU 时间的统计
$random
用于产生一个随机数,当函数被调用时返回一个 32 位的随机数,它是一个带符号的整形数。
其用法是:$random %b
(b>0),它给出了一个范围在(-b+1): (b-1)中的随机数
num = {$random}%b
则是用于产生一个随机正数
define
宏定义用于使用一个指定的标识符,一般形式为:
`define signal string
例子 `define READ 8'h22
即在程序中将 READ 变量命名为 8'h 22,一般可以在大型程序中专门设计一个 global define.v
文件,一次性设置所有需要的变量,即有利于子模块书写时的流利性,也方便之后维护代码是对变量具体值的改变,只需要在 global define.v
中改变即可。
定义了相关变量之后,在代码中使用相关变量时,如上案例,则需要使用 `READ
,在宏定义中不需要使用 ;
,如果加上了会在调用中同样被置换。
`include
文件包含用于引用子模块,一般形式为:
`include "wenjian.v"
例子 `include "global_define.v"
即引用 global_define.V 文件。
在使用文件包含指令时,有几点需要说明:
- 该指令一次只能调用一个文件,多次调用就需要多次使用
- 该指令可以出现在文件的任何位置,包含的文件名可以是相对路径名,也可以是绝对路径名
- 如果文件 1 包含文件 2,而文件 2 要用到文件 3 的内容,则可以在文件 1 用两个
`include
分别引用文件 2 和文件 3,而且文件 3 应出现在文件 2 之前。
`timescale <时间单位>/<时间精度>
`ifdef
、`else
、`endif
其条件编译可以通俗的理解为,根据条件选择性地将指定部分综合为电路,而未被指定部分则不综合成电路,这可以有效地减少电路面积和提高代码的复用性和灵活性;也可以因为 Verilog 代码中的不同部分适用不同编译环境,如果不想设计两个不同版本的设计,则可以使用这种条件编译。
此三者与 `define
配套使用,形式如下:
`define bianliang1 <string>
`define bianliang2 <string>
`ifdef bianliang1
程序段1(包含bianliang1)
`ifdef bianliang2
程序段1(包含bianliang2)
`else
程序段2(此部分为上述几个else均不满足时默认调用的代码)
`endif