【前端设计】尝试一文搞懂verilog parameter的全部细节

news2024/11/18 10:48:44

这里是尼德兰的喵·芯片设计相关文章,欢迎您的访问!

如果文章对您有所帮助,期待您的点赞收藏!

让我们一起为成为芯片前端全栈工程师而努力!

一个参数的标准定义呢应该是这样的:

parameter type range name = value;

也就是说一个标准的参数呢是有以下四个属性的:type类型,range位宽/区间,name名字和value数值。实际操作中呢,除了名字和数值其他两个是可以省略的,比如下面这些参数定义方法都是可以编译的:

parameter P0 = 5;
parameter P1 = 3'd5;
parameter P2 = -5;
parameter P3 = 1.5;
parameter P4 = P0 + P1;
parameter signed [15:0]   P5 = -7;
parameter unsigned [15:0] P6 = -7;
parameter [15:0] P7 = -7;
parameter [15:0] P8 = 2'd1;
parameter real P9 = 3e7;
parameter realtime P10 = 10;
parameter unsigned [63:0]P11 = $signed(-2);
parameter signed[31:0]P12 = $unsigned(-2);
parameter P13 = $unsigned(-2);
parameter [31:0]P14 = -2;

顺便我将这些参数的打印结果也放一下:

P0 = 'b101 = 'd5 = 'f5.000000
P1 = 'b101 = 'd5 = 'f5.000000
P2 = 'b11111111111111111111111111111011 = 'd-5 = 'f-5.000000
P3 = 'b1 = 'd1 = 'f1.500000
P4 = 'b1010 = 'd10 = 'f10.000000
P5 = 'b1111111111111001 = 'd-7 = 'f-7.000000
P6 = 'b1111111111111001 = 'd65529 = 'f65529.000000
P7 = 'b1111111111111001 = 'd65529 = 'f65529.000000
P8 = 'b1 = 'd1 = 'f1.000000
P9 = 'b1110010011100001110000000 = 'd30000000 = 'f30000000.000000
P10 = 'b1010 = 'd10 = 'f10.000000
P11 = 'b1111111111111111111111111111111111111111111111111111111111111110 = 'd18446744073709551614 = 'f18446744073709551616.000000
P12 = 'b11111111111111111111111111111110 = 'd-2 = 'f-2.000000
P13 = 'b11111111111111111111111111111110 = 'd4294967294 = 'f4294967294.000000
P14 = 'b11111111111111111111111111111110 = 'd4294967294 = 'f4294967294.000000

那么我们就来分析分析这些参数定义方式的四个属性分别是什么。判定参数的属性时,遵循两个大的基本原则(就是说特殊情况除外的那种原则上说):

1.如果有显性声明,则以显性声明为准;

2.如果没有声明type和range,则以value的type和range为准;

一个与大规则2相违背的小规则:

1.如果参数有指定range,但没有type,则它的符号默认为unsigned,并且range和符号都不会被后面的声明所覆盖;

规则其实并不乱,咱们一起来看一下 。

parameter P0 = 5;
打印:
P0 = 'b101 = 'd5 = 'f5.000000

这是我们最常用的写法了,此时P0的属性由后面的5来决定。而5本身是int型数据,因此P0的属性为:type = signed,range = [31:0],value = 5。

parameter P1 = 3'd5;
打印:
P1 = 'b101 = 'd5 = 'f5.000000

与P0很接近,只不过此时3'd5指明了数据类型为unsigned,数据位宽为3bit,因此P1的属性为:type = unsigned,range = [2:0],value = 5。其实这种情况下signed和unsigned并不太区分,甚至我感觉很多时候是和编译器和lint检查软件有关系。

那么我们改一下,

parameter P2 = -5;
parameter [15:0] P7 = -7;
打印:
P2 = 'b11111111111111111111111111111011 = 'd-5 = 'f-5.000000
P7 = 'b1111111111111001 = 'd65529 = 'f65529.000000

这两个放一起看,一个等于-5一个等于-7,value的属性其实是一样的,但是看打印结果也能看出来P2是有符号数而P7是无符号数,为什么呢?注意小规则1:

1.如果参数有指定range,但没有type,则它的符号默认为unsigned,并且range和符号都不会被后面的声明所覆盖;

显然P7就符合这种情况,因此P7是无符号数,P2是有符号数。

parameter P3 = 1.5;
打印:
P3 = 'b1 = 'd1 = 'f1.500000

设计代码中很少有这种参数,所以我觉得吧看看结果就好了( • ̀ω•́ )✧能编译,能不能综合我就不知道了,感兴趣的自行探究下吧。

