#systemverilog# 关于三个参数:parameter、specparam、localparam

您所在的位置:网站首页 localparam什么意思 #systemverilog# 关于三个参数:parameter、specparam、localparam

#systemverilog# 关于三个参数:parameter、specparam、localparam

2023-07-10 03:04| 来源: 网络整理| 查看: 265

目录

一 概述

二 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不能直接被修改,需要通过其它常量进行间接的修改; 

二 parameter

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

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

【示例】

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

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

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

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

三 localparam

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

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

【示例】

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

四 specparam

(1)specparam声明了一种较为特殊的参数,除了不能赋值给parameter外,其可以出现在一个模块的任何位置。

(2)specparam指定的参数的声明必须先于其使用。

(3)specparam指定的参数不能在模块中通过例化或者参数传递进行修改,唯一可以修改参数肚饿方法是通过SDF反标修改。

【示例】

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

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

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

五 总结

 六 实战

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

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

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

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

【示例1】

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

 【示例2】



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3