第五章综合的约束与优化解析_第1页
第五章综合的约束与优化解析_第2页
第五章综合的约束与优化解析_第3页
第五章综合的约束与优化解析_第4页
第五章综合的约束与优化解析_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章 综合的约束与优化综合的一个很重要的概念就是:单纯的映射是远远不够的,更重要的是设计的整体优 化。一方面设计工程师为综合规定必要的约束,例如对面积、速度、功耗的要求等,从而 使优化有所依据; 另一方面选择合适的综合器是优化程度的决定性因素。 同一个设计使用 不同的综合器所得到的优化结果可以相差35倍。第一节 综合约束5-1-1 概述 综合约束是对可测量的电路特性所定义的设计目标,比如面积、速度和电容等。如果没有这些约束, Design Compiler 工具将不能有效地对你的设计进行最优化。 在对设计进行优化时, Design Compiler 支持两种类型的约束: 设计规则约束( De

2、sign rule constraints ) 最优化约束( Optimization constraints ) 设计规则约束是固有的,在工艺库里定义;这些约束条件是为了保证设计 的功能正确性, 适用于使用工艺库的每一个设计; 可以使这些约束比最优化约束更为严格。最优化约束是外在的, 由设计者自己定义; 最优化约束描述设计指标, 在整个 dc_shell 工作期间应用于当前设计;它们必须接近于现实情况。Design Compiler 试图同时满足设计规则约束和最优化约束,但设计规则约束必须首 先被满足。设计者可以以命令行形式交互式的指定约束或者在一个约束文件里指令约束。图 5.1 显示了主要

3、的设计规则约束和最优化约束,以及如何用dc_shell 界面命令来设置这些约束。182图 5.1 Major Design Compiler Constraints第二节设置设计规则约束这一节将讨论最常用的设计规则约束:?转换时间(Tran sition time)?扇出负载(Fan out load )?电容(Capacitanee )Desig n Compiler给设计对象赋予属性来表示这些设计规则约束。表5.1列出了每个设计规则约束对应的属性名。表5.1设计规则属性Desig n Rule Con stra intAttribute NameTran siti on timemax t

4、ra nsiti onFanout loadmax fa noutCapacita neemax_capacita nee min capacita neeCell degradati oncell degradati onConn eeti on classconn eeti on class设计规则约束是工艺库里指定属性,你也可以明确地、随意地指定这些约束。如果工艺库里定义了这些属性,在进行设计编译和生成约束报告时,Design Compiler 暗中将它们应用于使用那个库的任何设计。你不能移走工艺库里定义的设计规则约束,因为它们是工艺的特定要求,但你可以使它们更为严格来适应你的设计。如果

