zoukankan      html  css  js  c++  java
  • RTL基本知识:参数三姐妹-parameter-localparam-specparam

     在Verilog中,parameter既不属于变量范畴也不属于线网范畴,经常用来定义一个标志符代表一个常量,所以参数的值在仿真运行的过程中不能进行修改。但是通过使用参数,可以提高程序的可读性、可复用性和可维护性。目前常用的参数主要分为两大类:module参数(parameter和localparam)和specify参数(specparam)。

    虽然参数使用起来较为方便,但是在使用参数时还需要注意以下几点: 

    • parameter、specparam、localparam必须在elaboration阶段有确定的值; 
    • parameter、specparam、localparam只能声明于module、静态任务和函数中,不能在动态函数和任务或者begin-end和fork-join中声明; 
    • 在module或者specify中参数的名字必须是唯一的,即不能重复声明,也不能使用已声明的变量或者线网的名字; 
    • parameter可以在elaboration过程中通过defparam进行修改或者通过命令行进行修改; 
    • specparam在elaboraion阶段被SDF中相关时序反标修改; 
    • localpram不能直接被修改,需要通过其它常量进行间接的修改; 

    【注意】

    1、parameter

    按照1364的描述,参数可以指定类型和范围,但是要遵守一定的规则: 

    • 参数声明的时候没有指定类型和范围时,参数和类型与被赋予的值相同; 
    • 参数声明的时候仅指定了范围没有指定类型时,参数将为无符号参数,且范围与声明时指定的一致,即不随被赋予的值而改变,所以如果被赋予的值范围大于参数声明时指定的范围,那么高位将会被截取; 
    • 参数声明时指定了类型,但是没有指定范围,那么参数的范围将由被赋予的值的范围决定,但是类型由参数声明时指定的类型决定; 
    • 参数声明时指定为有符号变量类型和范围,那么参数不受被赋予的值的符号类型和范围影响; 
    • 参数声明时没有指定范围但是制定了是否有符号,且被赋予的值有范围限制,那么这个参数的范围为[被赋予的值的范围-1:0]; 
    • 参数声明时没有指定范围但是制定了是否有符号,且被赋予的值无范围限制,那么这个参数的范围为[31:0],其中msb至少为31; 

    【示例】

    通过对上述代码的仿真,可以得到以下几个特点:

    第三行声明的参数SIZE并没有指定数据类型和参数范围,所以在仿真时,SIZE的宽度默认为31位;

    尽管在模块例化时,通过参数传递覆盖了模块中的参数SIZE,但是defparam通过层次路径覆盖设计中的参数具有更高的优先级(由此可以知道defparam的执行处于elaboration的最后阶段);

    【注意】defparam可能在将来Verilog新的版本中删除,所以在设计中尽量不要使用。

    2、 localparam

    localparam与parameter基本功能相同,两者的不同主要表现在以下几方面: 

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

    【示例】

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

    3、specparam

    specparam声明了一种较为特殊的参数,除了不能赋值给parameter外,其可以出现在一个模块的任何位置,specparam指定的参数的声明必须先于其使用。与其他参数不同的是,specparam指定的参数不能在模块中通过例化或者参数传递进行修改,唯一可以修改参数肚饿方法是通过SDF反标修改;

    【示例】

    通过上例,这里需要注意以下几点:

    • parameter不能被specparam指定的参数修改,否则编译将不会通过;

    • 当specparam指定的是一个参数范围时,该参数将不能被修改!

    4、 异同点

    三种参数的主要异同点如下表:

    specparam参数

    parameter参数

    localparam参数

    声明时关键词为specparam

    声明时关键词为parameter

    声明时关键词为localparam

    可在模块(module)内或specify块内进行声明

    在specify块外,module中声明

    在specify块外,module中声明

    可在模块(module)内或specify块内使用

    不能在specify块中使用

    不能在specify块中使用

    可以通过specparam或者parameter指定的参数赋值

    不能被specparam指定的参数赋值

    只能通过parameter参数赋值

    常用于时序约束,在本模块中声明定义,用于specify块

    常用于模块间参数传递,在本模块中声明定义

    不可直接进行参数传递,在本模块中声明定义

    可通过SDF反标修改指定的参数值

    通过defparam或者模块例化修改原参数值

    通过parameter修改原参数值

    Specparam指定参数时,可以指定参数的取值范围,但是指定参数范围后改参数将不能被修改

    不能指定参数的取值范围

    不能指定参数的取值范围

    5、 参数值修改方法

    通过defparam语句进行修改,但是通过该语句仅能修改parameter参数;

    通过模块例化修改设计中的参数(参数传递的方式与端口信号传递方式类型:参数顺序隐实式传递和参数名显示传递),但是修改的对象也仅限于parameter参数,localparam只能通过parameter间接的被修改;

    specparam只能通过SDF反标的方式被修改,且parameter不能赋值给specparam;

    这里需要注意的是,如果模块中的参数在模块中取决于另一个参数,但是在顶层通过defparam对该参数进行了修改,那么改参数的最终值取决于defparam执行后赋予的值,不受其他参数影响;

    【示例】

    上例中虽然参数TEST被赋予了参数SIZE,但是最终实际上传递TEST的值取决于defparam指定的值。

    更多资讯,请关注个人公众号:芯光灿烂

  • 相关阅读:
    推荐系统 蒋凡译 第一章 引言 读书笔记
    神经网络与深度学习 邱锡鹏 第5章 卷积神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第4章 前馈神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第3章 线性模型 读书笔记
    神经网络与深度学习 邱锡鹏 第2章 机器学习概述 读书笔记
    神经网络与深度学习 邱锡鹏 第1章 绪论 作业
    神经网络与深度学习 邱锡鹏 第1章 绪论 读书笔记
    算法笔记 上机训练实战指南 第13章 专题扩展 学习笔记
    算法笔记 第13章 专题扩展 学习笔记
    算法笔记 上机训练实战指南 第11章 提高篇(5)--动态规划专题 学习笔记
  • 原文地址:https://www.cnblogs.com/xgcl-wei/p/9090918.html
Copyright © 2011-2022 走看看