parameter P4 = P0 + P2;
打印:
P4 = 'b1010 = 'd10 = 'f10.000000

parameter中是可以包含运算的,像这种就是运算得出结果后在遵循之前的规则,因此P4的属性为:type = unsigned,range = [31:0],value = 10。

parameter signed [15:0]   P5 = -7;
parameter unsigned [15:0] P6 = -7;
打印:
P5 = 'b1111111111111001 = 'd-7 = 'f-7.000000
P6 = 'b1111111111111001 = 'd65529 = 'f65529.000000

P5和P6很好的说明了,显性定义的type是不会被后面的value所覆盖的,P5的属性:type = signed,range = [15:0],value = -7,P6的属性:type = unsigned,range = [15:0],value = 65529。

parameter [15:0] P8 = 2'd1;
打印:
P8 = 'b1 = 'd1 = 'f1.000000

这个地方不要被打印蒙蔽哈,因为我用的是%0b/d/f的方式所以打印时会截掉没有的位宽。

parameter real P9 = 3e7;
parameter realtime P10 = 10;
打印:
P9 = 'b1110010011100001110000000 = 'd30000000 = 'f30000000.000000
P10 = 'b1010 = 'd10 = 'f10.000000

这种real、realtime型在设计中也很少写,不建议过多关注。real数据类型支持的语法显然在参数定义时也是可以支持的。

parameter unsigned [63:0]P11 = $signed(-2);
parameter signed[31:0]P12 = $unsigned(-2);
parameter P13 = $unsigned(-2);
parameter [31:0]P14 = -2;
打印:
P11 = 'b1111111111111111111111111111111111111111111111111111111111111110 = 'd18446744073709551614 = 'f18446744073709551616.000000
P12 = 'b11111111111111111111111111111110 = 'd-2 = 'f-2.000000
P13 = 'b11111111111111111111111111111110 = 'd4294967294 = 'f4294967294.000000
P14 = 'b11111111111111111111111111111110 = 'd4294967294 = 'f4294967294.000000

这四个对比着看,很有意思。P11和P12都能看出,显性声明优先级最高。P13没有显性声明听value的规则,value是无符号数那P13也是无符号数。P14只有range没有type,那type就固定为unsigned,不听value的了。

OK所有关于参数的细节就说完了,在进行lint检查时有时参数会造成一些这也不对那也不对的干扰,那么如果你很确认自己的设计没有风险的话,可以在rule.tcl中将check_static_value关闭,那么spyglass就不会对parameter的lint违规进行检查了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SHELL——备份脚本

编写脚本,使用mysqldump实现分库分表备份。 1、获取分库备份的库名列表 [rootweb01 scripts]# mysql -uroot -p123456 -e "show databases;" | egrep -v "Database|information_schema|mysql|performance_schema|sys" mysql: [Warning] Using …

二十三种设计模式第十九篇--命令模式

命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许您以参数化的方式将客户端代码与具体实现解耦。在命令模式中,命令对象充当调用者和接收者之间的中介。这使您能够根据需要将请求排队、记录请求日志、撤销操作等。 命令模…

华为数通HCIP-IP组播基础

ospf、isis、BGP--ping通,单播路由--单播路由表; mpls--单播标签互通 点到多点业务流量下发 1、通过广播 一对所有发送; 缺陷:导致流量的有偿性、安全性得不到保障; 2、通过单播 一对一发送; 缺陷&…

嵌入式软件和硬件首先说一下怎么入门?

1,编程。这个你是否懂C语言编程,能够熟练或者熟悉使用C语言编写一段程序。不懂学习C语言。 2,单片机。你是否了解什么是单片机,单片机是做什么的。不懂的话,最好先了解一下什么是单片机,看下书&#xff0c…

万里腾飞终有路,国产替代正当时

2023年7月27-28日,I-CAR 2023 第六届细胞免疫疗法深度聚焦论坛在上海建工浦江皇冠假日酒店隆重举办,本次大会主要围绕实体瘤、质量控制&产业化、通用CAR-T疗法、免疫治疗新风口四大主题展开,就细胞免疫治疗快速发展崛起的同时&#xff0c…

openGauss学习笔记-26 openGauss 高级数据管理-约束

文章目录 openGauss学习笔记-26 openGauss 高级数据管理-约束26.1 NOT NULL约束26.2 UNIQUE约束26.3 PRIMARY KEY26.4 FOREIGN KEY26.5 CHECK约束 openGauss学习笔记-26 openGauss 高级数据管理-约束 约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成…

