原文链接:IC_learner - 博客园 ,作者:IC_learner
1 逻辑综合的概述
1.1 概述
综合是前端模块设计中的重要步骤之一,综合的过程是将行为描述的电路、RTL级的电路转换到门级的过程。
Design Compiler(Synopsys)工具可以将HDL语言描述的硬件电路转换到基于工艺库的门级网表。
Synthesis = Translation + Optimization +Mapping
DC的工作流程主要分为这三步:
Translation :翻译,主要把描述RTL级的HDL语言,在约束下转换成DC内部的统一用门级描述的电路(Generic Boolean Gates)(DC自己的库表现),以GTECH或者没有映射的ddc形式展现。
Logic optimization :逻辑优化, 就是把统一用门级描述的电路进行优化,就是把路径调整一下,门给改一下等等。
Gate mapping : 门级映射,把优化了的统一门级描述,DC用别的厂商的工艺库把电路给映射出来,得到一个.ddc文件。这个.ddc文件可以包含许多丰富的信息,比如映射的门电路信息与网表、.v格式的网表、延时信息(sdf)、工作约束(sdc)等信息。(.ddc不能用文本编辑器打开)。.ddc这个包含的网表文件是实际意义的网表文件,而.v这个形式的网表文件是用来做后仿真的文件。
延时信息的得出:线负载模型、拓扑结构模型(现在)。
1.2 DC的启动方式
启动DC的方式有三种:
GUI :DC的图形化界面格式。用图形化界面跑一下DC。(大规模设计不可能用这种方式)。
启动方式是:$design_vision
我们可以通过 man design_vision或者design_vision -help来查看DC的启动选项。
例如,可以使用$ design_vision -topographical_mode启动design compiler,意思是:
-topographical是启动DC的拓扑模式,-topo是简写。关于什么是拓扑模式,为什么要启动拓扑模式,后面会有相关的叙述。
dc_shell : DC以命令行的格式启动:$dc_shell
我们可以通过 man dc_shell或者dc_shell -help来查看DC的启动选项,不过我们可以发现,这些选项是一致的,是告诉我们如何启动DC,启动DC的时候可以加载哪些选项。
Batch mode : 批处理模式,也就是,前面那两种方式只是把DC启动起来,还没有真正地工作(即编译工程),前面两个方式需要通过source命令把脚本写进去以后,DC读取才真正工作。而这种批处理模式是,在启动的同时,告诉DC执行哪些脚本,例如:
$dc_shell -topo -f run.tcl | tee -i run.log
意思是:使用拓扑模式启动DC,启动的同时执行run.tcl脚本文件,并且把启动过程中显示在终端的信息记录到run.log中。| tee -i就是写进信息的管道命令,讲dc_shell -topo -f run.tcl 执行后显示的信息(输出结果),流入到run.log文件中。这样子是为了在DC启动失败的时候,通过查看启动信息,进而排除错误。
本教程这三种方式在后面都有流程介绍,本教程以命令行和批处理为主,其中dc_shell主要用来介绍DC的相关命令,此外命令行和批处理模式是现在设计的主要操作方式。
2 DC综合流程
2.1 基本流程概述
图1:高层次设计流程图:
![](https://i-blog.csdnimg.cn/blog_migrate/5cfddbfe238d2845df09ab100c6f7c1f.png)
对这张图的理解:
-
设计之前,准备好库、HDL代码的思想、约束生成;然后根据设计思想用 RTL 源码详细地、完整地为设计建立模型、定义设计中寄存器结构和数目、定义设计中的组合电路功能、定义设计中寄存器时钟等等的设计规格和实现。
-
完成 RTL 源码设计之后,应让设计开发与功能仿真并行进行:
-
在设计开发阶段,我们使用 DC 来实现特定的设计目标(设计规则和优化约束),以及执行默认选项的初步综合。
-
如果设计开发结果未能在 10%的偏差范围内满足时序目标,则需要修正 HDL 代码,然后重复设计开发和功能验证的过程。
-
在功能仿真中,通过特定的工具来确定设计是否能按如所需的功能工作。
-
如果设计未能满足功能要求, 我们必须修改设计代码以及重复设计开发和功能仿真,继续设计开发和功能仿真直至设计功能正确及满足小于 10%偏差的时序目标。
-
使用 DC 完成设计的综合并满足设计目标。这个过程包括三个步骤,即,
综合=转化+逻辑优化+映射
首先将 RTL 源代码转化为通用的布尔等式,然后设计的约束对电路进行逻辑综合和优化,使电路能满足设计的目标或者约束,最后使用目标工艺库的逻辑单元映射成门级网表,在将设计综合成门级网表之后,要验证此时的设计是否满足设计目标。如果不能满足设计目标,此时需要产生及分析报告确定问题及解决问题。
-
当设计满足功能、时序以及其他的设计目标的时候,需要执行物理层设计最后分析物理层设计的性能,也就是使用DC的拓扑模式,加入floorplan的物理信息后进行综合分析设计的性能。如果结果未能满足设计目标,应返回第三步;如果满足设计目标,则本部分设计周期完成。
图2:DC在设计流程中的位置
![](https://i-blog.csdnimg.cn/blog_migrate/d9b3fc3966e4329c772f4cb3ec173812.png)
这个图将上面的流程图细化,着重与DC的部分,描述了使用DC进行逻辑综合时要做的事,同时,也是对前面的流程图解说的图形概述。在综合的时候,首先DC的HDL compiler把HDL代码转化成DC自带的GTECH格式,然后DC的library compiler 根据标准设计约束(SDC)文件、IP-DW库、工艺库、图形库、(使用拓扑模式时,还要加入ICC生成的DEF模式,加载物理布局信息)进行时序优化、数据通路优化、功耗优化(DC的power compiler进行)、测试的综合优化(DC的DFT compiler),最后得到优化后的网表。
图3 :使用DC进行基本的逻辑综合的流程图与相应的命令
![](https://i-blog.csdnimg.cn/blog_migrate/478b6a7e7b6eb3c85f38601d08897040.png)
第一步: 准备设计文件,DC的设计输入文件一般为HDL文件。
第二步 : 指定库文件,需要指定的库文件包括:链接库(link library)、目标库(target library)、符号库(symbol library)、综合库(synthetic )。
link library和target library:统称为technology library(即工艺库,习惯称之为综合库),technology library 由半导体制造商提供,包含相关cell的信息及设计约束标准,其中:
target library:在门级优化及映射的时候提供生成网表的cell,即DC用于创建实际电路的库。
link library:提供设计网表中的 cell,可以跟target_library使用同一个库,但是 DC 不用 link library中的 cell 来综合设计。
当 DC 读入设计时,它自动读入由 link library 变量指定的库。当连接设计时,DC 先搜寻其内存中已经有的库,然后在搜寻由 link library 指定的库。
注:当读入的文件是门级网表时,需要把 link library 指向生成该门级网表的库文件,否则 DC 因不知道网表中门单元电路的功能而报错。 关于工艺库里面的具体内容,后面会专门进行说明。
Symbol library :提供 Design Vision GUI 中设计实现的图形符号,如果你使用脚本模式而不使用 GUI,此库可不指定 Symbol library。
Synthetic library :即为 Designware library,名字上翻译是综合库,但却常称之为IP库,而不是直译。特殊的 Designware library 是需要授权的(比如使用多级流水线的乘法器),默认的标准 Designware 由 DC 软件商提供,无需指定。
Create_mw_lib : 主要使用DC的物理综合的时候,需要生成物理库。
第三步 : 读入设计 :设计的读入过程是将设计文件载入内存,并将其转换为 DC 的中间格式,即GTECH 格式,GTECH 格式由“soft macros” 如 adders,comparators 等组成,这些组件来自 synopsys 的 synthetic lib,每种组件具有多种结构。
读入设计有两种实现方法实现方法:read 和 analyze & elaborate(实际上read 是 analyze 与 elaborate 的打包操作 ),下面介绍二者在使用中的区别:
类别 | analyze&elaborate | read |
格式 | verilog或VHDL | verilog、VHDL、EDIF、db等所有格式 |
用途 | 综合verilog或VHDL的RTL设计 | 读网表、设计预编译 |
设计库 | 用-library选项定义设计库名,存储“.syn”文件 | 用缺省的设置,不能存储中间结果 |
Generics(vhdl) | 可用 | 不可用 |
Architecture(vhdl) | 可用 | 不可用 |
从表格中可以看到,analyze & elaborate 可以自由指定设计库,并生成 GTECH中间文件前生成.syn 文件并存储于 work 目录下,便于下次 elaborate 节省时间,我们一般选择 analyze & elaborate 的方法读入设计。
第四步 :定义设计环境:定义对象包括工艺参数(温度、电压等),I/O 端口属性(负载、驱动、扇出),统计 wire-load 模型,设计环境将影响设计综合及优化结果。
第五步 :设置设计约束:设计约束包括设计规则约束和优化约束,设计规则约束(design rule constraint)由工艺库决定,在设计编译过程中必须满足,用于使电路能按功能要求正常工作。设计优化约束定义了 DC 要达到的时序和面积优化目标,该约束由用户指定,DC 在不违反设计规则约束的前提下,遵循此约束综合设计。
第六步 :选择编译策略:对于层次化设计,DC中有两种编译策略提供选择,分别为top-down和bottom-up。在top-down策略中,顶层设计和子设计在一起编译,所有的环境和约束设置针对顶层设计,虽然此种策略自动考虑到相关的内部设计,但是此种策略不适合于大型设计,因为top-down编译策略种,所有设计必须同时驻入内存,硬件资源耗费大。在bottom-up策略中,子设计单独约束,当子设计成功编译后,被设置为dont_touch属性,防止在之后的编译过程中被修改,所有同层子设计编译完成后,再编译之上的父设计,直至顶层设计编译完成。bottom-up策略允许大规模设计,因为该策略不需要所有设计同时驻入内存。
第七步:编译:用complie命令执行综合和优化过程,还可以利用一些选项指导编译和优化过程。
第八步:分析及解决设计中存在的问题:DC可以产生一些报告以及设计的综合和优化结果。如:时序、面积、约束、功耗等报告,这些报告有助于分析和解决设计中存在的问题以改善综合结果,我们还可以利用check_design命令检验综合的设计的一致性。
第九步:存储设计数据:DC不会自动存储综合后的设计结果,因而需要离开DC时手动存储设计数据。比如存储网表、延时信息等数据文件。