逻辑综合 概述 综合是将RTL源代码转换成门级网表的过程。 电路的逻辑综合一般由三个步骤组成,即 综合=转化+逻辑优化+映射(见下页图) (Synthesis=Translation+Logic Optimization+Mapping) 在综合过程中,优化进程尝试完成库单元的组合,使组合成的电路能最好地 满足设计的功能、时序和面积的要求 综合是约束驱动(constraint driven)的,给定的约束是综合的目标。约束 一般是在对整个系统进行时序分析得到的,综合工具会对电路进行优化以满 足约束的要求。 综合以时序路径为基础进行优化。 常用的综合工具有Synopsys公司的Design Compiler 和Candance公司的 Enconter RTL Compiler 2 3 综合过程中时序与面积的关系 从下图中可以看出面积与延迟的折衷关系,综合工具以约束为指导,在满足时 序的情况下获得最小面积。如果不施加约束,综合工具会产生非优化的网表, 而这是不能满足要求的网表。所以约束对于综合来说是必不可少的。 4 综合的基本流程 1.准备RTL代码:RTL代码经过前端仿真后才能用于综合。 2.定义库:设定好所需要用到的综合库等多种库。 3.读入设计:综合工具读入RTL代码并进行分析。 4.定义设计环境:设定设计的工作环境、端口的驱动和负载,线负载模型等 。 5.设置设计约束:这是综合的一个极其重要的环节,设定好正确的约束才能 得到正确的综合结果。约束要适当,不能过紧或过松。主要是定义时钟和I/O 的约束。 6.设置综合策略:有top-down和bottom-up两种策略,各有所长,对于不同的 设计要具体分析。 7.优化设计:综合工具可以根据约束对电路进行优化,也可以人为地加入命 令,改变优化方法。 8.分析和解决设计的问题:在设计综合(compile)后,根据报告来分析设计 中出现的问题,进而修订所出现的问题。 9.保存设计数据:综合完成后,保存各种数据,以供后续的布局布线使用( 5 Basic Flow Set design constraints Develop HDL files Select compile strategy Specify libraries Read design Optimize the design Define design environment Analyze and resolve design problem 6 Save the design database Design Compiler简介 Design Compiler有两种界面供用户使用,一种是命令界面,一种是图形界面 。在UNIX命令行下分别执行以下命令可以分别进入上述两种界面: unix% dc_shell-t (命令界面) unix% design_vision (图形界面) Design Compiler支持TCL(Tool Command Language)语言,它是公开的业界 标准界面语言。DC-Tcl在TCL的基础上扩展丰富了TCL,使用户可以更加灵活 方便地运用TCL命令来对电路进行分析和优化。 DC中包含了多种工具,如DFT Compiler,Power Compiler,HDL Compiler, Library Compiler等,使得DC具有强大的功能,成为业界最流行的综合工具 。 7 目标库和初始环境的设置 DC启动时会先启动.synopsys_dc.setup文件,它里面设定了综合所需要的工 艺库的信息以及一些对于工具的设定命令。 在综合之前,要设定好所需要的库,如综合库、I/O单元库,IP核等。 半导体厂商提供与DC兼容的工艺库-综合库,它包含许多信息,如单元的功 能、面积、时间、功耗、测试等,线负载模型,工作条件和设计规则约束等 。在0.18um的工艺下,可采用非线性延迟模型(NLDM)来计算单元的延迟。 单元的延迟与输入的逻辑转换时间和输出负载有关。根据每个单元的输入逻 辑转换时间和输出负载,在工艺库提供的查找表(Look-Up Table)中查出单 元的延迟。 8 .synopsys_dc.setup文件 .synopsys_dc.setup文件主要包括各种库的设定,变量的设定等。下面具体 介绍各种库的意义及如何设定。(实例) 目标库(target_library): 是DC在做编译(compile)的时候来构成电路图的,将电路映射到具体的单元 上。例如 set target_library my_tech.db 链接库(link_library): 是将设计连接到对应的库上,一般包含目标库、宏单元、IP核等。例如: set link_library “* my_tech.db”。其中“*”指明当链接设计时,DC先 搜寻内存中已有的库,然后再搜寻变量link_library中制定的其它库。 符号库(symbol_library): 定义了单元显示的图形库,当用design_vision来查看图形的时候使用。 综合库(synthetic_library): 是由Synopsys公司提供的DesignWare库,包含了许多IP核及运算单元,用于 实现verilog描述的运算符,为电路的优化起着重要的作用。 搜寻路径(search_path): 指定各种库的路径,可以将所用的库的路径放入search_path中,在设定 target_library和link_library时就不必加上库的绝对路径,DC会自动在 search_path中寻找所用到的库的路径从而读入该库。 9 变量的设定:设置的变量在DC启动时读入,便于综合的处理,同时有些DC的 变量必须在设置文件中输入。如可以设定命令的简写,保存多少条命令等: alias cud current_design alias rpt report_timing history keep 300 10 综合脚本实例(.synopsys_dc.setup) 11 系统层次的划分与基本概念 在DC中,每个设计由6个设计物体组成,它们分别是design,cell,port, pin,net和clock。其中clock是特别的端口,它存在DC内存中,是用户自己 定义的物体。如下图所示: 12 当前设计为TOP。Port和Pin是与当前设计有关的一对概念,如果当前设计改 变,相应的port和pin也会不同 13 设计读入 读入设计有多种方法,DC支持读入Verilog,VHDL,可以是RTL级代码,也 可以是门级网表,也可是ddc格式的文件。综合前的设计不需用RTL格式(虽 然也有其它格式)输入到DC中。 可以用以下命令读入设计: 1.analyze和elaborate命令:这是两个不同的命令,它使得设计人员可以在 建立设计通用逻辑之前先对设计进行语法错误和RTL转换分析。 2.read_file命令:如: read_file –format verilog sd_clk.v 3.read_verilog或read_vhdl命令,这些是从read_file中分离出来的命令, 如: read_verilog sd_clk.v 读入代码后用命令current_design和link将读入的设计和综合库连接起来。 14 电路的设计目标与约束 RTL模块综合的流程如下图所示。电路的约束分为设计环境和设计约束,DC 以约束为目标进行电路优化。 15 设计环境 通过环境约束的设计,将设计所处的真实环境因素包含进去,使得设计可以 正常工作在真实环境下。环境约束如下图所示: 16 set_operating_conditions描述了设计的工艺、电压及温度条件。 Synopsys库包含这些条件的描述,通常为WORST,TYPICAL,BEST情况 。工作条件的名称可库的名称是相关的,如SMIC 0.18um工艺提供slow.db ,typical.db,fast.db三种工艺库,它们的工作条件分别是slow(WORST), typical(TYPICAL)和fast(BEST)。WORST情况通常用于综合阶段,而 BEST情况通常用于修正保持时间违规。有时可能同时用WORST和BEST情 况同时优化设计,这时使用命令: set_operating_conditions -max slow -max_library slow \ -min fast -min_library fast 可以用set_min_library指定best和worst两种库,在设计中所用到的库都可 以指定。如: # 为综合用的sram库指定最佳情况可最坏情况 set_min_library sram_slow.db 17 –min_vision sram_fast.db set_wire_load_model命令为DC提供估计的线负载信息,反过来DC使用线 载信息把连线延迟建模为负载的函数,Synopsys工艺库里提供了多种线载模 型,每个模型代表一个特定大小的模块。设计人员需要准确地选择线载模型 。设置线载模型命令如下: set_wire_load_model –name smic18_wl10 –library slow set_wire_load_mode定义了三种同建模线负载模型相关的模式,分别是top ,segmented和enclosed,如下图所示: 18 1.top模式定义层次中所有连线将继承和顶层模型同样的线载模型。如上图中 ,所有的连线都继承顶层的线载模型50x50。 2.segmented模式用于跨越层次边界的连线。如上图中,子模块A和子模块B 中的连线继承各自的线载模型,而A与B之间的连线继承模块MID的线载模型 。 3.enclosed模式指定所有的连线(属于子模块的)将继承完全包含该子模块 的模块线载模型。如上图中,整条连线处于模块MID的完全包围中,所以采 用40x40线载模型。其命令如下 set_wire_load_mode enclosed set_driving_cell和set_drive用于设置模块输入端口的驱动能力。set_drive 命令用于指定输入端口的驱动强度,它主要用于模块或芯片端口外驱动电阻 。set_driving_cell用于对输入端口的驱动电阻进行建模,这一命令将驱动单 元的名称作为其参数并将驱动单元的所有设计规则约束应用于模块的输入端 口。 set_driving_cell –lib_cell and2a0 [get_ports IN1] \ –library slow 19 set_drive 10 [get_ports Data_in_0] set_load将工艺库中定义的单位(通常为pf)上的容性负载设置到设计的指 定连线或端口,设置输出端口的负载。 set_load 5 [get_ports OUT1] set_load [load_of my_lib/and2a0/A] [get_ports OUT1] 20 设计约束 设计约束描述了设计目标,包括时序和面积等。DC会依据约束来优化电路。 因为不实际的规范会导致面积增大、功耗增加和/或时序恶化,所以设计人员 必须根据情况指定实际的约束,约束设计的基本命令如下图所示。 21 时钟 单周期同步设计的时序要求 DC默认的时序电路是单周期的,如下图所示。假设FF3的建立时间为Tsetup, 保持时间为Thold,触发器FF2的时钟端到Q端的延迟为Tclk-q, 对于setup来说:clock period >Tclk-q + Tx-max + Tsetup 对于hold来说: Thold < Tclk-q + Tx-min 22 定义时钟 create_colck –period 10 [get_port clk] 对于时钟(除了虚拟时钟)的定义来说,时钟周期和时钟源(port或pin)是 必不可少的,还可以定义时钟的占空比,时钟名等。定义虚拟时钟时,不必 定义时钟源。 设定时钟的uncertainty、latency和transition,其中uncertainty是用来模拟 时钟的skew和jetter,latency设定时钟的延迟,transition设定时钟的转换 时间。通过这些设定让时钟更加接近实际情况,更有利于综合的准确性,但 过分约束会使得综合起来比较困难。 由于时钟一般是高扇出(high fanout)的,DC不会对高扇出的连线做设计 规则(DRC)的检查和优化。DC默认的时钟网络是理想的。在综合时不对时 钟的高扇出做处理,而是留在后续的布局布线中做时钟树综合(CTS)。 23 source latency是指实际的时钟源到时钟定义点的传播延迟,而network latency是指设计内部从时钟定义点到触发器时钟端的延迟。如下图所示,设 置如下: create_clock –period 10 [get_ports CLK] #设置source latency 为3ns set_clock_latency –source 3 [get_clocks CLK] #设置network latency 为1ns set_clock_latency 1 [get_clocks CLK] 24 set_clock_uncertainty命令让用户定义时钟扭斜信息。基本上此命令用于给 时钟的建立时间和保持时间增加一定的余量。由时钟的抖动(jitter)可扭斜 (skew)组成,如下图: set_clock_uncertainty 0.6 [get_clocks CLK] set_clock_transition命令让用户定义时钟的转换时间。如下图 set_clock_transition 0.45 [get_clocks CLK] 25 除了create_clock命令,还有create_generated_clock命令用来创建产生的 时钟,如时钟经过分频后的时钟,在创建生成时钟时,要指定源时钟的名字 和端口,分频数(倍频数),生成时钟的端口。 create_generated_clock –source clk2x –divied_by2 \ [get_pins clk] 有时需要创建虚拟时钟(virtual clock)用来说明相对于时钟的I/O端口的 延迟,虚拟时钟在设计里并不驱动触发任何寄存器。 #建立虚拟时钟,周期为10ns,命名为vclk,不需要定义时钟源 create_clock –period 10 –name vclk 通常给时钟加上dont_touch的约束,使得DC在综合的时候不会给时钟网络加 入BUFFER以满足skew的要求,时钟网络通常留在布局布线阶段进行时钟树综 合(CTS)。 set_dont_touch_network [get_clocks clk] 26 I/O的约束 set_input_delay指定相对于时钟的信号输入的到达时间。它用在输入端口, 指定在时钟沿后数据稳定所需的时间。如下图所示,设置的输入延迟的值为 Tclk-q + TM。 27 例:根据外部逻辑的延迟设定输入延迟 #创建时钟 create_clock –period 20 –name Clk [get_ports Clk] #将时钟设置为dont_touch_network set_dont_touch_network [get_clocks Clk] #设置输入延迟 ,外部逻辑延迟最大值为7.4,加入-max选项 #用于setup分析(setup分析采用最慢的路径延迟) set_input_delay 7.4 –max –clock Clk [get_ports A] 28 set_output_delay命令用于在输出端口定义在时钟边沿来到之前数据有效所 需时间。如下图所示,设置输出时间的值为TT + Tsetup 29 例:设置输出延迟 #创建时钟 create_clock –period 20 –name Clock [get_ports Clock] #将时钟设置为dont_touch_network set_dont_touch_network [get_clocks Clock] #设置输入延迟 ,外部逻辑setup要求为7.0,即为setup分析设 #定输出延迟 set_output_delay 7.0 –max –clock Clock [get_ports B] 30 DRC约束 DRC即Design Rule Constraints,一般由半导体厂商提供,在使用工艺库中 的逻辑单元时对其连接所强加的限制,主要有:max_capacitance, max_transition,max_fanout #为当前设计设定最大电容值为0.5pf set_max_capacitance 0.5 [current_design] #为当前设计设定最大转换时间为2.0ns,在整个设计上施加最 #大转换时间延迟可以帮助防止在上连线上出现长的转换时间, #也可以约束单元的输出端的转换时间以减少其功耗 set_max_transition 2.0 [current_design] #在当前设计的所有单元的输出引脚上设置max_fanout set_max_fanout 10 [current_design] 在DC优化时,DRC约束具有最高的优先级,DC会先让电路满足DRC,然后 才是时序约束。 31 面积约束 我们用set_max_area来设定面积约束。例如 set_max_area 1000 set_max_area 0 面积的单位由工艺库定义,可以是: 1. 2输入与非门 2. 晶体管数目 3. 平方微米 设定了面积约束,DC会尽量优化到所设定的面积;当没有设定面积约束时, DC会做最小限度的面积优化;若设定为0,则DC会对面积做优化直到再继续 优化也没有大的效果,这样可以使得面积优化最小,但运行时间较长。 可用命令report_area报告面积。 32 时序例外 时序例外有以下几种: 1.False paths。用set_false_path来设定路径使得DC不对其进行时序分析 ,移除该路径上的时序约束。通常异步电路的时钟之间、逻辑上不存在的 路径等上设定为falst path 2.Minimum and maximum path delay value。我们使用命令 set_max_delay和set_min_delay来覆盖默认的用于setup和hold约束的 最大/最小延迟。 3.Multicycle paths。由于DC默认的是单周期,有时某些路径可能需要多个 周期的时间才能到达,如在两个寄存器之间进行乘法操作可能需要多个周 期才能完成,这时用命令set_muticycle_path来设定多周期路径,以满 足时序要求。同时要注意setup check和hold check的设定。 33 综合策略的选择 综合的策略有两种:自顶向下和自底向上。 1.自顶向下(top-down):在top-down的综合方案中,顶层模块和它的所有 子模块放在一起优化,所有的限制条件和电路工作环境一般也都是针对顶层 模块设置的,因此,这种综合方案能够自动将模块之间的连接和依赖关系考 虑到综合中去,从而优化综合结果。但是,这种方法对于一个规模比较大的 电路显然不适合,因为在综合的过程中,所有的模块必须同时存在于存储区 中,而且运行时间也会比较长。 2.自底向上(bottom-up):即分而治之的解决方法。从最底层模块开始综 合优化,必须对所有底层子模块施加限制条件并且需要单独优化,这个过程 一直延续到顶层模块。其中每一个子模块综合完成之后,直接将该模块集成 到它的上一级中和上一级的其他模块一起优化,而且一般使用 set_dont_touch命令让DC不再改变该子模块的结构。使用这种方法进行优化 的优点是当工作站的处理能力不足时,可以分别进行子模块的优化,而不需 要将所有的模块都放到存储区中,这种做法的缺点是只能在子模块内部进行 优化,无法考虑到模块周围的环境而将子模块和其他的模块一起优化。 34 设计优化 采用命令compile或compile_ultra来启动DC综合和优化的进程。DC提供许 多选项来设定进行何种综合。 compile_ultra命令具有强大的功能,使用该命令可以得到更好的延迟质量, 特别适用于高性能的算术电路优化。该命令包含了以时间为中心的优化算法 。compile_ultra命令主要的开关选项有: -scan #做可测性设计编辑,加入扫描链 -no_autoungroup #关掉自动取消划分特性 -no_boundary_oprimization #不作边界优化 -area_high_effort_script #面积优化 -timing_high_effort_script #时序优化 35 电路的优化分为三个阶段:结构级的优化,逻辑级优化和门级优化,如下图 所示。 36 1.结构级的优化,包括: 1.1设计结构的选择:在DesignWare中选择最合适的结构或算法实现电路的 功能。 1.2数据通路的优化:选择CSA等算法优化数据通路的设计 1.3共用子表达式:例如下面两个等式: SUM1 <= A+B+C; Temp <= A+B; SUM2 <= A+B+D; SUM1 <= Temp + C; SUM3 <= A+B+E; SUM2 <= Temp + D ; SUM3 <= Temp + E; 这种方法可以把比较器的数目减少,共享共同的子表达式。 37 1.4资源共享。如右图所示,如果没有资源 共享,DC将综合出两个加法器和一个多路 器,采用资源共享后,仅综合出一个加法 器和两个多路器,这样即节省了面积又提高 了时序。 38 1.5重新排序运算符号:由于VHDL/HDL编译器从座到右解析表达式,括号的 优先级更高,可以通过改变表达式的次序或用括号强制电路用不同的拓扑结 构。如下面的表达式: Z = A + B + C + D;则初始的排序为: 加上括号改变运算次序从而改变电路结构: Z = ( (B + C) + D ) + A; 39 2.逻辑级优化。做完结构的优化后,电路的功能以GETCH的器件来表示。在 逻辑级优化的过程中,可以作结构(structuring)优化和展平(flattening) 优化。 2.1.结构优化:用共用子表达式来减少逻辑,这种方式既可用作速度优化又可 用作面积优化,结构优化是DC默认的优化策略。结构优化在作逻辑优化时, 在电路中加入中间变量和逻辑结构。 2.2.展平优化:把组合逻辑路径减少为两级,变为乘积之和的电路,即先与后 或的电路。如下图所示: 40 3.门级优化:门级优化时,DC开始映射,完成实现门级电路。映射的优化过 程包括四个阶段:延迟优化,设计规则修整,以时序为代价的设计规则修整, 面积优化。 41 静态时序分析 在进行综合时,DC用内建的静态时序分析工具Design Time来估计路径的延 迟以指导优化的决定。综合时,可用Design Time来产生时间的报告。 静态时序分析(Static Timing Analysis),简称STA,可以不进行动态仿真 就决定电路是否满足时序要求。静态时序分析包括三个主要的步骤: 1.把设计分解成时间路径的集合 2.计算每一条路径的延迟 3.所有路径延迟都要检查(与时间的约束做比较),看它们是否满足时间的 要求 DC以下面的方法把设计分解成时序路径的集合。每条路径有一个起点( startpoint)和终点(endpoint)。 起点定义为:输入端口、触发器或寄存器的时钟引脚,如下图的A, FF1/CLK,FF2/CLK 终点定义为:输出端口、时序器件除时钟引脚外的所有输入引脚,如下图的Z ,FF1/D,FF2/D 为了便于时序分析,时序路径被分组。路径按照它们终点的时钟进行分组, 如果终点没有被时钟控制,则这些路径归于默认(default)的路径组。 42 每一条时序路径从起点开始,经过一些组合逻辑,到终点结束。如下图,时序 路径大致可分为以下四种: 1.从输入端口开始,到时序器件的数据输入端口结束,即input-to-reg,如 Path1。 2.从时序器件的时钟端口开始,到时序器件的数据输入端口结束,即reg-to-reg, 如Path2。 3.从时序器件的时钟端口开始,到输出结束,即reg-to-output,如Path3。 4.从输入开始,到输出结束,即input-to-output,如Path4 1 2 3 4 43 路径的延迟。在计算路径的延迟时,DC把每一条路径分成时间弧(timing arc),如下图所示。 时间弧描述单元和/或连线的时序特性。 单元的时间弧由工艺库定义,包括单元的延迟和时序检查(如寄存器的 setup/hold检查等)。连线的时间弧由网表定义。 单元延迟通常用非线性模型(NLDM)计算,连线延迟用先负载模型计算( 版图前)。 路径的延迟与起点的边沿有关,即单元的时间弧是边沿敏感的。 44 单元延迟(cell delay):工艺库中提供2维的NLDM的查找表来计算单元的延 迟。输出负载(output load)和输入转换时间(input transition )决定了单 元延迟和输出转换时间(output transition),如下图所示: 45 连线延迟(wire delay): 通过连线上的RC参数计算连线延迟,WLM决定线上的R和C。 互连延迟的计算从驱动引脚的状态转换到接收单元输入引脚状态转换。 RC寄生参数的分布由operating_condition中的Tree-type决定,有以下三种: 46 建立时间和保持时间检查 47 时序报告和时序问题的诊断 DC中,常用report_timing命令来报告设计的时序是否满足目标,执行 report_timing命令时,DC做4个步骤: 1.把设计分解成单独的时间组; 2.每条路径计算两条延迟,一次起点为上升沿,一次起点为下降沿; 3.在每个路径组里找出关键路径(critical path),即延迟最大的路径; 4.显示每个时间组的时间报告。 report_timing命令的默认行为是报告每个时序路径理的关键路径。可以设置 各种选项以查看不同的类型时序或不同路径的时序。具体用法可在dc_shell 使用man命令来查看report_timing命令的详细介绍。 48 数据的保存 在DC综合完成后,要保存好相应的数据,输出相应的网表,SDC(standard design constraints)文件,供给后续的布局布线工具使用,也可以供给PT读 入,检查时序是否满足。综合结果要经过PT分析满足时序要求,经过验证工 具(如Formaility)的验证满足后才能提供给布局布线工具使用。 还可以保存ddc格式的文件,以便DC下次启动的时候读入,ddc文件保存了上 次DC运行的各种数据。具体的命令有: write –f verilog –hierarchy –output my_design.v write –f ddc –hierarchy –output my_design.ddc write_sdc my_design.sdc 49 RTL综合流程 50 可测性设计 随着电路设计的规模越来越大,工艺尺寸越来越小,集成度越来越高,测试 的成本也越来越高。为了降低测试的成本和难度,提高芯片质量和成品率, 需要在为芯片进行可测性设计(Design For Testability),简称DFT。 可测性设计包含了很丰富的内容,它包含了DFT电路的设计和测试向量的生成 (ATPG)。 目前常用的DFT技术有:扫描链插入、存储器BIST插入、逻辑BIST插入和边界 扫描插入。其中扫描链插入是最常用的DFT技术。Synopsys的DFT Compiler就 是包含在DC内的用于可测性设计的工具。具有强大的功能,如:为逻辑模块 进行“扫描就绪(scan-ready)”的编辑、检查已综合电路是否满足扫描规 则、用top-down或 bottom-up方法插入扫描链、对扫描模块预览测试覆盖率 等。 51 低功耗设计与分析 随着技术的发展,集成度的提高,芯片内部的单元数越来越多,功耗也越来 越大,同时基于低功耗低成本、方便携带以及可靠性好等方面,低功耗设计 变得越来越重要,在大型的设计中是必不可少的。 进行低功耗设计时需要三方面的内容: 1.功耗模型:功耗管理的基本结构、IC设计中所用工艺库的功耗模型 2.功耗分析:分析设计中每个单元的功耗、分析所有级设计(RTL代码、门级 网表和版图设计)的功耗 3.功耗优化:在所有级的设计都能降低功耗、采用多种降低功耗的方法:门控 时钟电路、操作数分离、门级电路的功耗优化、多供电电压、多阈值电压、 门控功耗等 52 静态时序分析工具PrimeTime 常用的静态时序分析工具是Prime Time,它是Synopsys公司的签收级( sign-off)工具,具有强大的时序分析功能。 PT启动时,导入.synopsys_pt.setup的启动文件,该文件主要定义了搜寻路 径(search_path)和链接库(link_library)。 PT只可以读入门级网表,而不能读入RTL级的代码。 PT内含了Prime Power(功耗分析工具) 、Prime Time SI(信号完整性分 析工具)。 PT和DC的命令基本相同,它们生成类似的报告,并支持共同的文件格式。 PT也能生成DC用于综合和优化时序的断言。 53 小芯片综合实验 1.熟悉设计,获得设计目标和要求,如芯片的时钟频率,外部接口的时序要求等 。 2.设置.synopsys_dc.setup文件 3.启动DC,读入RTL代码,并写出RTL级代码的ddc文件。 unix%dc_shell dc_shell> source –echo –verbose read_file.tcl 4.设置约束。 dc_shell> source –echo –verbose constraints.tcl 5.综合,优化 dc_shell> compile_ultra -no_autogroup 6.查看报告 dc_shell> report_constraint -all_violarors 7.保存文件 dc_shell> write –format ddc –hierarchy –output Recordchiptop.ddc 54 1.熟悉设计,获得设计目的和要求。 输入信号:在小芯片中,输入时钟clk_128,时钟频率为128KHz。 Read_ADPCM为输入控制信号,采样速率为8K,类似于一个频率为8K的时钟 ,且占空比为50%。另外就是8位的数据输入信号,reset信号。在这里还 有inout信号CMD,DATA0,但不用作输入,只用作输出。 输出信号:输出SD卡输入时钟信号CLK,这里输出的CLK配置成clk_128 的两分频,即64K,和输出数据DATA0信号,输出CMD信号。 RESET READ_ADPCM 128KHz CLK DATA0-7 32bit 移位寄存器 Clk CLK pwrite psel penable Out_read_en Data_out Clk paddr CMD pwdata SDIO_CO NTROLL ER prdata SDIO DAT0 Sd_clk_enable Cmd_end Data_fifo_ready Cmd_end_response 32*256 FIFO Data_fifo_write 55 Fifo_read_en Fifo_data_req Data_trans_complete CLK 2.设置.synopsys_dc.setup文件 选择要使用的工艺文件,这里采用SMIC的0.18um工艺,SMIC提供了slow.db, fast.db和typical.db三种标准单元的综合库,我们选用slow和fast两种库, 其中slow用于最坏情况分析,fast用于最佳情况分析。 芯片中的sram是IP核,提供了包含时序信息的综合库用于逻辑综合,它也有最 坏情况和最佳情况之分,另外用到的综合库还有标准的IO单元的综合库。 具体设置可参见示例文件。 3.启动DC,读入RTL代码,并写出RTL级代码的ddc文件。 在unix的终端中键入dc_shell,即可启动DC,这时读入代码文件,可以一个一 个的读入,也可以写成TCL语言的文本,用source命令在dc_shell中读入。使用 命令analyze和elaborate来读入设计。读入设计后用check_design命令来检查 设计存在的问题,是否是可综合的。具体命令可见脚本文件。 4.设置约束。这是一个及其重要的环节。要在熟悉设计的前提下才能设置好正确 的约束,约束的设置要参考与芯片输入输出有关的芯片的输出/输入信号时序, 还要了解0.18工艺下如何选择线负载模型,如何设置DRC规则等。 可以先设置工作条件,最坏情况采用slow,最佳情况采用fast,并对应相应的 库,选择wire_load_model,要根据设计的大小来选择合适的线负载模型。 56 设置DRC规则,通常DRC约束由工艺厂商设定,我们可以选择加紧约束以使得 综合出来的结果更加满足各种约束条件。不同工艺下的DRC约束是不同的,可以 根据经验对设计加紧约束,但约束不可过紧,这样会延长综合的时间,甚至导致 综合出的结果不可用。 定义时钟。定义两个输入时钟和一个输出时钟。并设置时钟的延迟,转换时间 和不确定时间,使得时钟和真实的情况更加接近。综合时通常对时钟加紧约束, 如加上10%的余量,这样综合出的结果更加可信。 I/O端口的设置。I/O约束的设置通常要参考各种手册,与芯片相连的外围芯片 的输入输出端口的时序要求,驱动负载要求,然后参考设置本芯片的I/O约束。 如果没有用户手册,可根据经验加以约束,在综合之后查看报告,再进行适当的 修改,然后再进行综合。综合是个不断修改不断完善的过程。I/O约束要全面。 时序例外的设置,如多周期,false_path等,这些要通过和前端人员进行交流 获得。 面积及功耗约束。面积和功耗约束要考虑芯片的要求,要求低功耗则在前端设 计时进行相应的设计。如果对时序要求不高可以对面积加紧约束,但一切都要保 证时序的正确性。 57 5.综合,优化 当约束完成后,用check_timing来检查约束的正确性,还可以通过报告来检查 ,如report_clock命令可以报告设置的时钟,报告时钟的名字,周期,波形,在 何处创建等。如果一切检查通过,这是可以对设计进行综合。 综合的策略有多种,选择不同的策略得到的结果也不一样,由于本设计较小, 可采用top-down的策略,这样得到的综合效果会更好。 DC的综合命令有compile和compile_ultra,其中compile_ulrta的优化力度更 大,优化手段更多。在DC中键入compile_ultra和相应的开关选项后,DC就对设 计进行优化,这时电路映射到相应的单元,在约束驱动的情况下同时对时序进行 优化,这时可以查看log文件,观察设计在综合时出现的问题。 6.查看报告 综合完成后,通过各种报告查看综合结果。常用的有report_constraint和 report_timing,通过report_constraint命令报告综合过程中的各种违规情况 , 在通过report_timing查看相应的时序路径的报告,灵活运用命令来获取报告, 查看综合结果是否满足要求,如果不满足,再采用各种综合手段或进行相应的修 58 改来改善综合结果,或向前端人员询问一下与设计有关的违规。 7.保存文件。 经过反复的综合后,设计已达到要求,这时需要输出相应的文件,如门级网 表,sdc文件等,通过DC输出这些文件,以便后续的时序分析和验证。 8.后续处理 综合完成后要验证综合的正确与否,可以通过静态时序分析和形式验证,其中 静态时序分析可以更加准确地分析时序,从而检查综合的时序是否正确;而形式 验证则用数学的方法验证综合出的电路与原电路的功能是否一致。在验证通过后 才可以进行下一步的布局布线,否则还要重新综合。 注:综合的脚本已经提供,各条命令的设定都有相应的注释便于理解,可以按照 main_flow.tcl的流程进行综合。 59