define, parameter, localparam, specparam, defpara用法简析

这篇具有很好参考价值的文章主要介绍了define, parameter, localparam, specparam, defpara用法简析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

在Verilog中,parameter既不属于变量范畴也不属于线网范畴,经常用来定义一个标志符代表一个常量,当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块,而不用单独为只有参数不同的多个模块再新建文件。通过使用参数,可以提高程序的可读性、可复用性和可维护性。

目前常用的参数主要分为两大类:module参数(parameter和localparam)和specify参数(specparam)

`define:        作用 -> 常用于定义常量可以跨模块、跨文件;

                        范围 -> 整个工程;

parameter:       作用 -> 常用于模块间参数传递;

                        范围 -> 本module内有效的定义;

localparam        作用 -> 常用于状态机的参数定义;

                        范围 -> 本module内有效的定义,不可用于参数传递;
                        
specparam         作用->关键字 specparam 在 specify 块中定义延迟数值常量,然后赋值给路径延迟

				        范围->specparam 定义的常量只能在 specify 块内部使用


				        其中: Verilog specify 块语句:https://www.runoob.com/w3cnote/verilog2-specify.html

宏定义 'define

若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题:

  • 代码长度增加,不够美观;

  • 不利于参数和代码修改;

用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:

`define 标识符(宏名) 字符串(宏内容)    

