在verilog预言中,为了和一般的语句相区别,这些预处理命令以符号"`"开头(位于主键盘左上角,注意这个符号不同于单引号‘)这些预处理命令的有效作用范围为定义命令之后到本文件结束或到其他命令替代该命令之处,verilog HDL提供了很多预编译命令:
`accelerate, `autoexpand_vectornets, `celldefine, `default_nettype, `define, `else, `endif, `timescale.等等
在这篇博客里我打算对常用的 `define `include `timescale 进行介绍,其余的有需要可以查阅相关资料。
1,宏定义 `define:
用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:
`define 标识符(宏名)字符串(宏内容)
如: `define signal string
它的作用是指定用标识符signal 来代替string这个字符串,在编译预处理时,把程序中在该命令以后的signal都换成string,这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用有意义的名字来代替没有含义的数字和符号。因此把这个标识符(名字)称为“
宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。`define是宏定义命令。
example1:
module test;
reg a, b, c, d, e, out ;
`define expression a+b+c+d;
assign out = `expression + e;
.......
endmodule
2, "文件包含" 处理 `include
所谓文件包含处理是一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到文本中,verilog HDL语言提供了 `include,命令用来实现“文件包含”的操作。其一般形式为:
`include “文件名”
“文件包含”命令是很有用的,可以节省程序设计人员的重复劳动;可以将一些常用的宏定义命令或任务(task)组成一个文件,然后用`include 命令将这些宏定义包含到自己所写的源文件中,相当于工业上的标准原件来使用。
example2:
(1)文件aaa.v
module aaa(a,b,out);
input a,b ;
output out ;
wire out ;
assign out = a^b;
endmodule
(2) 文件bbb.v
`include "aaa.v"
module bbb(c,d,e,out)
input c,d,e;
output out;
wire out_a;
wire out ;
aaa aaa(
.a(c),
.b(d),
.out(out_a)
);
assign out = e & out_a;
endmodule
3,时间尺度`timescale
`timescale 命令用来说明
跟在该命令后的模块的时间单位和时间精度,使用`timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。例如,一个设计中包含两个模块,其中一个模块的时间延迟单位为纳秒(ns),另一个模块的时间延迟单位为皮秒(ps),EDA工具仍然可以对这个设计进行仿真测试。
`timescale 命令的格式如下:
`timescale <时间单位>/<时间精度>
example3:
`timescale 10ns/1ns
module test ;
reg set ;
parameter d=1.55;
initial
begin
#d set =0;
#d set =1;
end
endmodule
在这个例子中,`timescale命令定义了模块的时间单位为10ns,时间精度为1ns,因此在模块test中,所有的时间值应为10ns的整数倍,且以1ns为时间精度。这样经过取整操作,存在参数d中的延迟时间实际是16ns(即1.6*10ns)。意味着在仿真时刻为16ns时寄存器set被赋值0;在仿真时刻为32ns时寄存器set被赋值1。
值得注意的是:
(1)根据时间精度,参数d的值被从1.55取整为1.6.
(2)因为时间单位是10ns,时间精度是1ns,所以延迟时间#d作为时间单位整数倍为16ns.