【转载】Verilog中的parameter
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的更多相关文章
- verilog中timescale
1. `timescale `timescale是Verilog中的预编译指令,指定位于它后边的module的时间单位和时间精度,直到遇到新的`timescale指令或者`resetall指令.它的语 ...
- Verilog中使用'include实现参数化设计
前段时间在FPGA上用Verilog写了一个多端口以太网的数据分发模块,因为每个网口需要独立的MAC地址和IP地址,为了便于后期修改,在设计中使用parameter来定义这些地址和数据总线的位宽等常量 ...
- verilog中的latch到底是个啥??简直快疯了!!!!!
在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...
- 在verilog中调用VHDL模块
习惯了自己发现一些小问题,既然发现了,就记下来吧,不然又要忘了,这是多么悲痛的领悟. 今天在用vivado进行块设计时所生成的顶层模块居然是用VHDL语言描述的,这时郁闷了,表示只看过VHDL语法但没 ...
- system verilog中的跳转操作
在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...
- system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)
类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...
- 一段比较有意思的代码——介绍system verilog中的新增幅值语句
system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...
- 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏
在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...
- 关于Verilog 中的for语句的探讨
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
随机推荐
- idea 和 eclipse 常用快捷键汇总
序号 所属类别 快捷键名称 快键键方式 备注 所属平台 1 查询类 search everywhere double shift idea 2 全文搜索 ctrl + H 通用 3 打开资源 ...
- 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...
- 你不知道的JavaScript--Item26 异步的脚本加载
先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿--不怎么样."这该放 ...
- struts2(二)---ModelDriven模型驱动
这篇文章是在上一篇文章(http://blog.csdn.net/u012116457/article/details/48194905)的基础上写的,大家可以先快速阅读一下上一篇. 这篇文章用来写一 ...
- CentOS 6.2+Nginx+Nagios,手机短信和qq邮箱提醒
http://chenhao6.blog.51cto.com/6228054/1323192 标签:软件包 配置文件 nagios 服务端 监控 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...
- python中RabbitMQ的使用(安装和简单教程)
1,简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从"生产者"接收消息 ...
- Python内置方法中不明了的部分
# 把字符串转成一个对象 TODO 这个方法到底怎么用? repr('please') # 切片 TODO 怎么用? d = range(20) d[slice(2,5)] # 返回range[2,5 ...
- Visual Studio Code Tips
新项目要用到Visual Studio Code, 在使用的过程中有些tips, 记录下来以便查阅. 1. 自动保存代码 文件 => 自动保存 2. 帮助输入代码模式 扩展 => 安装HT ...
- Hadoop问题:DataNode进程不见了
DataNode进程不见了 问题描述 最近配置Hadoop的时候出现了这么一个现象,启动之后,使用jps命令之后是这样的: 看不到DataNode进程,但是能够正常的工作,是不是很神奇啊? 在一番 ...
- bzoj 2759一个动态树好题
真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子 ...