Verilog预编译
Verilog语言支持宏定义` define、参数参数、本地参数` localparam、` include等内容。 对这些数据常数的支持对于数字系统的设计、模拟和验证非常有用。 这些参数是预编译的。
预编译
预编译是指在系统编译之前,先扫描系统文件,将文件中的引用宏和参数替换为实际值,然后将对` include文件的引用复制到相应的位置,再对其进行顺式编译例如,c语言、c语言等。
宏的定义
` define关键字
宏定义的关键字是` define,在预编译阶段,` define用于文本替换,类似于c语言的#define。 ` define命令定义后,将在整个翻译过程中生效。 例如,在文件中定义:
` define DATA_DW 32 //意味着DATA_DW=32,在制作文件时使用` DATA_DW,在系统编译时,首先将所有` DATA_DW出现的地方放在32
也可以直接在其他文件中使用` DATA_DW。 当然,根据编译工具的设置,建议仅在该文件中使用为一个文件定义的宏。
使用宏的优点是全局使用宏中定义的常量。 将来,通过直接更改宏的定义,可以更改使用宏的所有位置。
宏定义也可以是以下表达式:
` definelow_pos(w,b ) ) w ) *64(b ) )8) )
例如:
设计文件mul8.v
` define pw8module mul8(input (pw-1:0 ) a、input (pw-1:0 ) b、output (pw *2- 13:0 ) p ); assign p=a * b; 结束模块
模拟文件tb.v
` timescale 1 ns/1 ps
` define PW 8
module tb
(
);
参数期间=10;
reg CLK;
初始
比根
CLK=1'b0;
(#(PERIOD/2 );
四人合唱团
#(Period/2 ) CLK=~CLK;
结束
reg [`PW-1:0] a、b;
wire [`PW*2-1:0] p;
初始
比根
a=`PW'b0;
b=`PW'b0;
结束
always @(posedge CLK )
比根
a=a 1;
对于if(a==2** ) ` pw )-1 ) /幂算子) *,只能取2的幂,指数部//分必须为常数
b=b 1;
结束
mul8 mul8_dut
(
. a(a )指:
. b(b ),
. p(p )
);
结束模块
` undef关键字
` undef关键字允许您中止当前宏常量的定义。
例如` undef PW
文件在此句后不能用` PW代替8。
` ifdef,` ifndef,` elsif,` else,` endif
` elsif,` else编译指令对于` ifdef指令是可选的,只需` ifdef和` endif就可以构成一次条件编译指令块。
示例:默认处理32位数据,如果定义了宏,则根据宏定义进行处理
` ifdef DATA_DW
reg [`DATA_DW-1:0] data_a;
reg [`DATA_DW-1:0] data_b;
reg [`DATA_DW-1:0] data_c;
` else
reg [31:0] data_a;
reg [31:0] data_b;
reg [31:0] data_c;
` endif
注:宏通常在定义时可以同时使用大小写。 此外,它们是区分大小写的。 这意味着以大写形式定义的宏和以小写形式定义的宏只区分大小写,但表示不同的宏
例如:
由` define data_w 8和` define DATA_W 32定义的宏可以区分使用而不相互冲突。 一般的习惯宏是大写的。
参数参数和局部参数localparam
参数常数可以在parameter和localparam中定义,但使用范围不同。
localparam定义的参数只能在本模型内部使用,不能调用模块实例化,相当于局部常量。 状态机状态常量已定义,只能在定义的位置之后使用。
在parameter中定义的参数不仅在本文档中使用,还在module中实例化并传递参数。 parameter经常用于module界面和在设计文件中的多个位置使用特定常量的地方。
例如:
设计文件para_fadder.v
module para_fadder
# (
参数wdth=4
)
(
输入ci,
input [WDTH-1:0] a、
input [WDTH-1:0] b,
output [WDTH-1:0] sum,
输出co
);
assign {co,sum}=a b ci;
结束模块
Testbench文件tb.v
` timescale 1ns/1ps
module tb
(
);
参数wdth=16;
reg ci;
reg [WDTH-1:0] a、b;
wire [WDTH-1:0] sum;
wire co;
初始
比根
a='b0;
b='b0;
ci=0;
#10
a='d100;
b='d33;
ci=0;
#10
a='d101;
b='d37;
ci=1;
结束
para_fadder
# (
. wdth(wdth )
)
para_fadder_dut
(
. ci(ci )、
. a(a )指:
. b(b ),
. sum(sum )、
. co (二氧化碳)
);
结束模块
Modelsim模拟波形
说明:如果在设计文件中定义了参数WDTH=4,并且在实例化中传递的参数为16,则最终传递到设计文件的参数的特定数值取决于传递的值。 在本例中,WDTH的最终值为16,最终实例化16位全加法器。 如果实例化未将值传递给参数,则WDTH=4为缺省值,即实例化4位全加法器。 例如,以下内容:
para_fadderpara_fadder_dut(.ci )、 a(a )、 b )、 sum )、 co );
例子化为4位的全加法器。
模块参数的格式如下。
设计文件
module para _ fad der # (parameter wdth=4,parameter WDTH1=4 //最后一个参数没有分隔符)
多个参数由逗号“,”分隔,最后一个参数没有分隔符。
实例化端的相似格式:
para_fadder#(.wdth ), wdth1) )
如果只有一个参数
para_fadder#(.wdth ) (wdth ) )