1. 概述

在Verilog中我们常常会遇到要将一个常量(算法中的某个参数)赋给很多个变量的情况,如:

x = 10;
y = 10;
z = 10;

如果此时10要改为9,就需要在代码中修改3个地方,非常的不方便,并且这个10是没有任何意义的,我们不知道它代表什么,所以为了代码的易重用、易读性,我们应使常量参数化,如:

parameter   MAX = 10;
x = MAX;
y = MAX;
z = MAX;

这样就只需要修改MAX就可以了,并且MAX是有意义的,增加代码的易读性。

parameter是常量,不是变量,所以不允许在运行时修改它的值,即不能在组合逻辑或者时序逻辑中对其进行赋值。

有两种类型的parameters:
1)module parameters
2)specify parameters,只能提供定时和延时的值,不可综合。

2. module parameters

module parameters有parameter和localparam两种,它们所代表的值都可在编译时进行修改(参数传递),parameter可直接修改,localparam只能间接修改。

2.1 parameter

parameter在模块中声明后,后续编译时还可以被重新声明的值所覆盖。

parameter msb = 7;                  // defines msb as a constant value 7
parameter e = 25, f = 9;            // defines two constant numbers
parameter r = 5.7;                  // declares r as a real parameter
parameter byte_size = 8,byte_mask = byte_size - 1;
parameter average_delay = (r + f) / 2;
parameter signed [3:0] mux_selector = 0;
parameter real r1 = 3.5e17;
parameter p1 = 13'h7e;
parameter [31:0] dec_const = 1'b1;   // value converted to 32 bits
parameter newconst = 3'h4;           // implied range of [2:0]
parameter newconst = 4;              // implied range of at least [31:0]

注:
1)如果参数在声明时没有指定type和range,则默认为最后赋值给参数的type和range;
2)如果参数有指定range,但没有type,则它的符号默认为unsigned,并且range和符号都不会被后面的声明所覆盖;
3)如果参数有指定range,并且指定为有符号type,则它的range和符号都不会被后面的声明所覆盖;

2.2 localparam

localparam除了不能直接对其进行修改外,其他属性与parameter一样。可通过在声明时将parameter赋给localparam进行间接修改。状态机一般都使用localparam。

parameter       X = 3;
localparam      Y = X*2;

这样修改X就间接修改了localparam Y的值。

2.3 编译时parameter的参数传递

对parameter的修改有两种方式:
1)defparam声明
2)模块实例声明

注:如果defparam声明和模块实例声明冲突了,则使用defparam声明的值。

2.3.1 defparam声明

defparam使用层次化名称对模块中的参数重新赋值,如下面的代码所示,mod_a是一个实例化的模块,para_a和para_b是mod_a中的参数。

defparam    mod_a.para_a = 2;
defparam    mod_a.para_b = 3;
mod_mod mod_a();

注:如果有多个defparam声明一个parameter,则该parameter取文本(代码)中最后一个defparam声明的值。

2.3.2 模块实例声明

模块实例声明有两种实现方式:
1)有序列表
列表的顺序必须严格按照模块中参数声明的顺序,且不可跳过任何一个参数。如下面代码,mod_mod中有三个参数,a = 4,b = 5,c = 6.

mod_mod #(1, 2, 3)        mod_a();      //三个参数都修改
mod_mod #(4, 2, 3)        mod_a();      //只修改b和c,但是也要将a的值声明
mod_mod #(1, 5, 3)        mod_a();      //只修改a和c,但是也要将b的值声明

2)参数名
声明时的参数名称需要和模块实例中的参数名称一致,不需要重新声明的参数可以缺省。

mod_mod #(.a(2), .b(3))   mod_a();      //两个参数都重新声明
mod_mod #(.b(3))          mod_b();      //只声明参数b

注:针对一个实例的参数声明只能通过一种方式,不可混合,不同实例可以混合。如

// 不合法
mod_mod #(3, .b(4))       mod_a();      //同时使用两种方式,不合法
// 合法
mod_mod #(3, 4)           mod_a();      //只使用有序列表的方式
mod_mod #(.a(3), .b(4))   mod_b();      //只使用参数名方式

3. `define与parameter的区别

`define作用于整个工程,而parameter只作用于本模块,一旦`define指令被编译,则在整个编译过程中都有效,所以仿真时使用`define相对于parameter重声明占用更少的内存。

