首页 > 编程知识 正文

verilog中parameter,verilog中的赋值语句

时间:2023-05-03 08:49:06 阅读:245607 作者:1708

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。