前面介绍了STA部分,综合库的内容结束了基础部分,接下来是DC的使用篇。该部分首先会介绍DC的流程,然后对时序部分进行介绍,接下来是环境属性与较为复杂的时序约束的介绍。期间会有与之对应的dc_labs来帮助进行理解。dc_labs将会同步更新在对应的专栏下。需要结合起来进行学习!
本文将会首先回顾DC在IC flow中的位置与作用,然后介绍相关DC的理论,最后是实践部分,该实践部分使用的是lab 1中的内容。

DC Synthesis 综述部分

DC Synthesis是IC设计前端与后端的分界线,或者说是桥梁,将RTL代码转化为门级网表的形式。需要使用SDC约束来体现PAP。更具体的可以参见博主的另一篇博文:数字IC设计流程总结

DC综合的三个阶段

综合示意图1

综合示意图2

综合是使用软件的方法来设计硬件, 然后将门级电路实现与优化的工作留给综合工具的一种设计方法。 它是根据一个系统逻辑功能与性能的要求, 在一个包含众多结构、 功能、 性能均已知的逻辑元件的单元库的支持下, 寻找出一个逻辑网络结构的最佳实现方案。 即实现在满足设计电路的功能、 速度及面积等限制条件下, 将行为级描述转化为指定的技术库中单元电路的连接。 如图所示,一般综合分为三个阶段,转换,映射与优化。
先通过将RTL代码转化为通用的布尔(Boolean)等式,即GTECH(Generic Technology)格式;然后执行compile命令,该命令按照设计的约束对电路进行逻辑综合和优化,使电路能满足设计的目标或约束,并且使用目标工艺库中的逻辑单元映射成门级网表。

DC的启动方式

对于 2000.11 版的 Design Compiler, 用户可以通过四种方式启动 Design Compiler,他们是——dc_shell 命令行方式、 dc_shell -t 命令行方式、 design_analyzer 图形方式和design_vision图形方式。 其中后面两种图形方式是分别建立在前面两种命令行方式的基础上的。

DC的四种启动方式

dc_shell 命令行方式

该方式以文本界面运行 Design Compiler。在 shell 提示符下直接输入”dc_shell”就可以进入这种方式。 也可以在启动 dc_shell 的时候直接调用 dcsh 的脚本来执行(dc_shell –f script)。目前这种方式用的已经不是很普遍。

dc_shell-t 命令行方式

该方式是以 TCL(Tool Command Language 相关专栏已经进行总结) 为基础的,在该脚本语言上扩展了实现 Design Compiler 的命令。用户可以在 shell 提示符下输入”dc_shell-t”来运行该方式。 该方式的运行环境也是文本界面。 也可以在启动 dc_shell -t 的时候直接调用 tcl 的脚本来执行(dc_shell-t – f script)。 TCL 命令行方式是现在推荐使用的命令行方式, 相对 shell 方式功能更强大, 并且在 Synopsys 的其他工具中也得到普遍使用。 注意这里shell与-t之间没有空格。

design_analyzer 图形界面方式

Design Analyzer 使用图形界面, 如菜单、 对话框等来实现 Design Compiler 的功能,并提供图形方式的显示电路。 用户可以在 shell 提示符下打“design_analyzer” 来运行该方式。 Design_analyzer 图形方式是今后要经常用到的图形界面方式。 由于它所对应的是dc_shell 的命令行方式, 所以我们不能在 design_analyzer 里运行 tcl 命令。 另外需要注意的是: Design analyzer 的工作模式不是用于编辑电路图的, 它只能用于显示 HDL 语言描述电路的电路图。

design_vision 图形界面方式

Design_vision 是与 tcl 对应的图形方式, 用户可以在 shell 提示符下打”design_vision”来运行该方式。由于它是在 Windows NT 下开发的,在工作站环境下不太普及。

启动文件

Synopsys产品很类似,他们都有启动文件.synopsys_dc.setup。其中PT需要单独的启动文件 .synopsys_pt.setup。在后面ICC的学习中,我们也会看到启动文件。这是一个隐藏文件,需要使用ls -a来查看。
.synopsys_pt.setup

