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日
    浏览(26)
  • 【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日
    浏览(29)
  • formatter的用法,深拷贝, Object.assign 方法实战。

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

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

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

    2024年02月20日
    浏览(38)
  • 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日
    浏览(43)
  • 【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

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

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

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

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

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

    2024年02月07日
    浏览(37)
  • Android FFmpeg应用简析

    FFmpeg是一个跨平台的自由软件,可用于录制、转换和流式传输音频和视频。它包含了非常多的音频/视频编解码库、封装格式库以及工具库。它不仅支持各种常用的音视频格式,而且支持一些非常罕见的格式。 FFmpeg实际上是一个命令行工具,可以在终端窗口中使用。它可以在

    2024年02月13日
    浏览(33)
  • 74HC245芯片简析

    74HC245 是一种三态输出、八路信号收发器,主要应用于大屏显示。 如图: 该芯片中A0到A7 和 B0到B7既可以作为输入也可以作为输出。 当DIR为高电平时,A为输入,B为输出。 当DIR为低电平时,B为输入,A为输出。 OE为使能控制,当OE为低电平时才能正常工作。 该芯片其他信息如下

    2024年02月12日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包