参考资料:
1) IEEE Std 1364TM-2005: IEEE Standard for Verilog Hardware Description Language.
2) Verilog Coding Styles for Improved Simulation Efficiency.
3) https://blog.csdn.net/Times_poem/article/details/51371940

Verilog中的parameter相关推荐

  1. Verilog中`define和parameter有什么区别

    Verilog中使用`define和parameter有什么区别? `define和parameter都可以在设计中用来指定常量. 例如: 以下是使用`define和parameter的一些区别: 什 ...

  2. verilog中define、parameter、localparam的区别

    Verilog代码可移植性设计 1.       参数定义 localparam,实例代码如下: module tm1( clk,rst_n, pout ); input clk; input rst ...

  3. Verilog中parameter使用

    概述 模块定义 模块调用 Questasim仿真 1.概述 Verilog中通过使用parameter可以在调用模块时修改模块里面的常数参数,提高模块的复用性,类似C语言中函数的形参,在模块调用时将参 ...

  4. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  5. FPGA之道(37)Verilog中的编写注意事项

    文章目录 前言 Verilog中的编写注意事项 大小写敏感 Verilog中的关键字 范围定义的正确使用 不要省略begin与end 注释中斜杠的方向 编译指令中的前导符号 混用阻塞和非阻塞赋值的危害 ...

  6. FPGA之道(36)Verilog中的编译指令

    文章目录 前言 Verilog中的编译指令 define指令 timescale指令 inlcude指令 前言 本文摘自<FPGA之道>,一起来了解下Verilog中的编译指令. Veri ...

  7. FPGA之道(35)Verilog中的并行与串行语句

    文章目录 前言 Verilog的并行语句 Verilog连续赋值语句 普通连续赋值语句 条件连续赋值语句 Verilog程序块语句 沿事件 纯组合always 纯时序always 具有同步复位的alw ...

  8. Verilog中的条件编译语句 `ifdef、`else、`endif 等

    今天在参考大佬的RS232 Receiver的时候,用到了`ifdef指令,我虽知道它是条件编译指令,但是内容已经忘了差不多了,也不敢胡乱猜测.今天趁此机会总结一下: 一般情况下,Verilog HD ...

  9. Verilog中基本的数据类型

    Verilog中共有19种数据类型. 基本的四种类型: reg型.wire型.integer型.parameter型. 其他类型:large型.medium型.small型.scalared型.tim ...

最新文章

  1. C++ transform for_each
  2. python自动化办公入门书籍推荐-盘点使用Python进行自动化办公所需要的知识点
  3. 软件测试中英文词汇汇总
  4. 电影网址导航V20201218版源码
  5. Programming .Net Component - Chapter 1. introducting component-oriented programming
  6. 进程和线程的区别【转】
  7. Linux看硬盘同步,从磁盘同步看linux的机制和策略
  8. 15个非常有用的Adobe Flex教程
  9. Libevent源码分析-----开篇
  10. Qt —— 海康SDK获取视频并OpenCv处理每帧图像进行显示
  11. 用excel做线性规划
  12. 本地组策略编辑器计算机配置,打开本地组策略编辑器|没有本地组策略编辑器...
  13. 遍历输出数组-----淫巧
  14. ios 苹果支付(IAP)
  15. 东风快递地址分拣程序
  16. 歌曲:后来的我们 歌手:品冠
  17. 简洁安装HIT-SCIR(哈工大) pyltp
  18. js递归返回想要的值
  19. 【H.264】SPS 解析
  20. Java实现水电费计费项目

热门文章

  1. 第三人称计算机获奖感言,玄彬获奖感言感谢女友孙艺珍 惹众网友羡慕
  2. 2021「AI中国」评选
  3. 从0开始写前端UI框架:概述
  4. 日志特征选择汇总(基于天池比赛)
  5. matlab r2010b 怎么设置中文,[矩阵实验室]Matlab R2010b 乱码问题
  6. “光猫”调制解调器 和 路由器的区别 傻傻分不清
  7. 【计算机网络】吞吐量与瓶颈链路
  8. Pycharm 自制翻译扩展
  9. 简谈python正则表达式
  10. 行车路线(CCF201712-4)