当前位置: 首页 > news >正文

逻辑优化-rewrite

简介

逻辑综合中的rewrite算法是一种常见的优化算法,其主要作用是通过对逻辑电路的布尔函数进行等效变换,从而达到优化电路面积、时序和功耗等目的。本文将对rewrite算法进行详细介绍,并附带Verilog代码示例。

一、算法原理

rewrite算法的核心思想是通过布尔代数中的等价变换来达到电路优化的目的。具体而言,算法将电路的原始布尔函数通过一系列等价变换转化为更简单的布尔函数,从而达到优化的目的。

二、算法流程

rewrite算法的流程如下所示:

Created with Raphaël 2.3.0 开始 输入电路的原始布尔函数 根据规则库中定义的等价变换规则, 将原始布尔函数转化为一个或多个新的布尔函数 对新的布尔函数重复上述步骤, 直到布尔函数无法继续化简为止 输出化简后的布尔函数 结束

具体来说,rewrite算法通过一系列等价变换规则将布尔函数转化为其等效的形式,例如如下所示:

同一律: A+A=A; A*1=A;
零元素: A+0=A; A*0=0;
吸收律: A+AB=A; A(A+B)=A;
分配律: A*(B+C)=AB+AC;
德摩根定律: ~(A+B)=~A~B; ~(AB)=~A+~B;
布尔恒等式: A+~A=1; A*~A=0;
交换律: A+B=B+A; AB=BA;
结合律: A+(B+C)=(A+B)+C; A*(BC)=(AB)*C;
分配律的逆定理: (A+B)C=(AC)+(B*C);
吸收律的逆定理: A+(AB)=A; A(A+B)=A。

通过这些等价变换规则,rewrite算法可以将一个布尔函数化简为其最简形式,从而达到电路优化的目的。

3. 示例

假设我们有一个简单的逻辑电路,其功能等价于两个输入a和b做异或运算,输出结果为c:

module xor_gate(input a, b, output c);
  assign c = a ^ b;
endmodule

我们可以使用逻辑综合中的rewrite算法对这个电路进行优化,从而得到一个更为简单的电路。

具体来说,我们可以应用一个rewrite规则:将异或门替换为两个AND门、一个OR门和两个NOT门的等效电路。下面是应用这个规则后的Verilog代码:

module xor_to_and_or(input a, b, output c);
  wire not_a, not_b, and_a_b, and_not_a_not_b, or_a_b;
  assign not_a = ~a;
  assign not_b = ~b;
  assign and_a_b = a & b;
  assign and_not_a_not_b = not_a & not_b;
  assign or_a_b = and_not_a_not_b | and_a_b;
  assign c = ~or_a_b;
endmodule

然后,我们可以在原始的xor_gate模块中,使用新的xor_to_and_or模块来实现优化后的电路,如下所示:

module xor_gate(input a, b, output c);
  xor_to_and_or rule(.a(a), .b(b), .c(c));
endmodule

通过这个优化,我们将一个异或门转化为了两个AND门、一个OR门和两个NOT门的电路结构,从而实现了对电路的优化,事实上这是一个反向的 “优化”。

当然,这只是一个简单的例子,实际应用中rewrite算法的规则和应用方法可能会更加复杂和多样化,需要根据具体的设计需求和约束来确定。同时,需要注意电路优化可能会对电路的性能、功耗、可靠性等方面产生影响,需要进行综合分析和评估。

了解ABC中的rewriting,请参考博客:【逻辑综合知识点总结】

相关文章:

  • ECharts可视化库--常用组件
  • 【FPGA】Verilog:时序电路应用 | 序列发生器 | 序列检测器
  • 【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)
  • 【前端必看】极大提高开发效率的网页 JS 调试技巧
  • VMware虚拟机安装Linux教程
  • 统计软件与数据分析—Lesson2
  • 【玩转c++】vector讲解和模拟底层实现
  • Scrapy框架(高效爬虫)
  • 2023湖南省“楚怡杯”职业技能大赛“网络安全” 项目比赛任务书
  • vue简介与环境搭建
  • React(五):受控组件、高阶组件、Portals、Fragment、CSS的编写方式
  • 用Python Flask为女朋友做一个简单的网站(附可运行的源码)
  • ACM---大一第三周周赛(Floyd算法+并查集算法学习周)
  • 【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现
  • 蓝桥杯第十四届校内赛(第三期) C/C++ B组
  • [Vue CLI 3] 配置解析之 css.extract
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Centos6.8 使用rpm安装mysql5.7
  • HTTP中的ETag在移动客户端的应用
  • IDEA常用插件整理
  • JavaScript异步流程控制的前世今生
  • Java编程基础24——递归练习
  • Java精华积累:初学者都应该搞懂的问题
  • win10下安装mysql5.7
  • windows下使用nginx调试简介
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 对象引论
  • ------- 计算机网络基础
  • 记录一下第一次使用npm
  • 我建了一个叫Hello World的项目
  • 详解NodeJs流之一
  • 学习Vue.js的五个小例子
  • 一道闭包题引发的思考
  • 用Python写一份独特的元宵节祝福
  • HanLP分词命名实体提取详解
  • Java性能优化之JVM GC(垃圾回收机制)
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​linux启动进程的方式
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (30)数组元素和与数字和的绝对差
  • (ibm)Java 语言的 XPath API
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (推荐)叮当——中文语音对话机器人
  • (转)德国人的记事本
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .Net 4.0并行库实用性演练
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Micro Framework初体验