h
Verilog HDL语言和C语言一样也提供编译预处理的功能。在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应的上键盘字符为"~",这个符号并不是单引号"'".这里简单介绍最常用的`define `include `timescale.
1)宏定义`define
用一个指定的标识符(名字)来代表一个字符串,其的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define SIGNAL string
其作用是在后面程序中用SIGNAL替代所有的string字符串,在编译预处理时,将程序中该命令后面所有的SIGNAL替换为string。这种替代过程称作宏展开。
说明:
a)宏名可以是大写字母,也可以是小写字母。一般用大写字母,防止与后面的变量名重复。
b)`define可以出现在模块定义里面,也可以出现在外边。其有效范围是从该命令行开始至源文件结束。
c)在引用已定义的宏名时,必须在宏名的前面加上符号`,表示该名字是一个经过宏定义的名字。
d)宏定义是用宏名代替一个字符串,只做简单替换不检查语法。
e)宏定义不是Verilog HDL语句,不必在后面加分号。
f)在进行宏定义时,可以引用已经定义的宏名,可以层层替换。
g)宏名和宏内容必须在同一行进行声明。如果在宏内容中包含有注释行,注释行不会作为被置换的内容。
注意:组成宏内容的字符串不能够被以下的语句记号分隔开。注释行+数字+字符串+确认符+关键词+双目或三目运算符
如下面的宏定义声明和引用就是非法的:
`define first_half "start of string
$display(`first_half end of string")
2)文件包含处理`include
所谓文件包含是指处理一个源文件可以将另一个源文件的全部内容包含进来,即将另外文件包含到本文件之中。一般格式为: `include"文件名"
在执行命令时,将被包含文件的全部内容复制插入到`include命令出现的地方,然后继续进行下一步的编译。关于文件包含的几点说明:
1)一个文件包含命令只能制定一个被包含的文件,如果需要包含n个文件,要用n个`include命令。
2)`include命令可以出现在Verilog程序的任何位置。被包含文件名可以是相对路径名,也可以是绝对路径名。
3)可以将多个包含命令卸载同一行,可以出现空格和注释行。
4)如果文件1 包含文件2,文件2需要用到文件3的内容,可以在文件一种用两个`include命令分别将文件2和文件3包含进去,而且文件3要在文件2之前。
5)在一个被包含文件中又可以包含其他的文件,即文件的包含是可以嵌套的。
3)时间尺度`timescale
`timescale命令用来说明跟在该命令后面的模块的时间单位和精度。使用`timescale命令可以在同一个设计中包含不同的时间单位的模块。一般的命令格式如下:`timescale<时间单位>/<时间精度>
在这条命令中,时间单位参量是用来定义模块中的仿真时间和延迟时间的基准单位的。时间精度是用来声明该模块的仿真时间的精确程度的,该参量被用来对延迟时间值进行取证操作,因此又可以称作是取整精度。如果在同一个程序设计里,存在多个`timescale一样的命令,则用最小的时间精度值来决定仿真的时间单位。另外时间精度不能大于时间单位值。
使用`timescale时应该注意,`timescale的有效区域为`timescale语句处直至下一个`timescale命令或者`resetall语句为止。当有多个`timescale命令时,只有最后一个才起作用,多以在同一个源文件中`timescale定义的不同的多个模块最好分开编译,不要包含在一起以免出错。
`timescale 1ns/1ps //时间值都为1ns的整数倍,时间精度为1ps,因此延迟时间可以表达为带三位小数的实型数。
`timescale 10μs/100ns //时间单位为10μs的整数倍,时间精度位100ns,因此延迟时间可以表达为带两位小数的实型数。
`timescale 10ns/1ns
module test;
reg =set;
parameter p=1.55;
initial
begin
$monitor($time,,"set=",set);
#p set=;
#p set=;
end
endmodule
时间尺度
1)根据时间精度,参数p的值从1.55取整为1.6;
2)因为时间单位是10ns,时间精度为1ns,所以延迟时间#p作为事件单位的整数倍为16ns;
3)可以用$printtimescale函数来输出显示一个模块的时间单位和时间精度。
4)条件编译命令`ifdef `else `endif
一般情况下,Verilog HDL源程序中所有的航都参加编译。但是有时希望对其中的部分内容只有在满足编译条件时才进行编译。也就是对一部分内容指定编译条件,即条件编译。
条件编译命令有以下几种形式:
`ifdef 宏名 (标识符)
程序段1
`else
程序段2
`endif
它的作用是当宏名已经被定义过(`define定义),则对程序1进行编译,程序段2被忽略。其中else部分可以没有。注意:忽略掉的程序段也要符合语法规则。