Verilog参数Parameter使用、参数化赋值

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的方式较为简洁。

参考链接:

Verilog 参数Parameter篇

如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x

  • 30
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Verilog参数化是指在RTL(Register Transfer Level)设计中使用参数来灵活地定义和定制模块的行为和特性。参数可以在实例化模块时通过参数赋值来调整模块的功能。 在Verilog中,通过parameter关键字来声明参数,并在模块定义中使用这些参数来定义模块的行为。通过参数化,可以在设计阶段根据实际需求,动态地改变模块的功能,而不需要修改模块的源代码。 参数化可以实现设计的复用。通过改变参数赋值,可以实例化出不同的模块,满足不同的需求。这样可以提高设计的灵活性和可维护性。 参数可以是基本数据类型,如整数或布尔类型,也可以是自定义的数据类型,如结构体。当参数是整数类型时,可以根据具体的值来控制模块的行为。当参数是布尔类型时,可以通过不同的赋值来打开或关闭特定的功能。 参数还可以用于控制模块实例中的信号位宽。通过将输入和输出端口的位宽定义为参数,可以灵活地调整模块的位宽,以适应不同的数据尺寸。 需要注意的是,参数是在编译时静态确定的,即模块实例化时参数赋值是固定的。如果需要在运行时动态改变模块的行为,需要使用传参的方式来实现。 总之,参数化Verilog中一种重要的技术,可以根据实际需求灵活地定义和定制模块的行为和特性。通过适当使用参数化,可以提高设计的效率和可维护性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值