启动文件顾名思义, 就是 DC 在启动的时候首先读入的文件, DC 在启动的时候, 会自动在三个目录下搜索该文件(如上图所示),对 DC 的工作环境进行初始化:
1,$SYNOPSYS/admin/setup 目录下, DC 安装的标准初始化文件
2,当前用户的$HOME 目录下, 一般用于设置一些用户本人使用的变量以及一些个性化设置。
3,DC 启动所在的目录下,一般用于与所在设计相关的设置。
其中后面的 setup 文件可以覆盖前面文件中的设置。 该文件主要包括库的设置、 工作路径的设置以及一些常用命令别名的设置等等。
由于 dcshell 的启动脚本和 tcl 的脚本语法不一致, 所以如果只有一种方式的启动脚本,那么运行另一种方式的时候会报错。 因此, DC 的启动脚本有一种兼容两种方式的格式。 下面是这种脚本的举例 。

举例

它区别与其他启动脚本的特征是第一行有一个”#”, 说明它是 dc_shell 的一个子集, 同时兼容两种方式。 文件的第一段设置工艺库和链接库, 第二段设置符号库和搜索路径, 第三段设置 DC 命令的别名, 这一点与 Shell 相似。

这里不是很理解,大致就是加了#以后,就是可以运行两种模式的脚本了。这里一般保持启动方式与你的脚本语法一致就可以了,一般使用tcl形式启动dc,就是dc_shell-t,语法也是tcl,同我们后面学习的保持一致就可以了。
要把DCSH脚本my_script.scr转化为DC-Tcl脚本my_script.tcl,可执行如下命令:

unix% dc-transcript my_scripts.scr my_script.tcl

系统变量

有了启动文件,我们需要在启动文件中定义一些变量。对应DC最少的信息为search_path、target_library、和link_library,下面对一般常用的系统变量进一步的解释。

search_path 搜索路径

顾名思义就是用来查找相关需要使用的工艺库呀,设计文件,脚本呀等

例如:

set search_path "./source/rtl ./scripts ./unmapped"

target_library 目标库/工艺库

指定工艺库的名称,是综合后电路网表要最终映射到的库, 读入的 HDL 代码首先由 synopsys 自带的 GTECH 库转换成 Design Compiler 内部交换的格式, 然后经过映射到工艺库和优化生成门级网表。 工艺库他是由 Foundary 提供的,一般是.db 的格式。 这种格式是 DC 认识的一种内部文件格式, 不能由文本方式打开。 .db 格式可以由文本格式的.lib 转化过来,他们包含的信息是一致的。 在基础篇中已经进行过介绍,这里不多赘述。命令示例如下:

set target_library my_tech.db

link_library 设置模块或者单元电路的引用,对于所有 DC 可能用到的库,我们都需要在link_library 中指定, 其中也包括要用到的 IP。
值得注意的一点是: 在 link_library 的设置中必须包含’’, 表示 DC 在引用实例化模块或者单元电路时首先搜索已经调进 DC memory 的模块和单元电路, 如果在 link library中不包含’’,DC 就不会使用 DC memory 中已有的模块, 因此,会出现无法匹配的模块或单元电路的警告信息(unresolved design reference)。
图中设置了 link_library, 但是 DC 在 link 的时候却报错, 找不到 TOP 中引用的 DECODE
模块, 这说明 link_library 默认是在运行 DC 的目录下寻找相关引用。要使上例的 DECODE
能被找到, 需要设置 search_path。

link_library的使用

举例:

set link_library " * my_tech.db"

synthetic_library 综合库

在初始化 DC 的时候,不需要设置标准的 DesignWare 库 standard.sldb 用于实现Verilog 描述的运算符,对于扩展的 DesignWare,需要在 synthetic_library 中设置,同时需要在 link_library中设置相应的库以使得在链接的时候 DC 可以搜索到相应运算符的实现。

symbol_library 符号库

