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
---------------------
作者:qq_16923717
来源:CSDN
原文:https://blog.csdn.net/qq_16923717/article/details/81067096
版权声明:本文为博主原创文章,转载请附上博文链接!

【转载】Verilog中的parameter的更多相关文章

  1. verilog中timescale

    1. `timescale `timescale是Verilog中的预编译指令,指定位于它后边的module的时间单位和时间精度,直到遇到新的`timescale指令或者`resetall指令.它的语 ...

  2. Verilog中使用'include实现参数化设计

    前段时间在FPGA上用Verilog写了一个多端口以太网的数据分发模块,因为每个网口需要独立的MAC地址和IP地址,为了便于后期修改,在设计中使用parameter来定义这些地址和数据总线的位宽等常量 ...

  3. verilog中的latch到底是个啥??简直快疯了!!!!!

    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...

  4. 在verilog中调用VHDL模块

    习惯了自己发现一些小问题,既然发现了,就记下来吧,不然又要忘了,这是多么悲痛的领悟. 今天在用vivado进行块设计时所生成的顶层模块居然是用VHDL语言描述的,这时郁闷了,表示只看过VHDL语法但没 ...

  5. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...

  6. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  7. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

  8. 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏

    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...

  9. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

随机推荐

  1. java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

  2. Java开源生鲜电商平台-账单模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-账单模块的设计与架构(源码可下载) 补充说明:Java开源生鲜电商平台-账单模块的设计与架构,即用户的账单形成过程. 由于系统存在一个押账功能的需求,(何为押账,就是形成公司 ...

  3. 解决Apache Web Server的几个错误

    一.安装好Apache后服务里没有Apache服务 在命令行进入安装apache的bin目录下,输入命令 httpd.exe -k install -n Apache2.4 二.Apache web ...

  4. java.util.ConcurrentModificationException异常的解决

    问题复现: List<String> list = new ArrayList<>();list.add("11");list.add("55&q ...

  5. java编程思想-第13章-某些练习题

    . 匹配任意一个字符 * 表示匹配0个或多个前面这个字符 + 表示1个或多个前面这个字符 ? 表示0个或1个前面这个字符 ^ 表示一行的开始 ^[a-zA-Z] :表示开头是a-z或者A-Z [^0- ...

  6. orcl数据库命令行怎么导入dmp格式的文件

    2018-05-23 1.创建空间 以system的身份登陆orcl 打开SQL Window界面,输入以下命令create tablespace SGXC(表空间的名字)datafile 'D:/S ...

  7. 【BZOJ 2744】【HEOI2012】朋友圈

    题目链接: TP 题解: 对于A国,我们发现,最大团一定不大于2.对于B国,发现同奇偶性点之间都有边,不同奇偶性之间可能有边,也就是说对于B国是一个二分图最大团,也就是求B国补图的二分图最大独立集.然 ...

  8. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

  9. SSH通过SSH代理连接到内网机器

    要解决的问题? 需要解决的问题:https://q.cnblogs.com/q/105319/ 简单来说就是本地机器通过一台公网机器SSH到公网机器后面的私网机器. 网络环境如下图:本地机器可访问代理 ...

  10. python——在文件存放路径下自动创建文件夹!

    1.a.py文件存放的路径下为(D:\Auto\eclipse\workspace\Testhtml\Test) 2.通过os.getcwd()获取的路径为:D:\Auto\eclipse\works ...