编译预处理语句
编译预处理 是verilog hdl编译系统的一个组成部分。编译预处理语句是以esc下方波浪线中的(`)开头
在编译时,编译系统先对编译预处理语句进行预处理,然后将处理结果和源程序一起进行编译
define语句
宏定义语句-用一个指定的标识符(即宏名)来代表一个字符串(即宏内容)
格式
`define 标识符 (即宏名)字符串 (即宏内容)
ps编译预处理语句,写完后面是无分号的
例:
`define IN ina+inb+inc+ind
宏展开---在编译预处理时将宏名替换为字符串的过程
宏定义的作用:
以一个简单的名字代替一个长的字符串或复杂表达式;
以一个有含义的名字代替没有含义的数字和符号;
宏名尽量用大写字母来表示,以与变量名相区别
`define可以写在module的前面也可以写在module的里面。宏名的有效范围为定义命令之后到源文件结束
module test;
reg a,b,c,d,e,out;
define expression a+b+c+d //一定不能加;,不然后面引用时,out = a+b+c+d;+e会报错
assign out = `expression + e;
endmodule
进行宏定义时,可引用已定义的宏名,来实现层层置换;
module test;
reg a,b,c;
wire out;
`define aa a+b //不能有分号
`define cc c+'aa //引用宏名`aa来定义宏`cc
assign out = `cc;
endmodule
宏定义与parameter的区别
范围 | |
`define | 整个工程 |
parameter | 本module内有效 |
localparam | 本module内有效,不可用于参数的传递 |
`include语句
文件包含语句,一个源文件可将另一个源文件的全部名称包含进来
格式:`include <文件名>相对于sim的相对路径或者为该文件的真实路径
ps:相当于将file2.v全部内容赋值插入到`include"file2.v"命令出现的地方
一个include语句只能指定一个被包含的文件:若要包含n个文件,需要n个include语句
`include "aa.v""bb.v"//这样写是不对的,可以写为以下的形式
`include "aa.v"
`include "bb.v"
`include语句可出现在源程序的任何地方,被包含的文件弱于包含文件不在同一子目录,必须指明器路径
`include "parts/count.v"
作用
可以减少程序开发人员重复性的劳动
用include语句设计16位加法器
//1'bit adder
moudule adder (cout,sum,a,b.cin);
parameter size = 1;
input [size-1:0]a,b;//位宽是1
input cin;
output sum;
output cout;
assign {cout,sum} = a + b + cin;cout存进位的值,sum存低位的和,{cout,sum}是位拼接
endmodule
`include "adder.v"
module adder_16b (cout,sum,a,b,cin);
output cout;
parameter my_size = 16;
output [my_size-1:0] sum;
input [my_size-1:0] a,b;
input cin;
adder #(my_size) my_adder(cout,sum,a,b,cin);//对adder进行模块实例化,my_adder中的parameter变为my_size=16
endmodule
adder #(my_size) my_adder(cout,sum,a,b,cin);可以用名称或者位置传参
加入是多个参数可以用位置或者名称传参
adder #(my_size1,my_size2) my_adder(cout,sum,a,b,cin);//此方式为位置传参
adder #(.size1(my_size1),.size2(my_size2)) my_adder(cout,sum,a,b,cin);//此方式为名称传参
monitor用法
`timescale语句
用于定义跟在该命令后模块的时间单位和时间精度
格式:`timescale<时间单位>/<时间精度>
时间单位:用于定义模块中仿真时间和延迟时间的基准单位;
时间精度:用于声明模块的仿真时间和延迟时间的精确程度;
在同一程序设计里,可以包含采用不同时间单位的模块。(此时用最小的时间精度值决定仿真的时间单位)
时间精度至少要和时间单位一样精确,时间精度值不能大于时间单位值!
在timescale语句里,用来说明时间单位和时间精度参量值的数字必须是整数
其有效数字为1、10、100;
单位为秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)、皮秒(ps)、毫皮秒(fs)
eg:
`timescale 10ns/1ns//时间单位为10ns,时间精度为1ns
.....
reg sel;
initial begin
#10 sel = 0;//延迟10个时间单位
#10 sel = 1;//延迟10个时间单位
end