如:`define signal string

它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string。这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。

verilog中define八点说明:原文链接

  • 宏名建议使用大写字母,以与变量名相区别

  • 'define命令可以出现在模块定义里面,也可以出现在模块定义外面。宏名的有效范围为定义命令之后到原文件结束。通常,`define命令写在模块定义的外面,作为程序的一部分,在此程序内有效

  • 在引用已定义的宏名时,必须在宏名的前面加上符号“`”,表示该名字是一个经过宏定义的名字

  • 宏定义是用宏名代替一个字符串,也就是作简单的置换,不作语法检查

  • 宏定义不是Verilog HDL语句,不必在行末加分号

  • 在进行宏定义时,可以引用已定义的宏名,可以层层置换

  • 宏名和宏内容必须在同一行中进行声明。如果在宏内容中包含有注释行,注释行不会作为被置换的内容

parameter

parameter是Verilog数据类型中的一种,不过与常规的reg或wire不同,parameter不是变量,而是常量。
parameter因其常量特性,无法在仿真的过程中进行修改,不过在编译的时候,我们可以使用defparam对其进行修改。

  • parameter可以被声明为integer,real,realtime,time四种类型
  • 也可以在parameter后加上signed使其变为有符号数
  • 可以声明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]

parameter定义常量,可以定义在模块内部或外部

parameter在模块内部定义常量:

 
module param_idef(
    input clk,
    input [2:0]din,
    output reg [3:0]sum
    );
 
parameter ADD = 2'd1;
always@(posedge clk)
begin
    sum <= din+ADD;
end
endmodule

parameter在模块内部定义常量:

 
module param_odef
#(parameter ADD2 = 2'd1)
(
    input clk,
    input [2:0]din,
    output reg [3:0]sum
    );
 
always@(posedge clk)
begin
    sum <= din+ADD2;
end
endmodule

localparam

  • localparam指定的参数不能通过defparam进行修改

  • localparam指定的参数不能通过模块例化进行修改;

  • localparam指定的参数可通过parameter赋值进行间接的修改,此时可利用parameter的修改方式实现localparam的修改;

  • localparam 用法,实战学习FPGA,fpga开发

上述代码中MSB和LSB均可以通过defparam和模块例化的方式进行修改,但是FIFO_MSB和FIFO_LSB仅能通过MSB、LSB、SIZE进行修改或者直接赋值为常量。也就是说,如果要对localparam进行重新修改,那么只能通过parameter间接的进行修改,其参数化是通过parameter体现的

specparam

路径延迟用关键字 specify 和 endspecify 描述,关键字之间组成 specify 块语句。specify 是模块中独立的一部分,不能出现在其他语句块(initial, always 等)中。specify 块语句主要有以下功能:

  • 指定所有路径中引脚到引脚的延迟;

  • 定义 specparam 常量;

  • 在电路中设置时序检查。

实例:

   specify
      specparam ab_2_out = 2.5 ;
      specparam cd_2_out = 3.5 ;
     
     //每条路径都有一个源引脚和目的引脚,将这些路径的延迟依次用 specify 语句描述出来,称为并行连接。
      (a => out) = ab_2_out ;
      (b => out) = ab_2_out ;
      (c => out) = cd_2_out ;
      (d => out) = cd_2_out ;
   endspecify

parameter,localparameter,specparam参数的异同点

localparam 用法,实战学习FPGA,fpga开发

Verilog 带参数例化

链接:参数覆盖有两种方式:1)使用关键字 defparam,2)带参数值模块例化

原文链接:
https://developer.aliyun.com/article/12283

https://blog.csdn.net/Times_poem/article/details/51371940
https://www.cnblogs.com/xgcl-wei/p/9090918.html
https://www.runoob.com/w3cnote/verilog-defparam.html
https://blog.csdn.net/weixin_43698385/article/details/124745762?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-124745762-blog-108027613.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-124745762-blog-108027613.pc_relevant_default&utm_relevant_index=19文章来源地址https://www.toymoban.com/news/detail-558911.html

到了这里,关于define, parameter, localparam, specparam, defpara用法简析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rabbitmq基础3——环境变量、配置文件、参数策略Parameter和Policy的常规用法、Federation插件、联邦交换器

    从前面的操作来看,我们并没有用到配置相关的东西,比如修改配置文件?比如运行时指定某某参数? 其实,大多数情况下我们默认启动rabbitmq服务时就是用的默认参数,并且也够用了。但是对于一名合格的运维来说,需要全面掌握每一个细节,才能更加高效的操作rabbitmq。

    2024年02月16日
    浏览(43)
  • 【AI实战】llama.cpp量化cuBLAS编译;nvcc fatal:Value ‘native‘ is not defined for option ‘gpu-architecture‘

    对于使用 LLaMA 模型来说,无论从花销还是使用体验,量化这个步骤是不可或缺的。 llama.cpp 量化部署 llama 参考这篇文章:【AI实战】llama.cpp 量化部署 llama-33B 与 cuBLAS 一起编译时,执行: 报错信息如下: 错误信息在倒数第二行: 执行下面命令参考本机的 gpu-architecture: 输出

    2024年02月12日
    浏览(43)
  • formatter的用法,深拷贝, Object.assign 方法实战。

     1. :formatter的用法   :formatter 接受一个函数作为参数,这个函数有三个参数:row,column 和 cellValue。row 是当前行的数据,column 是当前列的数据,cellValue 是当前单元格的值。 2.在表格所在行点击编辑,打开弹窗。修改内容,没有点击确定的时候,表格的数据会随着编辑的

    2024年02月14日
    浏览(40)
  • Jmeter接口测试实战篇:10分钟学会Jmeter的用法

    一提到接口测试,通常大家会有这样的疑问:前端测试不是已经覆盖到各种业务逻辑了吗?为什么还要做接口测试,接口测试和前端测试是不是重复了?对于这个问题,可以从下面几个方面来解释: 什么是接口测试? 接口测试是测试系统组件间接口的一种测试。接口测试主

    2024年02月20日
    浏览(44)
  • Python入门教程+项目实战-14.1节-函数的参数用法

    目录 14.2.1 位置参数与参数 14.2.2 函数的参数默认值 14.2.3 函数的引用类型参数 14.2.4 函数的可变参数 14.2.5 知识要点 14.2.6 系统学习python 位置参数与参数的位置相关,这里的位置是指定义函数时的从左到右的参数排列顺序。在调用函数时,会自动将实参与形参的位置对

    2024年02月11日
    浏览(55)
  • mybatis实战:四、insert 用法(普通插入、返回主键自增的值)

    1.UserMapper.xml 1.指定特殊数据类型 2.<insert >元素,这个标签包含如下属性  2. UserMapperTest  1.只插入一条数据 2.回滚(不写入数据库) 3.插入后判断是否为空(为空/不为空,抛异常) 3.UserMapper 方法一: 使用 JDBC 方式返回主键自增的值  方法二: 使用 selectKey 返回主键的值

    2024年02月07日
    浏览(45)
  • 【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,

    2024年04月17日
    浏览(49)
  • 【云服务器 ECS 实战】ECS 快照&镜像的原理及用法详解

    1. 阿里云 ECS 快照概述 阿里云快照服务支持所有类型的云盘,是一种低成本、便捷高效的数据备份手段,也可以用于创建镜像或容灾、分发数据副本等。对于某一个重要的磁盘数据,当我们想要给他做一个备份时,就需要用到快照。此外在进行磁盘备份之后,也有助于我们随

    2024年02月03日
    浏览(37)
  • 存储技术常用术语简析

    在通俗意义上来,Memory 一般翻译为存储器,存储器用来指代那些能够帮助计算机存储信息的部件。由于目前还不存在速度快、数据断电不丢失同时单位容量价格又低的存储器技术,为了平衡 I/O 性能和价格,取舍之间,计算机通常会构建一个包含三层的存储器层次结构,即

    2024年02月13日
    浏览(33)
  • 静态数据包过滤深入简析

    数据包过滤有时也称为静态数据包过滤,它通过分析传入和传出的数据包以及根据既定标准传递或阻止数据包来控制对网络的访问。 当路由器根据过滤规则转发或拒绝数据包时,它便充当了一种数据包过滤器。当数据包到达过滤数据包的路由器时,路由器会从数据包报头中提

    2024年02月05日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包