symbol_library 是定义了单元电路显示的 Schematic 的库。用户如果想启动design_analyzer 或 design_vision 来查看、 分析电路时需要设置 symbol_library。 符号库的后缀是.sdb,加入没有设置,DC会用默认的符号库取代。

设计对象

设计对象代码示意图

设计对象电路示意图

设计(Design) :一种能完成一定逻辑功能的电路,可以是独立的,也可以是层次化的设计。(当前设计)
单元(Cell):设计中包含的子设计的实例,也称为instance。
参考(Reference) :所指向的设计原型,即单元是参考的实例。
端口(Port):设计的基本输入、输出和双向的输入输出。
引脚(Pin):单元的输入输出和双向的输入输出。
线网(Net):端口和引脚间及引脚和引脚间的连线。
时钟(Clock):作为时钟信号源的引脚或端口。
库(Library):直接与工艺相关的一组单元的集合,是生成门级网表的基本单元或设计中被实例化的单元。

可以使用相关命令来搜索对象,后续我们将学习对对象进行约束,从而建立时序模型用来做时序仿真。

get_cells \*U*     get_nets *    get_ports CLK     
get_clocks CLK all_inputs all_outputs

基本流程概述

该部分分为理论与实践部分,理论部分根据DC User Guide 的The Synthesis Flow部分进行总结,会有一些自己的理解,实践部分根据dc_labs的lab1内容总结完成。这边介绍的会比较简单,因为是概述性的,有一个大体的印象,后续使用的时候会进一步说明。

理论部分

图中列出了流程各步骤常用的基本 DC Expert 和 DC Ultra 命令。图中显示的所有命令都可以接受选项。但图中没有显示任何选项。

Synthesis Flow

DC的输入输出

以下步骤概述了综合流程:

1,准备HDL文件

Design Compiler 的输入设计文件使用诸如 Verilog 或 VHDL 之类的硬件描述语言 (HDL) 编写。

2,指定库

指定链接、目标、符号、合成和物理库。可以在启动文件中指定。相关的作用在前文中已有介绍。

3,读入设计

Design Compiler 可以读取 RTL 设计和门级网表。Design Compiler 使用 HDL Compiler 读取 Verilog 和 VHDL RTL 设计以及 Verilog 和 VHDL 门级网表。您还可以读取 .ddc 格式的门级网表。这里读入的方式一般有read或者是analyze&elaborate

read命令

read命令可以一步完成analyze&elaborate的工作,并且read命令还可以用来读取db、EDIF等格式的设计(analyze+elaborate仅能用于VHDL和verilog)。但是,read命令无法支持参数传递以及VHDL中的构造体选择等功能。语法格式为:

read_file [-format format_name] file_list

•-format:指定设计读入的格式,可以ddc、db、verilog、vhdl、sverilog、edif、equation、pla、st等,对应不同格式命令可以替换为read_db、read_edif、read_verilog、read_vhdl、read_sverilog等。
•file_list:源代码文件名列表,文件名的指定可以通过TCL的链表命令{}、“”、[list file_name]等三种方法之一完成。

analyze&elaborate命令

analyze

analyze命令用以分析HDL代码,在为设计建立通用库上的逻辑结构前检查设计的错误,并将中间结果存入指定的库中。语法格式为:

analyze [-library library_name] [-format verilog | vhdl | sverilog] file_list 

•-library:指定中间结果存放的库,即Linux系统下的一个目录,默认为当前目录,也可以用define_design_lib命令指定。
•-format:HDL源文件的类型,即verilog或vhdl或sverilog。
•file_list:源代码文件名列表,文件名的指定可以通过TCL的链表命令{}、“”、[list file_name]等三种方法之一完成。
举例:

dc_shell-t>analyze -f verilog [list ctrl_0723.v、datapath_0723.v、ram16s.v、ram16x1s.v、regfile.v、xram16.v、xr16.v、memctrl.v、vga.v、xsoc.v]
elaborate

elaborate命令用于建立设计的与工艺无关、即GTECH库上的结构级描述,为后续的优化和映射做好准备,支持参数传递;对设计进行描述,需要对各个设计单独进行。语法格式为:

