本教程经常有提及综合这个词语。或者说有些逻辑不能综合成实际电路,或者说有些逻辑设计综合后的电路会有一些安全隐患。本章就简单介绍下逻辑综合的相关知识,仅从理论层次和普遍认知的角度来阐述。待那个懵懂求知少年变成中年秃顶大叔,再来介绍逻辑综合的具体实践。好像也没有多少时日了(手动狗头)。
综合,就是在标准单元库和特定的设计约束基础上,把数字设计的高层次描述转换为优化的门级网表的过程。标准单元库对应工艺库,可以包含简单的与门、非门等基本逻辑门单元,也可以包含特殊的宏单元,例如乘法器、特殊的时钟触发器等。设计约束一般包括时序、负载、面积、功耗等方面的约束。
无论是数字芯片设计,还是 FPGA 开发,现在综合过程基本都是借用计算机辅助逻辑综合工具,自动的将高层次描述转换为逻辑门电路。设计人员可以将精力集中在系统结构方案、高层次描述、设计约束和标准工艺库等方面,而不用去关心高层次的描述怎么转换为门级电路。综合工具在内部反复进行逻辑转换、优化,最终生成最优的门级电路。该过程如下所示。

简单的赋值语句通常被综合为基本的逻辑门单元
assign F = (A & B) | C ;
上述代码通常会被综合为如下门级电路:

条件语句通常被综合为选择器
assign F = sel ? A : B ;
上述代码通常会被综合为如下门级电路:

always 块中时钟触发的赋值语句通常被综合为触发器
always @(posedge clk) begin
q <= d ;
end
上述代码通常会被综合为如下电路:

再复杂的设计,综合之后,都会被转换为由各种单元库原件组成的门级网表。总之,逻辑综合可以狭隘的理解为,将 Verilog 设计转换为用优化的基本逻辑门单元、特殊的宏单元表示的过程。
从高层次 RTL 描述到门级网表的详细综合过程如下图所示。