ubuntu下,在vscode中使用platformio出现 Can not find working Python 3.6+ Interpreter的问题

有一段时间没有使用platformio了,今天突然使用的时候,发现用不了,报错: Ubuntu PlatformIO: Can not find working Python 3.6 Interpreter. Please install the latest Python 3 and restart VSCode。 上网一查,发现…

最全面的TCP、UDP、Socket、HTTP网络编程面试题

先看一天面试的经验: 第一场: 面试官:你说一下TCP的三次握手 我:第一次Client将SYN置1......、第二次Server收........、 第三次........ 面试官:很难背吧? 我:......是啊,很难&…

【编译】gcc make cmake Makefile CMakeList.txt 区别

文章目录 一 关系二 gcc2.1 编译过程2.2 编译参数2.3 静态库和动态库1 后缀名2 联系与区别 2.4 GDB 调试器1 常用命令 三 make、makefile四 cmake、cmakelist4.1 语法特性4.2 重要命令4.2 重要变量4.3 编译流程4.4 两种构建方式 五 Vscode5.0 常用快捷键5.1 界面5.2 插件5.3 .v…

程序的编译(3/13)

经过预处理后的源文件,褪去一切包装,注释被删除,预处理命令也基本上被处理掉,剩下的就是 C 代码了。接下来的第二步,就进入到编译阶段。编译阶段主要分为两步:第一步,编译器调用一系列解析工具分…

leetcode 面试题 08.05.递归乘法

⭐️ 题目描述 🌟 leetcode链接:面试题 08.05.递归乘法 思路: A 3 , B 4 ,3 * 4 等价于 3 3 3 3。 代码: int multiply(int A, int B){if (!B) {return 0;}return A multiply(A , B - 1); }

23款奔驰AMG GLE53加装原厂HUD抬头显示系统,增加您的行车安全

HUD是平视显示器的简称,它原先是运用在航空器上的飞行辅助仪器。指飞行员不需要低头,就能够看到他需要的重要资讯。由于HUD的方便性以及能够提高飞行安全,这项技术后来也发展到汽车行业。汽车搭载的HUD抬头数字显示功能,是利用光学…

Antd 日期范围选择框选择一个日期后,面板收起

需求 初始状态只有开始时间,如下图⬇️ 产品需要优化体验: 点击结束日期选择日期下拉面板直接收起,而不是需要选择起始时间 思路 需要一段逻辑的open属性控制后续操作还是由组件内部控制 逻辑 第一次打开,open控制选择了&am…

史上最全,商业智能BI干货满满

商业智能BI是什么? 商业智能BI可以实现业务流程和业务数据的规范化、流程化、标准化,打通ERP、OA、CRM等不同业务信息系统,商业智能BI整合归纳企业数据,商业智能BI利用数据可视化满足企业不同人群对数据查询、分析和探索的需求&a…

AOP自定义注解保存到MongoDB数据库

如果你想用mongoDB做全局日志记录,比如记录controller方法执行相关数据,比如像这样。 整个流程:先写自定义注解。定义一个日志对象,字段属性设置好。 写aop 规范自定义注解如何使用,在其中通过切点和反射把相关参数存到…

机器学习笔记之优化算法(五)线搜索方法(步长角度;非精确搜索;Armijo Condition)

机器学习笔记之优化算法——线搜索方法[步长角度,非精确搜索,Armijo Condition] 引言回顾:关于 f ( x k 1 ) ϕ ( α ) f(x_{k1}) \phi(\alpha) f(xk1​)ϕ(α)的一些特性非精确搜索近似求解最优步长的条件 Armijo Condition \text{Armijo…

行业追踪,2023-07-31,板块多数都是指向消费

自动复盘 2023-07-31 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

【数据挖掘竞赛】——科大讯飞:锂离子电池生产参数调控及生产温度预测挑战赛

🤵‍♂️ 个人主页:@Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ ​ 【科大讯飞】报名链接:https://challenge.xfyun.cn?invitaC…

JAVASE---类和对象

1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的…

Mysql 查询统计最近12个月的数据

包括当月: SELECTt1.yf AS month,count( t2.uuid ) AS total FROM(SELECTDATE_FORMAT(( CURDATE()), %Y-%m ) AS yf UNIONSELECTDATE_FORMAT(( CURDATE() - INTERVAL 1 MONTH ), %Y-%m ) AS yf UNIONSELECTDATE_FORMAT(( CURDATE() - INTERVAL 2 MONTH ), %Y-%m ) AS yf UNION…