elaborate design_name [-library library_name] [-parameters param_list]

•deisgn_name:指需要进行描述的设计。
•-library:用于保存设计的结构级描述。
•-parameters:指定给设计传递的参数,若省略则参数使用缺省值;参数用“”括起来。

4,定义设计环境

Design Compiler 要求您对要综合的设计环境进行建模。该模型包括外部操作条件(制造过程、温度和电压)。负载、驱动器、扇出等。它直接影响设计综合和优化结果。如果您不使用地形模式,则需要指定电线负载模型来估计电线长度对设计性能的影响。
设计环境

5,设置设计约束

注意:设计约束设置受您选择的编译策略的影响。流程步骤 5 和 6 是相互依赖的。编译策略在步骤 6 中讨论。
设计约束描述了设计目标,它们可包括时序或面积约束。依据设计是如何约束的,DC试图满足目标集。因为不实际的规范会导致面积增大、功耗增加和/或时序恶化,所以设计人员必须指定实际的约束。约束设计的基本命令如图所示。
综合的设计约束

6,选择编译策略

您可以使用自上而下或自下而上的策略。这两种策略都有优点和缺点,具体取决于您的特定设计和设计目标。

7,编译

用 Compile 命令执行综合与优化过程,还可以利用一些选项指导编译和优化过程。compile_ultra or compile

8,分析报告

报告可以帮助我们进行迭代,分析,后续关于报告的使用也会跟进一步的介绍。

9,写入相关文件,保存设计

使用 write_file 命令保存综合设计。 Design Compiler 在退出前不会自动保存设计。您可以用 .ddc、Milkyway 或 Verilog 格式写出设计。

实践部分

该部分参见dc_labs的lab1

补充部分

该部分介绍了一些不需要知道但是不会特别影响你做综合的一些点,作为补充知识,进一步帮助理解。

什么是SDC

术语“Synopsys公司设计约束”(又名SDC,Synopsys Design Constraints)用于描述对时序、功率和面积的设计要求,是EDA工具中用于综合、静态时序分析和布局布线最常用的格式。
DC命令基于Tcl语言。“工具命令语言”(又称Tcl,Tool Command Language)是一种非常流行的脚本语言,是常用于开发用户接口和嵌入式系统平台的应用程序。通过使SDC扩展到Tcl,特定于工具的命令可以与原生的Tcl结构,如变量、表达式、语句和子程序相混合,使其成为实现工具非常强大的语言。

DC的拓扑模式与普通模式的区别

高级芯片综合流程

真正的综合现在一般都是使用的是Ultra来进行的,一般是先使用compile来预编译,然后使用design_vision -topo模式来进行Compile_ultra的。这里我们可以看到哈,其加入了真正的RC,线延时等等一些真实的内容。所以可以简单的理解,一般我们实验或是学习,普通的dc_shell-t的compile,更高级,或是说更接近实际情况的其实是拓扑模式下的Compile_ultra。

Optimization是在做什么

参考DC_SG_11,点击这里 FLAG!!会单独开一篇

为什么做设计需要会STA&DC综合

我们知道,你做设计最好是需要理解DC,STA的,一个设计的水平就取决于你对STA的理解。不可否认,功能是首先应该去考虑的问题,随着工具的逐渐强大,越来越多的设计问题可以通过工具来进行避免,但是这依旧不是一个设计人员不应该不懂得STA的理由。如下图所示

DC student guide 4-3

你需要给你的DC一个好的起点,记得看过一句话,大义是说,好的代码综合出来是好的电路,垃圾代码综合处理是垃圾电路!!我们需要注意下面的几点

  • 功能相同但编码不同的代码将给出不同的综合结果
  • 不能仅依靠 Design Compiler 来“修复”编码不佳的设计!
  • 尝试了解您所描述的“硬件”,为 DC 提供最佳起点

该部分后续可能会开一个类似的系列!!留下一个坑:Verilog编码的艺术~ FLAG!!!!