【转载】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 ...
随机推荐
- springboot数据库连接池使用策略
springboot官方文档介绍数据库连接池的使用策略如下: Production database connections can also be auto-configured using a p ...
- jenkins在windows下的最快安装方法
jenkins在windows下的安装 2016年04月21日 13:00:09 阅读数:22828 在初步了解了jenkins是什么?jenkins的特点.基本结构,及大概的功能介绍后,就开始对je ...
- 使用Spring Session实现Spring Boot水平扩展
小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...
- 《Hadoop金融大数据分析》读书笔记
<Hadoop金融大数据分析> Hadoop for Finance Essentials 使用Hadoop,是因为数据量大数据量如此之多,以至于无法用传统的数据处理工具和应用来处理的数据 ...
- 用react重构个人网站 3-22
问题一:import React from 'react'这个写法是怎么回事? 答案:require是common.js的写法,import是ES6的写法,主要功能都是引入模块,写法上: var mo ...
- git学习(持续踩坑中🤣)
https://segmentfault.com/q/1010000002457936 常见指令: 一.创建版本库 $ mkdir learngit 创建文件夹 $ cd learngit 进入文件夹 ...
- 你不知道的JavaScript--Item13 理解 prototype, getPrototypeOf 和__proto__
1.深入理解prototype, getPrototypeOf和_ proto _ prototype,getPropertyOf和 _ proto _ 是三个用来访问prototype的方法.它们的 ...
- Python 模块详解及import本质
同在当前目录下的模块和包导入 模块定义 本质就是.py结尾的python文件. 用来从逻辑上组织python代码(变量,函数,类,逻辑) 文件名: test.py; 对应的模块名 : test 模块 ...
- BZOJ_1823_[JSOI2010]满汉全席_2-sat+tarjan
BZOJ_1823_[JSOI2010]满汉全席_2-sat 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1823 分析:一道比较容易看出来的 ...
- C++ set用法以及迭代器用法
有关set的一些常用函数 1.begin() / end() 返回首/尾元素迭代器 2.rbegin() / rend() 返回尾/首元素反向迭代器,反向迭代器可以反向遍历容器的迭代器,从下面的程序已 ...