Verilog代码优化技巧

Verilog代码优化技巧:


1. 条件b为TRUE时,将c赋值给a;

always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b)a <= c;elsea <= a;

🎿时序逻辑里,后面的else如果不写的话,综合时会自动插入门控时钟。也就是说,只有满足if和else if里的条件,时钟fclk才有效,否则fclk无效,寄存器不翻转,从而达到节省功耗的目的;

always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b)a <= c;

2. 条件b为TRUE时, 若c为TURE将d赋值给a,否则将a赋值给a。

always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b)a <= c ? d : a;

👾其实b, c均为TRUE时,a才翻转,因此完全可以写成

always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b & c)a <= d;

3. b为true时,将a1+a2赋值给a,否则若c为true,则将a3+a4赋值给a;

always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b)a <= a1 + a2;else if(c)a <= a3 + a4;

💎直接这样写会综合出两个加法器,但实际上b和c两个分支不可能同时运行,因此只需要一个加法器即可:

assign a_tmp0 = b ? a1 : a3;
assign a_tmp1 = b ? a2 : a4;
assign a_tmp = a_tmp0 + a_tmp1;always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b | c)a <= a_tmp;

4. 设存在2bit寄存器cnt, 和4bit寄存器a, 当输入b_vld为1时,将1bit数据b写进cnt对应的a的位置; 例如cnt为2‘b11, 则a[3] <= b;

always@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b_vld)case(cnt)'d0: a[0] <= b;'d1: a[1] <= b;'d2: a[2] <= b;;default : a[3] <= b;endcase

🏆这样写有个缺点是,如果cnt和a的位宽很大,那case就会写的非常的长;每次只会更新cnt对应的位宽,那我们可以设一个wire变量a_tmp,当cnt==i时,将对应的a_tmp[i]赋值为b,否则和a[i]一样; b_vld有效时,将a_tmp赋值给a;

genvar  i;
generate 
for (i = 0 ; i < 4 ; i++)begin:  a_valueassign a_tmp[i] = cnt==i ? b ? a[i];end
endgeneratealways@(posedge fclk or negedge frstn)if(!frstn)a <= 0;else if(b_vld)a <= a_tmp;

5. 多个1bit信号的翻转

always@(posedge fclk or negedge frstn)if(!frstn)a_1d <= 0;else if(vld)a_1d <= a;always@(posedge fclk or negedge frstn)if(!frstn)b_1d <= 0;else if(vld)b_1d <= b;always@(posedge fclk or negedge frstn)if(!frstn)c_1d <= 0;else if(vld)c_1d <= c;always@(posedge fclk or negedge frstn)if(!frstn)d_1d <= 0;else if(vld)d_1d <= d;

🎯一般来说,4bit以下的寄存器,即使没有以else结尾,综合工具也不会自动插入门控时钟。因为插入门控时钟需要额外的电路,为了4bit以下的寄存器做门控时钟,节省的功耗和需要增加的,面积相比,不划算。

always@(posedge fclk or negedge frstn)if(!frstn)begina_1d <= 0;b_1d <= 0;c_1d <= 0;d_1d <= 0;endelse if(vld)begina_1d <= a;b_1d <= b;c_1d <= c;d_1d <= d;end

🎮如上段代码所示,这样的话,综合工具就会将a_1d,b_1d,c_1d和d_1d,看成一个大的寄存器去处理,就会插入门控时钟了;但需要注意的是,a_1d,b_1d,c_1d和d_1d,的翻转条件必须是一样的,否则不会看成一个整体去插入时钟,比如:

always@(posedge fclk or negedge frstn)if(!frstn)begina_1d <= 0;b_1d <= 0;c_1d <= 0;d_1d <= 0;endelse if(vld0)begina_1d <= a;b_1d <= b;c_1d <= c;d_1d <=d;endelse if(vld1)begina_1d <= a;end

🌂a_1d的翻转条件是vld0 | vld1, 而其他寄存器是vld0,翻转条件不一样,综合时会将b_1d,c_1d和d_1d看成一个寄存器,将a_1d作为一个单独寄存器,去进行综合优化。


6. 总结

verilog设计里,主要思路就是两点:

  • 🎩1. 寄存器能不翻转就不翻转,寄存器的时钟能关掉就关掉:减小翻转功耗;
  • 👑2. 运算单元和寄存器,能复用就复用:减小芯片面积;

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

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

相关文章

Integer的使用

在Java中&#xff0c;Integer 是一个包装类&#xff0c;用于将基本数据类型 int 包装为一个对象。这个类提供了许多方法来操作和处理整数数据。下面是对 Integer 类的一些重要的概念和功能的详细介绍&#xff1a; 装箱和拆箱&#xff1a;Integer 类允许将 int 基本数据类型转换…

Instagram SEO如何优化?10个技巧

Instagram SEO 是优化 Instagram 内容以使其在平台搜索结果中被发现的做法。如果你希望你可以更快的让你的Ins获得流量&#xff0c;做好SEO就成功了一半。Instagram 搜索结果包括相关内容、帐户、音频、主题标签和地点&#xff0c;下面为你总结10个策略技巧&#xff01; 一、In…

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章&#xff0c;这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。 目录 strchr strtok sprintf和sscanf strchr strchr 是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现 strchr 函数的示例&…

UI自动化之Poco常用断言方式

