宏定义`define
用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:
`define 标识符(宏名) 字符串(宏内容)
如:`define signal string
它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string。这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。`define是宏定义命令。
例子:
`define WORDSIZE 8
module
reg[1:`WORDSIZE] data; //这相当于定义 reg[1:8] data;
在引用已定义的宏名时,必须在宏名的前面加上符号“`”,表示该名字是一个经过宏
定义的名字。
宏定义不是Verilog HDL语句,不必在行末加分号。如果加了分号会连分号一起进行置
换。
宏定义不是Verilog HDL语句,不必在行末加分号。如果加了分号会连分号一起进行置
换。
- 注释行
- 数字
- 字符串
- 确认符
- 关键词
- 双目和三目字符运算符
条件编译`ifdef
语法
// Style #1: Only single `ifdef
`ifdef <FLAG>
// Statements
`endif
// Style #2: `ifdef with `else part
`ifdef <FLAG>
// Statements
`else
// Statements
`endif
// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
// Statements
`elsif <FLAG2>
// Statements
`elsif <FLAG3>
// Statements
`else
// Statements
`endif
它的作用是当宏名已经被定义过(用define命令定义),则对程序段1进行编译,程序段2将被忽略; 否则编译程序段2,程序段1被忽略。其中
else部分可以没有
**注意:被忽略掉不进行编译的程序段部分也要符合Verilog HDL程序的语法规则。 **
通常在Verilog HDL程序中用到ifdef、
else、`endif编译命令的情况有以下几种:
- 选择一个模块的不同代表部分。
- 选择不同的时序或结构信息。
- 对不同的EDA工具,选择不同的激励。
请注意, 默认情况下, rstn 不会在编译设计时被包含, 因此它不会出现在 port 列表中。但是, 如果在任何属于编译文件列表的 Verilog 文件中定义了名为 INCLUDE_RSTN 的宏, 或者通过命令行传递给编译器, rstn 就会在编译过程中被包括在内, 设计也将拥有它。
时间尺度`timescale
`timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。
使用timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。例如,一个设计中包含了两个模块,其中一个模块的时间延迟单位为ns,另一个模块的时间延迟单位为ps。EDA工具仍然可以对这个设计进行仿真测试。
`timescale 命令的格式如下:
`timescale<时间单位>/<时间精度>
在`timescale命令中,用于说明时间单位和时间精度参量值的数字必须是整数,其有效数字为1、10、100,单位为秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)、皮秒(ps)、毫皮秒(fs)。这几种单位的意义说明见下表。
例子:
`timescale 1ns/1ps
在这个命令之后,模块中所有的时间值都表示是1ns的整数倍。这是因为在timescale命令中,定义了时间单位是1ns。模块中的延迟时间可表达为带三位小数的实型数,因为
timescale命令定义时间精度为1ps.
`timescale 10us/100ns
在这个例子中,timescale命令定义后,模块中时间值均为10us的整数倍。因为
timesacle 命令定义的时间单位是10us。延迟时间的最小分辨度为十分之一微秒(100ns),即延迟时间可表达为带一位小数的实型数。
`timescale 10ns/1ns
module test;
reg set;
parameter d=1.55;
initial
begin
#d set=0;
#d set=1;
end
endmodule
在这个例子中,`timescale命令定义了模块test的时间单位为10ns、时间精度为1ns。因此在模块test中,所有的时间值应为10ns的整数倍,且以1ns为时间精度。这样经过取整操作,存在参数d中的延迟时间实际是16ns(即1.6×10ns),这意味着在仿真时刻为16ns时寄存器set被赋值0,在仿真时刻为32ns时寄存器set被赋值1。仿真时刻值是按照以下的步骤来计算的。
- 根据时间精度,参数d值被从1.55取整为1.6。
- 因为时间单位是10ns,时间精度是1ns,所以延迟时间#d作为 时间单位的整数倍为16ns。
- EDA工具预定在仿真时刻为16ns的时候给寄存器set赋值0 (即语句 #d set=0;执行时刻),在仿真时刻为32ns的时候给
寄存器set赋值1(即语句 #d set=1;执行时刻)
**注意:如果在同一个设计里,多个模块中用到的时间单位不同,需要用到以下的时间结构。 **
-
用`timescale命令来声明本模块中所用到的时间单位和时间精度。
-
用系统任务$printtimescale来输出显示一个模块的时间单位和时间精度。
-
用系统函数$ time和$ realtime及%t格式声明来输出显示EDA工具记录的时间信息。