5、内在的和外在的设计规则约束同时应用于一个设计或一条线,更为严格的值拥有优先权。5-2-1 设置转换时间约束线的转换时间约束是对它的驱动管脚改变逻辑值的时序要求。转换时间是以工艺库数据为基础。对于非线性延迟模型(NLDM ,输出转换时间是输入转换和输出负载的函数。通过对一个单元的每一个输出管脚赋予max_tra nsitio n属性,Design Compiler 和Library Compiler模拟转换时间约束。在最优化过程中,Design Compiler试图使每一条线的转换时间都小于max_transition属性值。命令set_max_transition用来改变工艺库里指定的最大转换

6、时间约束。通过对指定的对象设置max_tra nsitio n属性,这条命令给设计中所有线或与确定端口相连的线设置了最大转换时间。比如,对设计 adder中的所有线设置最大转换时间3.2,输入:dc_shell set_max_tra nsiti on 3.2 fin d(desig n,adder)利用remove_attribute命令来取消 set_max_transition命令,比如,输入:dc_shell remove_attribute fin d(desig n,adder)max_tra nsiti on5-2-2 设置扇出负载约束线的最大扇出负载是指这条线所能驱动的最大数目

7、的负载。通过赋予每一个输入管脚fan out_load 属性和一个单元的每一个输出管脚max_fa nout属性,Desig n Compiler 和 Library Compiler模拟扇出限制。扇出负载值不表示电容;它表示对整个扇出负载的数字上的贡献。强加于一个输入管脚的扇出负载不必是1.0。库的开发者可以指定更高的扇出负载值来模仿内在的单元负载效果。将有那个管脚驱动的所有输入的fanout_load 值相加,Design Compiler计算一个驱动管脚的扇出。为确定这个管脚是否满足最大扇出负载约束,Desig n Compiler 将计算的扇出负载值和管脚的max_fanout值相比较

8、。图5.2显示了一个小电路。其中管脚X驱动两个负载,管脚 A和管脚B。如果管脚 A的fanout_load 值为1.0,管脚B的fanout_load 为2.0,那管脚X的整个扇出负载为 3.0。如果 管脚X有一个大于3.0的最大扇出,比如说 16.0,那管脚X符合扇出约束。在最优化时,Design Compiler 试图满足每一个驱动管脚的扇出负载限制。如果一个 管脚违反了扇出负载限制,Design Compiler会尽力改正这个问题(比如通过改变这个元件的驱动能力)。工艺库可能对整个库指定默认的扇出约束,或对库描述的一个单独的单元里特定的管脚指定扇出约束。为确定你的工艺库是否为扇出计算而模

9、拟,你可以对单元的输入管脚搜索 fano ut_load 属性:dc_shell get_attribute fin d(p in, my_lib/*/*) fanou t_load用set_max_fanout命令对设计或输入管脚设置比工艺库里指定的更为保守的扇出约束(用set_fanout_load命令对输出端口设置预期的扇出负载值)。set_max_fanout命令通过对指定对象设置max_fanout属性对设计中的所有线或指定的输入端口设置最大扇出负载。比如,要对设计adder中的所有线设置 max_fanout为16,输入:dc_shell set_max_fa nout 16 fi

10、n d(desig n, adder)如果你用set_max_fanout 命令和存在库的 max_fanout属性,Design Compiler 会尽力 满足更小的扇出限制。用remove_attribute 命令来取消 set_max_fanout 命令,比如,输入:dc_shell remove_attribute fin d(desig n,adder) max_fa nout5-2-3 设置电容约束转换时间约束并没有提供一个直接的方式来控制线的真实电容。如果你想要直接控制电容,利用set_max_capacitanee命令来设置最大电容约束。这个约束是完全独立的,因此除了转换时间约

11、束外,你还可以使用它。通过给一个单元的输出端口或管脚赋予max_capacita nee 属性,Design Compiler 和Library Compiler模拟电容约束。把线电容和管脚电容相加,Design Compiler 来计算输出线的电容。为确定线是否满足电容约束,Design Compiler 把计算出的电容值与输出管脚的max_capacitanee 值相比较。比如,对设计adder中的所有线设置最大电容为3,输入:dc_shell set_max_capacita nee 3 fin d(desig n, adder)用 remove_attribute 命令来取消 set_

12、max_capacitanee命令,如,输入:dc_shell remove_attribute fin d(desig n,adder)max_capacita nee你也可以用set_min_capacitanee命令对输入端口或管脚设置最小电容。第三节设置最优化约束这一节中将讨论最常用的指定的最优化约束:时序约束(Timing constraints)面积约束( Area constraints)Design Compiler也支持功耗约束。图5.3解释了定义最优化约束的一些常用的命令。set mu area图 5.3 CommandsUsed to Definecwte dock st

13、 clocik latency sat propagated clock set clock uncertaintythe OptimizationCon stra ints for Seque ntialBlocks5-3-1设置时序约束时序约束指定了设计所要求的性能。为设置时序约束,1. 定义时钟。2. 定义与时钟相关的I/O的时序要求。3. 指定组合路径延迟要求。4. 指定时序异常。表5.2列出了设置时序约束的命令。表5.2设置时序约束的命令Comma ndDescripti oncreate clockDefines the period and waveform for the cl

14、ock.set_clock_late ncy set_propagated_clock set clock un certa intyDefines the clock delay.set_ in put_delayDefines the tim ing requireme nts for in put ports relative to the clock period.set_output_delayDefines the tim ingrequireme ntsfor output portsrelative to the clock period.set_max_delayDefine

15、s maximum delay for comb in ati onal paths. (This is a tim ing excepti on comma nd.)set_m in _delayDefines minim umdelay for a comb in ati onal paths. (This is a tim ing excepti on comma nd.)set_false_pathSpecifies false paths.(This is a tim ing excepti on comma nd.)set_multicycle_pathSpecifies mult

16、icycle paths.(This is a tim ing excepti on comma nd.)下面的部分将详细介绍三个步骤。5-3-1-1 定义一个时钟对于一个同步设计,时钟周期是最重要的约束,因为它对设计中所有寄存器到寄存器的路径加以约束。1. 定义时钟的周期和波形利用create_clock 来定义时钟的周期(-period 选项)和波形(-waveform选项)。如 果你没有指定时钟的波形,Design Compiler 使用50%的占空循环。比如,对端口 clk指定25兆赫和50%的占空循环,输入:dc_shell create_clock clk -period 40当你

17、的设计包含多时钟时,密切注意这些时钟共同的基本周期。共同的基本周期是所有时钟周期最小的共同的倍数。比如,如果你有10, 15 , 20的时钟周期,那共同的基本周期就为60。定义你的时钟以使这个共同的基本周期是每一个时钟周期的最小的整数倍数。这个共同的基本周期的要求是定性的,不存在硬性限制。如果这个基本周期大于最小周期的十倍,那结果是要求更长的运行时间和更大的内存。一个极端的情况是如果你有一个寄存器到寄存器的路径,其中一个寄存器的周期为10 ,而另一个寄存器的周期为 10.1 ,那么共同的基本周期就为 1010.0 。通过指定不带小数 点的时钟周期,插入不确定的时钟来调整时钟周期,你可以解决这个

18、问题。dc_shell create_clock -period 10 clk1dc_shell create_clock -period 10 clk2 dc_shell set_clock_uncertainty -setup 0.1 clk2用 report_clock 命令来显示设计中所有时钟资源的信息,用 remove_clock 命令来移走时钟的定义。2. 创建虚拟时钟许多情况下,一个模块里可能不存在系统时钟。你可以用 create_clock-name 来创建 一个虚拟时钟,模拟系统中表现的时钟信号。通过创建一个虚拟时钟,你可以描述模块外 的与时钟相关的延迟。dc_shell c

19、reate_clock -period 30 -waveform 10 25 -name sys_clk3. 指定时钟网络延迟默认情 况下 , Design Compiler 假设时 钟网络没有 延迟 (完 美的时钟)。 用 set_clock_latency 和 set_clock_uncertainty 命令来指定关于时钟网络延迟的时序信息。用 set_propagated_clock命令来指set_clock_latency 命令的 - setup 或20兆赫的时钟,在时钟边缘的每你也可以用这些命令来指定估计的或真实的延迟信息。定通过时钟网络传播的时钟等待,比如:dc_shell set

20、_propagated_clock clk 考虑到由于布局导致的时钟网络的变化,利用-hold 选项增加少许的错误富余。比如,对于先期提到的一边增加 0.2 的富余,输入:dc_shell set_clock_uncertainty -setup 0.2 clk dc_shell set_clock_uncertainty -hold 0.2 clkDesign Compiler使用 report_clock 命令的 -skew 选项来显示时钟网络的时滞信息。 用这些时钟信息来确定一条路径是否满足建立和保持时间。5-3-1-2 指定 I/O 时序要求如果你没有对一个输入端口指定时序要求,Des

21、ign Compiler 假设信号在零时刻到达输入端口。绝大多数情况下,输入信号在交错时间到达。用命令 set_input_delay 定义输 入端口的到达时间。你定义相对于系统时钟和其他输入端口的输入延迟约束。如果你没有对一个输出端口指定时序要求,Design Compiler 不会对任何一个以该输出端口结束的路径加以约束。 用 set_output_delay 命令来定义要求的输出到达时间。 你定 义相对于系统时钟的输出延迟约束。如果一个输入或输出端口有多重的时序要求(因为多重路径) ,用 -add_delay 来指定额外的时序要求。用report_port命令来列出与端口相关的输入或输出

22、的延迟。用removenput_delay命令移走输入延迟约束。用remove_output_delay命令移走输出延迟约束。图5.4显示了延迟和有效的时钟沿之间的关系(如图中的上升沿)。图 5.4 Relationship Between Delay and Active Clock EdgeCLKDATA INDATA.OLTT图中,模块 A有输入DATA_IN和输出DATA_OUT从波形图中可以看到,DATA_IN在时钟上升沿后稳定 20ns ; DATA_OU必须在时钟上升沿前15ns有效。在你用create_clock 命令设置时钟约束后,用 set_i nput_delay和set

23、_output_delay命令来指定这些额外的要求。比如,输入:dc_shell set_i nput_delay 20 -clock CLK DATA_IN dc_shell set_output_delay 15 -clock CLK DATA_OUTF面是一个加以约束的设计模块的实例:图5.5解释了设计模块 my_block的时序要求,10.4 nsmin - min path holdmax = max path * setupF面的命令行是用来定义这些时序要求的。图5.5 my_block 的时序要求create_clock -period 20 -waveform 5 15 clk

24、a create_clock -period 30 -waveform 10 25 clkb set_i nput_delay 10.4 -clock clka in1 set_input_delay 6.4 -clock clkb -add_delay in1 set_output_delay 1.6 -clock clka -min out1 set_output_delay 4.8 -clock clka -max out1 5-3-1-3 指定组合路径延迟要求对于不被时钟周期限制的完全的组合延迟, 命令 set_max_delay 和 set_min_delay 定义 指定路径的最小和

25、最大延迟。在HDL弋码中产生异步逻辑,一种普通的方法就是对锁存器和触发器使用异步置位或 复位。因为复位信号跨越几个模块,在顶层约束这个信号。比如,要对复位信号定义最大 延迟为 5,输入:dc_shell set_max_delay 5 -from RESET对从IN1到OUT的路径指定最小延迟为10,输入:dc_shell set_min_delay 10 -from IN1 -to OUT1用 report_timing_requirements 命令列出对你的设计所要求的最大和最小延迟。5-3-1-4 指定时序异常时序异常是对一个或更多的违反默认的单循环时序关系的路径指定时序关系。利用时序

26、异常来对那些不遵循默认的单循环行为的路径或异步路径加以约束或使其失去作用。指定众多的时序异常会增加编译时间。然而,很多设计需要许多的时序异常。Design Compiler 只承认有正确参考点的时序异常。? 设计中的有效起点是指时序单元的主要的输入端口和时钟管脚。? 有效的结束点是指设计的主要输出端口和时序单元的数据管脚。如果你指定了一个无效的参考点,Design Compiler 不会发出警告信息。你必须用命令 report_timing_requirements 中的 -ignored 选项来查明被 Design Compiler 忽视的时序 异常。你可以利用时序异常命令来指定下列条件:?

27、 错误路径( False paths (set_false_path)? 最小延迟要求( Minimum delay requirements (set_min_delay)? 最大延迟要求( Maximum delay requirements (set_max_delay)? 多循环路径( Multicycle paths (set_multicycle_path)用 report_timing_requirements 命令列出设计中的时序异常。1. 指定错误路径Design Compiler 在时序报告中不报告错误路径,或在时序优化时不照顾它们。用命 令 set_false_path

28、指定错误路径。 用这个命令来忽视那些非关键路径, 它们可能掩盖其他 一些在优化时必须考虑的路径;或者是那些在正常操作中从不会发生。DATA进行读写。比如,图5.6显示了一个寄存器的外形,它从双向总线(图 5.6 Con figurati on Register这个电路有这些时序路径:1. DATA to U1/D2. RD to DATA3. U1/G to CONFIG (with possible time borrowi ng at U1/D)4. U1/G to DATA (with possible time borrowi ng at U1/D)5. U1/G to U1/D (t

29、hrough DATA, with possible time borrowi ng)前面四条路径都是有效的,而第五条是一条功能错误的路径,因为正常的操作不可能要求对寄存器同时进行读和写。在这个设计里,你可以用这个命令来使这条路径失效:dc_shell set_false_path -from U1/G -to U1/D利用reset_path 命令和相同的选项取消set_false_path 命令,输入:dc_shell set_false_path -setup -from IN2 -to FF12/Ddc_shell reset_path -setup -from IN2 -to FF1

30、2/D创建一条错误路径不同于使时序弧失效。使时序弧失效表示一条路径的中断。定义一 个错误路径并不中断路径,它只是阻止在优化时,这条路径被考虑。2. 指定最小和最大延迟要求你 可以用set_min_delay 和set_max_delay 来指定路 径延迟要求,它们远比Design Compiler根据时钟时序得到的保守。利用reset_path 命令取消set_min_delay 和 set_max_delay 命令。(1) 寄存器到寄存器的路径Design Compiler 利用下列方程式得到寄存器到寄存器路径的最小和最大路径延迟的 约束:min_delay = (T capture - T

31、 launch ) + holdmax_delay = (T capture - T launch ) - setup你可以利用set_min_delay 和set_max_delay 命令而不考虑得到的路径延迟(T capture-T launch )。比如,假设你有一条路径,时间20时从一个寄存器开始,在时间35到达一个寄存器,此时是时钟的下一个有效沿:dc_shell create_clock -period 40 waveform 0 20 clk1 dc_shell create_clock -period 40 -waveform 15 35 clk2Design Compiler

32、 自动地得到一个最大路径延迟约束:(35 20)(终点库的寄存器的建立时间) 。指定一个最大路径延迟为10,输入:dc_shell set_max_delay 10 -from reg1 -to reg2Design Compiler以 10(终点库的寄存器的建立时间)来计算最大路径延迟约束,没有考虑最初得到的最大路径延迟约束。( 2)寄存器到端口的路径Design Compiler 利用下列方程式得到寄存器到端口路径的最小和最大路径延迟的约 束: min_delay = period - output_delay max_delay = period - output_delay如果你用se

33、t_min_delay 或set_max_delay命令,这些命令中定义的值将代替约束计算中的周期值。比如,假设你有一个时间时钟周期为20的设计,输出OUTPORTA输出延迟为5:dc_shell create_clock -period 20 CLKdc_shell set_output_delay 5 -clock CLK OUTPORTADesign Compiler 自动地得到最大路径延迟约束15(20 5)。指定你想要的最大路径延迟 10,输入:dc_shell set_max_delay 10 -to OUTPORTADesign Compiler 计算最大路径延迟为5(105),

34、没有考虑原先得到的最大路径延迟约束。( 3)异步路径你也可以用 set_max_delay 和 set_min_delay 命令来约束穿越不同频率域的异步路径。 比如:dc_shellset_max_delay 17.1 -from find(clock, clk1) -to find(clock, clk2) dc_shell set_max_delay 23.5 -from find(clock, clk2) -to find(clock, clk3) dc_shell set_max_delay 31.6 -from find(clock, clk3) -to find(clock, c

35、lk1) ( 4)设置多循环路径当有疑问的路径长于单个循环或数据并没有如期的在单个循环内,多循环路径条件是适当的。用 set_multicycle_path 命令来指定 Design Compiler 使用的时钟循环的数目,来 决定在特殊的终点什么时候需要数据。你可以为建立和保持检测指定循环乘法器。如果你没有为命令set_multicycle_path指定 -setup 或 -hold 选项, Design Compiler 只将乘数值应用于建立检查。默认情况下,在数据从起点开始,到终点下一个时钟的活跃沿检查建立(默认乘数为1)。在数据建立后数据保持一个时钟循环,但在建立时的那个沿检测(默认乘

36、数为0)。图5.7显示了建立和保持时间之间的时序关系。I-FVCLKAI-F2.CLKH图5.7建立和保持时间时序路径从时钟管脚FF1 ( CLKA的上升沿)开始,结束于数据管脚FF2。假设触发器是正沿触发的,数据的建立从时间0开始,然后20时间单位后在FF2的CLKB勺下一个有效沿检测数据;数据的保持从一个时钟(CLKA)循环开始(20单位),在检测建立的相同沿时检测(20单位)。set_multicycle_path 命令的-setup选项在默认沿的前或后移走用于建立检测的沿。如图5.7所示的例子,?零的建立乘数意味着 Design Compiler 利用零时刻的沿检测 ? 2的建立乘数意

37、味着 Design Compiler 利用40时刻的沿检测set_multicycle_path命令的hold选项在默认沿的前后开始数据的保持,但DesignCompiler仍然在检测建立的沿检测数据的保持。如图5.7所示(默认的建立乘数),? 1的保持乘数意味着数据从CLKA (时间40)开始保持到 CLKB(时间20)检测? 1的保持乘数意味着数据从CLKA (时间0)开始保持到 CLKB (时间20)检测用带有相同选项的reset_path 命令来取消set_multicycle_path 命令。(5)采用多重的时序异常命令一个特殊的时序异常命令用于一个单独的时序路径,而一个一般的时序异

38、常命令用于更多的时序路径。如果你对更多的实例执行给定的时序异常命令,那么更多的特殊命令将覆盖更多的一般的命令。下列规则定义了给定时序异常命令的优先顺序:?当你定义从一个管脚到另一个管脚的时序异常时,享有最高优先权? 一个使用-from选项的命令比一个使用-to选项的命令享有更高的优先权?对于时序异常命令中的时钟,如果同时指定了-from和-to选项,它们将覆盖只指定了-from或-to选项的共有同样路径的命令这个列表详细列出了由这些优先权规则定义的优先顺序:1. comma nd -from pin -to pin2. comma nd -from clock -to pin3. comma

39、nd -from pin -to clock4. command -from pin5. command -to pin6. command -from clock -to clock7. command -from clock8. command -to clock比如,在下列命令序列中,从A到B的路径被看作是两循环路径,因为特殊命令覆盖了一般命令:dc_shell set_multicycle_path 2 -from A -to B dc_shell set_multicycle_path 3 -from A 下列规则总结了时序异常命令的相互作用:一般的 set_false_path 覆

40、盖特殊的 set_multicycle_path 命令一般的 set_max_delay 覆盖特殊的 set_multicycle_path 命令特殊的 set_false_path 覆盖特殊的 set_max_delay 或 set_min_delay命令特殊的 set_max_delay 命令覆盖特殊的 set_multicycle_path 命令5-3-2设置面积约束命令 set_max_area 通过对当前设计设置一个 max_area 属性,为当前设计指定最大面 积。用工艺库里面积的单位来指定这个面积。比如,想要设置最大面积为100,输入:dc_shell set_max_area

41、100设计面积由每一个元件和线的面积组成。在Design Compiler 计算设计面积时将忽视下列元件:? 未知元件? 未知面积的元件? 独立于工艺的普通元件 单元(元件)的面积是与工艺相关的; Design Compiler 从工艺库里获取信息。 当你同时定义时序和面积约束, Design Compiler 将首先去满足时序约束。当你定义 面积约束时,使用 -ignore_tns 选项将面积约束的优先权提到全部的消极的延迟之前: dc_shell set_max_area -ignore_tns 100 J 为最优化得到最小的面积,需要忽略时序,移走所有的约束,只留下最大面积约束。用命令

42、remove_constraint 来移走你设计的约束。但要当心这个命令将移走你设计中的所 有最优化约束。第四节 设计优化最优化是 Design Compiler 综合步骤,根据设计的功能、速度和面积要求,将设计映 射到指定目标库中单元的最佳组合。 这一节中将讨论影响最优化结果的众多因素中的常见 的几个因素。5-4-1 理解最优化流程Design Compiler 执行三个级别的最优化:? 结构最优化( Architectural optimization)? 逻辑级最优化( Logic-level optimization)? 门级最优化( Gate-level optimization )

43、5-4-1-1 结构最优化对hdL描述进行结构最优化,它包含这样的高层综合任务,如:? 子表达式共享? 资源共享? 选择设计工具实现? 算子重排序? 确定数据流的算术表达式 (DC Ultra only)除了设计工具实现外,这些高层综合任务只在一个未映射的设计的最优化时才发生, 设计工具实现可以在门级映射后重现。高层综合任务以你的约束和HDL编码风格为基础。在高层最优化后,电路的功能由一个一般的、与工艺无关的网表来描述。5-4-1-2 逻辑级最优化对GTEC网表进行逻辑级最优化,它由下列两个过程组成:结构化( Structuring )这个过程是对设计增加中间变量和逻辑结构,导致设计面积简化。

44、结构化 是基于约束的,最好应用于非关键时序路径。在结构化过程中, Design Compiler 搜索能够成为因素的子功能,并且根据这个因素 的大小和在设计中出现的次数来评估因素。默认情况下,Design Compiler 构造设计的结构。用命令 set_structure 和变量 compile_new_boolean_structure 来控制设计的结构化。 命 令 set_structure 和 它 的 选 项 设 置 下 列 的 属 性 : structure,structure_boolean,和structure_timing 。展开化( Flattening ) 这个过程试图把组

45、合逻辑路径转换为两级的乘积和表达式。展开化与约束 无关。因为它产生只有两级的组合逻辑,因此对速度的最优化有用。在展开化过程中, Design Compiler 移走设计中所有的中间变量和与之有关联的逻辑结构。然而,因为需要 大量的CPU寸间和增加面积,展开化并不总是实用的。默认情况下,Design Compiler并不进行展开化。 用命令 set_flatten 来控制设计的展开化。 用命令 set_flatten 和它的选项设 置下列属性: flatten 、 flatten_effort 、 flatten_minimize 、 flatten_phase 。展开化 并不瓦解设计的层次,在

46、 Design Compiler 中,用 ungroup 命令来移走设计的层次。结构化和展开化属性使得细微调谐的最优化技术应用于设计层次中的每一个设计。表5.3列出了这些属性的默认值。表5.3结构化和展开化属性属性默认设置structuretruestructure_boolea nfalsestructure timi ngtrueflatte nfalse用命令report_compile_options显示当前设计的这些属性。5-4-1-3门级最优化门级最优化是对由逻辑综合产生的一般的网表工作来产生特殊工艺的网表。它包含下列步骤:映射(Mapping)这个步骤是利用目标工艺库里的门(组合

47、的和时序的)来产生设计的门级实现,试图满足时序和面积要求。你可以利用不同的compile命令选项来控制DesignCompiler利用的映射算法。延迟最优化(Delay Optimizatio n )这个过程试图修理由映射过程引进的延迟错误。延迟最优化不去弥补设计规则错误或去满足面积约束。设计规则弥补(Design Rule Fix ing)这个过程通过插入缓冲或调整单元的大小试图弥补设计规则错误。Desig nCompiler试图弥补这些错误而不影响时序和面积的结果,但如果有必要,它会干扰最优化约束。面积最优化(Area Optimizati on)在完成映射、延迟最优化和设计规则弥补之后,

48、这个过程试图满足面积约束。然而,为满足面积约束,不允许引进设计规则或延迟约束错误。你可通过set_cost_priority命令来改变约束的优先权。在运行 compile命令时指定-n o_design_rule选项使设计规则弥补失效。然而,如果你用这个选项,综合过的设计可能会违反设计规则。5-4-2 选择和使用编译策略你可以选用不同的策略来编译你的层次设计。基本的策略是:?自顶向下编译(Top-down compile ):顶层设计和所有的子设计一起编译?从上到下编译(Bottom-up compile):单独编译单一的子设计,从层次的底层,按层次的级别进行,直到编译顶层设计?混合编译(Mi

49、xed compile ):无论自顶向下还是从下到上,只要是最合适的,就应用于单一的子设计在下面的内容中,将以图 策略:5.8所示的简单设计为例来示范自顶向下和从下到上的编译TOPU2图 5.8 Design to Illustrate Compile Strategies表5.4中列出了设计的顶层或全局的规范,适用于TOP和它所有的子设计。表 5.4 Desig n Specificati ons for Desig n TOPSpecification typeValueOperati ng con diti onWCCOMWire load model20x20Clock freque

50、ncy40 MHzIn put delay time3 nsOutput delay time2 nsIn put drive stre ngthdrive of (IV)Output load1.5 pf下面是设计TOP勺约束文件:set_operati ng_con ditio ns WCCOM set_wire_load_model20x20 ”create_clock -period 25 clk set_i nput_delay 3 -clock clk all_ in puts()-fi nd(port, clk) set_output_delay 2 -clock clk all

51、_outputs() set_load 1.5 all_outputs() set_drivi ng_cell -cell IV all_ in puts() set_drive 0 clk5-4-2-1 自顶向下编译自顶向下编译策略有如下优点:?提供了一种按钮式的方法?自动的照顾内部模块的从属性对于超过100K门的设计,自顶向下的编译策略要求更多的内存并可能导致更长的运行 时间。实现一个自顶向下的编译,执行下列步骤:读入整个设计 分解任何一个设计基准的多重实例 将属性和约束应用于顶层编译设计下面是对设计TOR进行自顶向下编译的脚本。这个脚本包括确定每一个步骤的注释。/* read in th

52、e entire design */read -f verilog E.v read -f verilog D.v read -f verilog C.v read -f verilog B.v read -f verilog A.v read -f verilog TOP.v current_design TOP link/* resolve multiple references */uniquify/* apply constraints and attributes */ include defaults.con/* compile the design */compile5-4-2-

53、2 从下到上编译从下到上编译策略有如下优点:? 利用 divide-and-conquer 方法编译大的设计? 比自顶向下编译,内存的要求更小? 允许时间预算? 重复直到接口稳定? 人为的修改控制 从下到上编译策略单独地编译子设计,然后在顶层设计中合并。应用顶层约束,检测 设计是否有错误。即使有可能没有错误展现,这也是靠不住的,因为子设计之间设置的接 口通常在开始不是那么准确。为改进内在模块约束的准确性,你读入顶层设计和所有的子设计,然后对子设计的单一的单元实例应用 characterize 命令。在编译过的子设计提供的更多的接近现实的信息的 基础上, characterize 捕获每一个单元

54、实例的环境和时序信息, 然后用新值替代现存的属 性和约束。采用改进过的约束,重新编译子设计,并再次检测顶层设计。你应该了解改进过的结 果,但你可能要几次反复整个过程来移走所有重要的错误。从下到上编译策略要求下列步骤:1. 发展一个默认的约束文件和一个子设计明确的约束文件。 默认的约束文件包括全局的约 束,诸如时钟信息、驱动和负载预计。子设计明确的约束文件则反映了分配给子模块的时 序预算。2. 独立地编译子设计3. 读入顶层设计和已经编译过的但不在内存中的子设计4. 设置顶层设计为当前设计,链接设计,应用顶层约束 如果设计满足约束,结束;否则,继续下列步骤。5. 对最差情况的单元实例应用 cha

55、racterize 命令6. 用 write_script来保存单元的特性信息当你重新编译子设计时,应用该脚本来重新产生新的属性值。7. 用 remove_design -all来移走内存中的所有设计8. 读入先前特性化过的单元的RTL级设计重新编译RTL设计,而不是单元映射后的设计,可能导致更好的优化结果。9. 设置特性化的单元的子设计为当前设计,利用保存的特性数据的脚本重新编译。10. 读入所有其他编译过的子设计11. 链接当前设计12. 选择其他子设计,重复步骤3到步骤 9,直到你利用它们真实的情况来重新编译过所有的子设计在应用从下到上的编译策略时,注意下列情况:命令read_file可

56、以更为快捷地读入.db格式。如果在首次读入RTL级代码后,你不愿意修改它,保存这个未映射的设计为一个.db 文件。在你重新读入这个设计时将节省不少时间。compile 命令影响当前设计的所有子设计。如果你只想优化当前设计,你可以在你的数据库中移走或不包括它的子设计,或者对子设计设置dont_touch 属性。下面是对设计TOP执行从下到上的编译的脚本文件:all_blocks = E,D,C,B,A/* compile each subblock independently */foreach (block, all_blocks) /* read in block */block_source = block + .vread_f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论