RTL 描述
用硬件描述语言(例如 Verilog)设计数字电路,并进行仿真保证逻辑功能的正确性。
翻译
RTL 描述会被综合工具转换为一个未经优化的中间表示。该过程读入 Verilog 描述的基本原语和操作,不考虑面积、时序、功耗等设计约束,仅完成简单的内部资源分配。
未优化的中间表示
翻译过程中产生的中间表示,数据格式由综合工具内部识别,用户无法也无需了解。
逻辑优化
优化设计逻辑,删除冗余逻辑。该过程往往会将 RTL 设计的一些变量删除,或重新命名,逻辑实现过程往往也会改变,以达到逻辑的最优化实现。该过程会产生优化的内部表示。
工艺映射和优化
此步骤之前,设计的描述过程是独立于目标工艺的。该步骤中,综合工具将使用工艺库(标准单元库)中提供的逻辑单元,实现设计的内部表示。即设计会被映射到目标工艺。实现过程中,还必须满足时序、面积和功耗的约束,执行一些局部的优化。
标准单元库
如之前所述,标准单元库对应工艺库,可以包含简单的与门、非门等基本逻辑门单元,也可以包含特殊的宏单元,例如乘法器、特殊的触发器等。
为了更好的映射与优化,每个逻辑单元,应当包含以下信息:
设计约束
设计约束一般包括时序、面积、功耗等方面的约束。三者之间往往存在制约关系。为了优化时序,可能需要增加硬件资源,导致电路面积增大,功耗增加。为了产生规模更小的电路,又必须在电路速度上进行妥协。数字电路设计时往往要综合各种因素进行取舍。
优化的门级表示
工艺映射与优化完成后,最终会生成由目标工艺库所描述的优化后的门级网表。如果该网表满足各种约束要求,则会被制作成最终的版图。否则还需要修改设计约束或优化 RTL 描述,以获得满足约束要求的门级网表结果。这个过程是反复的,直至最终网表满足要求。
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法 实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
我有一个PORO(普通旧Ruby对象)来处理一些业务逻辑。它接收一个ActiveRecord对象并对其进行分类。为了简单起见,以下面为例:classClassificatorSTATES={1=>"Positive",2=>"Neutral",3=>"Negative"}definitializer(item)@item=itemenddefnameSTATES.fetch(state_id)endprivatedefstate_idreturn1if@item.value>0return2if@item.value==0return3if@item.value但是,我还想根据这些st
在以下示例中,我无法理解Ruby运算符的优先级:x=1&&y=2由于&&的优先级高于=,我的理解是类似于+和*运算符:1+2*3+4解析为1+(2*3)+4它应该等于:x=(1&&y)=2但是,所有Ruby源代码(包括内部语法解析器Ripper)都将其解析为x=(1&&(y=2))为什么?编辑[08.01.2016]让我们关注一个子表达式:1&&y=2根据优先规则,我们应该尝试将其解析为:(1&&y)=2这没有意义,因为=需要特定的LHS(变量、常量、[]数组项等)。但是既然(1&&y)是一个正确的表达式,那么解析器应该如何处理呢?我试过咨询Ruby的parse.y,但它太像意大利面条
是否已经实现了ISO8601的所有日期、时间、持续时间和间隔使用情况?ruby标准?我的意思是类似于类的东西,您可以在其中设置和获取详细信息,例如年、月、日、星期几、星期、小时、分钟、is_duration?、has_recurrence?等等也可以设置并导出到字符串? 最佳答案 require'time'time=Time.iso8601Time.now.iso8601#iso8601stringtime.year#=>Yearofthedatetime.month#=>Monthofthedate(1to12)time.day#
我正在尝试将ruby-debug19与Ruby1.9.1p376一起使用,但出现以下错误:test.rb:2:in`require':nosuchfiletoload--ruby-debug19(LoadError)fromtest.rb:2:in`'这是测试.rb:require'rubygems'require'ruby-debug19'这是“gemlist”的输出:***LOCALGEMS***ruby-debug19(0.11.6)(etc.)因此运行“rubytest.rb”会产生上述错误。我做错了吗?我认为这是运行ruby-debug19的正确方法(通过包含gem并
我正在尝试解决来自SevenLanguagesinSevenWeeks的一个简单的Ruby问题Printthecontentsofanarrayofsixteennumbers,fournumbersatatime,usingjusteach这是我想到的,可以用简单的方式完成还是改进它?a=(1..16).to_ai=0j=[]a.eachdo|item|i+=1j可以在一行中使用each_slicea.each_slice(4){|x|px} 最佳答案 Teja,你的解决方案没问题。由于您需要使用每一个,因此算法的复杂性将受限于数
我想做的是处理n个集合,而我在下面提供的代码正好处理4个集合。defshow_combinations@combos=[]['A','noA'].eachdo|a|['B','noB'].eachdo|b|['C','noC'].eachdo|c|['D','noD'].eachdo|d|@combos我如何重构以下代码来处理以下场景:鉴于我有一个大小为y的数组,其中包含大小为n的数组,我想返回所有组合。请务必注意,每个子数组中只能有一个项目出现在结果中。(如“已完成资料”不能同时出现在“未完成资料”的结果中)背景:用户可能有一些任务:例如,“完成配置文件”或“设置电子邮件”或其他任何
我正在使用searchkick库作为产品搜索的elasticsearch客户端。https://github.com/ankane/searchkick可以创建'OR'条件和'AND'条件;AND运算Product.search其中:{price:{lte:200},in_stock:true}或运算Product.search其中:{或:[[{in_stock:true},{backordered:true}]]}但我坚持使用searchkick创建多个“AND”“OR”条件。我需要类似的东西A或B或(C和D)或者我需要这样,A与B与(C或D)请指导我,如何实现这一目标谢谢