1.参数化Parameter使用
方便后期重用,主要用于位宽、计数器大小、延时大小等的定义。
先说Parameters的三大分类分别是,Module Parameter, Local Parameter 以及Specify Parameter。
1.1Module Parameter:
模块参数的声明语法是:
1)parameter [ signed ] [ range ] identifier = constant_mintypmax_expression
2)parameter {integer | real | realtime | time} identifier=constant_mintypmax_expression
其可以放在模块头上也可以放在模块的内部,他可以通过defparameter的方式或者模块实例化的时候进行重写。
module fifo
#(parameter MSB=3, LSB=0, DEPTH=4)//可以被重写
(port_list );
item;
endmodule
module fifo
(port_list );
parameter MSB=3, LSB=0, DEPTH=4//可以被重写
endmodule
一旦有模块参数被写在模块头部,则出现在模块内部的模块参数被视为本地参数,不能被重写。
module fifo
#(parameter MSB=3, LSB=0)//可以被重写
(port_list );
parameter DEPTH=4; //不能被重写
endmodule
在上层模块对参数重写的三种方式分别如下:
F1.MSB=4;F1.LSB=2;fifo F1;
fifo #(4,2) F1(port_list);
fifo #(.LSB(2), .MSB(4)) fifo(port_list);
1.2Local Parameter
本地模块参数的声明语法和模块参数相似:
1)localparamr [ signed ] [ range ] identifier = constant_mintypmax_expression
2)localparam {integer|real|realtime|time} identifier=constant_mintypmax_expression
不过模块参数只能在模块内部被声明,且不能被重写。但本地参数可以引用模块参数,其值随模块参数而改变。
1.3Specify Parameter
Specify Parameter 用specparam关键字来声明,一般用在specify block中。通过 SDF annotation来重写。
2.参数化赋值
如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
赋全0:指各位均为二进制0,其余依此类推。
以WIDTH表示din/dout位宽。
为了说明方便定义这样一个模块
==============================================================
module evaluate #(parameter WIDTH = 16)
( input clk,
input rst,
input [WIDTH-1:0] din,
output reg [WIDTH-1:0] dout
);
always @(posedge clk)
begin
if (rst)
dout <= 'b0; //如何赋值
else
dout <= din;
end
endmodule
===============================================================
由于位宽已经参数化,那么如何解决参数化赋值问题,以使赋值能“适应参数”。
以下方法经过在vivado2018.2上仿真验证,可以适用动态的位宽变化,以满足重用性的需要。
赋全0的方法:。
(1)直接赋0(推荐)
dout <= 0;此种情况下默认0为十进制以32位表示,如果din位宽大于32位,则高位补零,如果din位宽小于32位,则截取低位,仍为0。
(2)直接赋'b0
dout <= 'b0;
(3)利用位拼接
dout <= {WIDTH{1'b0}};
(4)supply0
定义supply0 [WIDTH-1:0] dout_gnd;
dout <= dout_gnd;
赋全1的方法:
(1)直接赋~0(推荐)
dout <= ~0;
(2)直接赋-1(推荐)
dout <= -1;
(3)利用位拼接
dout <= {WIDTH{1'b1}};
(4)利用supply1
定义supply1 [WIDTH-1:0] dout_vcc;
dout <= dout_vcc;
需要注意的是Verilog中并没有'b1的赋全1方式。
赋全x或者全z均可采用'bx或者'bz的方式
结论:赋全0、全x或者全z可采用'b0、'bx或者'bz的方式;
赋全1可采用赋~0或赋-1的方式较为简洁。
参考链接: