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

本文深入探讨了Verilog中的参数化使用,包括ModuleParameter、LocalParameter和SpecifyParameter的定义及应用,特别关注了参数化赋值的问题,如赋全0、全1、全Z和全x的方法,并提供了在不同场景下适用的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值