【原创】parameter、localparam和specparam

article/2025/9/22 2:23:15

在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指定的值。

更多内容请关注下面公众号!

图片

本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通!

 


http://chatgpt.dhexx.cn/article/Uy4bYWwl.shtml

相关文章

model.parameters()的理解与使用

model.parameters()保存的是Weights和Bais参数的值。 首先定义一个模型 #design Model class NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork,self).__init__()self.flatten nn.Flatten()self.linear_relu_stack nn.Sequential(nn.Linear(2*2, 5),nn.ReL…

@param详解注解

param注解的四种使用场景 第一种:方法有多个参数,需要 Param 注解 Mapper public interface UserMapper {Integer insert(Param("username") String username, Param("address") String address); }对应的 XML 文件如下&#xff1…

ios touchesBegan不触发

ios touchesBegan不触发 今天简单写了一个touchesBegan,发现无法触发,点击无效,网上找了半天没有效果。 最终发现问题是uiimageview需要开启交互:

UITableView是不会响应touchesBegan:方法的

2019独角兽企业重金招聘Python工程师标准>>> UITableView是不会响应touchesBegan:withEvent:之类的UIResponder的方法的。因此,加在其上的所有视图的响应者链就断了。如果在UITableView其上加任何的自身不具备类似UIButton一样有目标动作机制的UIView及其…

ios-tableView的touchesBegan事件和didSelectRowAtIndexPath方法

今天做了个测试&#xff0c;看看tableView如果实现了touchesBegan方法和实现了didSelectRowAtIndexPath点击的时候会去实现哪一个&#xff1f; 答案是touchesBegan。 先附上测试的函数 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {N…

iOS事件机制,以及不同手势使用touchesBegan等表现形式

事件处理方法 UIResponder中定义了一系列对事件的处理方法&#xff0c;他们分别是&#xff1a; –(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event–(void)touchesMoved:(NSSet )touches withEvent:(UIEvent )event–(void)touchesEnded:(NSSet )touches withEv…

touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event使用

iOSProgramming – 触摸事件处理&#xff08;2&#xff09; 在上一篇《iOS Programming – 触摸事件处理&#xff08;1&#xff09;》中了解触摸、事件和响应者之后&#xff0c;接下去学习如何处理用户的触摸事件。首先触摸的对象是视图&#xff0c;而视图的类UIView继承了UIRe…

iOS事件机制,以及不同手势使用touchesBegan等表现

2019独角兽企业重金招聘Python工程师标准>>> //事件处理方法 UIResponder中定义了一系列对事件的处理方法&#xff0c;他们分别是&#xff1a; –(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event –(void)touchesMoved:(NSSet )touches withEvent:(U…

ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled()的关系) 先看效果图 本文中&#xff0c;凡是看到xxx(),即表示xxx是一个函数或者方法&#xff01;&#xff01;&#xff01;事件分为事件传递和事…

【application Extension 之TodayExtension】扩展与宿主App之间共享数据有两种方式

文章目录 前言I 、点击跳转到APPII、扩展与宿主App之间共享数据有两种方式:2.1.通过NSUserDefaults2.2. 通过一个扩展与App都可以访问的共享容器,来存放文件,数据(Core Data, Sqlite等都可以存放在这个共享的容器中)III、扩展Widget高度前言

PHP-递归算法

在PHP开发过程中&#xff0c;递归算法通常用于无限极分类。那么所谓递归就是一种函数调用自身的机制。简单来说就是在函数体内直接或间接自己调用自己&#xff0c;但需要设置自调用的条件&#xff0c;若满足条件&#xff0c;则调用函数本身&#xff0c;若不满足则终止本函数的自…

php 递归 递归方式与算法

先设置数据在本地数据库&#xff0c;设置前要先了解pid字段的关系。如果做成菜单还需添加一个路由字段&#xff0c;自行定义。 第一种方式 先将数据提取出转换成数组。重点是Yarray方法里的递归方式。 接下来进行解析方式。 重点&#xff1a;一定要在进行递归之前声明一个静态…

关于递归函数

递归函数概念 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推&#xff0c;直到遇到墙后返回&#xff0c;这个墙就是结束条件。 所以递归要有两个要素&#xff0c;…

php递归函数详解

很多同学在学习递归函数的时候会感到头晕&#xff0c;无法搞清楚递归函数的原理和运行机制&#xff0c;本文将给大家详细讲解递归函数的运行机制和运用。 那什么是递归函数呢&#xff1f; 递归函数即为自调用函数&#xff0c;在函数体内直接或间接自己调用自己&#xff0c;但需…

递归函数

一、基本的递归函数 首先先来了解下C程序在内存中的组织方式&#xff0c;基本上来说一个可执行的程序在内存中有4个区域组成&#xff1a;代码段、静态数据区、堆与栈。代码段包含程序运行时所执行的机器指令&#xff1b;静态数据区是包含在程序的生命周期内的一直持续的数据&a…

PHP 递归函数的理解

很多同学在学习递归函数的时候会感到头晕&#xff0c;无法搞清楚递归函数的原理和运行机制&#xff0c;本文将给大家详细讲解递归函数的运行机制和运用。那什么是递归函数呢&#xff1f;递归函数即为自调用函数&#xff0c;在函数体内直接或间接自己调用自己&#xff0c;但需要…

PHP中使用递归函数

下面是使用递归函数的一个小例子。 目的是根据parent_id和task_id对task进行分类。 具体实现&#xff1a; <?php //连接数据库&#xff0c;使用前几天创建的数据库连接文件进行连接&#xff0c;如果没有这个文件可以去我的博客里找一下 require_once(./db.php); $conn…

PHP递归详解

递归 递归是一种函数调用自身的机制递归必须要有边界条件&#xff0c;也就是递归出口&#xff08;退出递归&#xff09;递归前进段和递归返回段&#xff0c;也就是最后得到的值当边界条件不满足时&#xff0c;递归前进&#xff1b;当边界条件&#xff08;递归出口&#xff09;…

PHP 递归函数

递归函数即自调用函数&#xff0c;在函数体内部直接或间接的自己调用自己&#xff0c;即函数的嵌套调用就是函数本身。通常 在此类型的函数体中会附加一个条件判断&#xff0c;以判断是否需要执行递归调用&#xff0c;并且在特定的条件下终止函数的递归 调用动作&#xff0c;…