实际上用到的几种写断言的方式&#xff1a; 1.验证UI界面&#xff08;断言图片是否存在&#xff0c;UI页面不稳定情况下&#xff0c;图片识别效率不高&#xff09; assert_exists assert_not_exists 2.验证数值&#xff08;断言传入的两个值(数字或者string)是否相等&#xff…

【Linux】信号-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号递达&#xff0c;信号未决&#x…

WebGPU Inter-stage 变量

1. webgpu Inter-stage 变量 Inter-stage变量在顶点着色器和片段着色器之间发挥作用。 这里我们声明了一个结构体 struct&#xff0c;这是在顶点着色器和片段着色器之间增加 Inter-stage 变量的一种简便方法。 struct OurVertexShaderOutput {builtin(position) position : …

vue3学习——自定义插件,注册组件(引入vue文件报红线)

在src/components文件夹目录下创建一个index.ts文件 import { App, Component } from Vue import SvgIcon from /components/SvgIcon/index.vue import Pagination from /components/Pagination/index.vue const globalComponents: { [name: string]: Component } { SvgIcon,…

第三模块 面向对象网络并发编程

第三模块 面向对象&网络&并发编程 面向对象基础1. 初识面向对象1.1 对象和self1.2 常见成员1.3 应用示例 2. 三大特性2.1 封装2.2 继承练习题2.3 多态 3. 扩展&#xff1a;再看数据类型总结作业 从今天开始&#xff0c;我们将进入系列课程第3个模块的的学习&#xff0c…

TCP和UDP相关问题(重点)(5)——5.TCP三次握手和四次挥手(非常重要)

5.1三次握手的过程 一次握手&#xff1a;客户端发送带有SYN(x)标志的数据包到服务端&#xff0c;然后客户端进入SYN_SEND状态&#xff0c;等待服务器端的确认。 二次握手&#xff1a;服务端发送带有SYN(y)ACK(x1)标志的数据包到客户端&#xff0c;然后服务端进入SYN_RECV状态。…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

收到微信发的年终奖。。。

大家好&#xff0c;我是小悟 还剩一天就过除夕了&#xff0c;很多单位都已经放假了&#xff0c;街上的人越来越少&#xff0c;门店关着的很多&#xff0c;说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖&#xff0c;坚守节前最后一波工作&#xff0c;或许你正在回家的…

Java学习16-- 面向对象学习45. 面向对象三大特征抽象类和接口

面向对象学习4. 面向对象三大特征 1封装&#xff1a;高内聚(内部细节自己用&#xff0c;外部不能介入)&#xff0c;低耦合(保留很少接口给外部使用)&#xff0c;信息隐藏&#xff08;禁止外界直接访问内部数据(private)&#xff0c;如需要&#xff0c;可通过get/set接口访问&a…

docker初级问题一

一、什么是Docker&#xff0c;以及它的主要用途是什么&#xff1f; Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言开发&#xff0c;并遵循Apache 2.0协议。Docker让开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机…

【评论送书】AIGC重塑教育:AI大模型驱动的教育变革与实践

作者&#xff1a;刘文勇 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑教育&#xff1a;AI大模型驱动的教育变革与实践》&#xff0c;机械工业出版社出版 这次&#xff0c;狼真的来了。 AI正迅猛地改变着我们的生活。根据高盛发布的一份报告&#xff0c;AI有可能取代…

第九个知识点:内部对象

Date对象: <script>var date new Date();date.getFullYear();//年date.getMonth();//月date.getDate();//日date.getDay();//星期几date.getHours();//时date.getMinutes();//分date.getSeconds();//秒date.getTime();//获取时间戳&#xff0c;时间戳时全球统一&#x…

Qt 常用算法及正则表达式

目录 常用算法 正则表达式 常用算法 double c qAbs(a)&#xff0c;函数 qAbs() 返回 double 型数值 a 的绝对值 double max qMax(b,c)&#xff0c;函数 qMax() 返回两个数值中的最大值 int bnqRound(b)&#xff0c;返回一个与浮点数最接近的整数值(四舍五入) int cn q…

聊聊PowerJob Worker的ServerAddress

序 本文主要研究一下PowerJob Worker的ServerAddress PowerJobAutoConfiguration tech/powerjob/worker/autoconfigure/PowerJobAutoConfiguration.java BeanConditionalOnMissingBeanpublic PowerJobSpringWorker initPowerJob(PowerJobProperties properties) {PowerJobPr…

swift结算体系

在金融和支付领域&#xff0c;Swift&#xff08;Society for Worldwide Interbank Financial Telecommunication&#xff09;不是指Swift编程语言&#xff0c;而是一种用于国际金融机构之间进行安全和高效通信的网络协议。Swift提供了一种标准化的方式&#xff0c;使得银行和金…

玩转量子代码:量子软件入门指南

量子计算领域关注的焦点往往落在硬件上&#xff1a;量子比特和超导电路等。但现在是时候把我们的注意力转移到幕后英雄量子软件上&#xff0c;从将抽象的量子算法转化为可执行的代码到优化电路设计&#xff0c;量子软件起到了举足轻重的作用。 我们在本文中将探究量子编程的基…

TypeScript | 给对象的空属性赋值

需求是接收一个对象&#xff0c;指定此对象的某些属性&#xff0c;如果属性值为空&#xff0c;赋一个值&#xff0c;并且生成一个新对象。 代码&#xff1a; import { cloneDeep } from lodash;function assignDefaults<T>(obj: T, def: Partial<T>): T {// 深拷…