第五章 综合的约束与优化

上传人:二*** 文档编号:147563674 上传时间:2022-09-02 格式:DOC 页数:31 大小:280KB
收藏 版权申诉 举报 下载
第五章 综合的约束与优化_第1页
第1页 / 共31页
第五章 综合的约束与优化_第2页
第2页 / 共31页
第五章 综合的约束与优化_第3页
第3页 / 共31页
资源描述:

《第五章 综合的约束与优化》由会员分享,可在线阅读,更多相关《第五章 综合的约束与优化(31页珍藏版)》请在装配图网上搜索。

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

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

3、l界面命令来设置这些约束。图5.1 Major Design Compiler Constraints第二节 设置设计规则约束这一节将讨论最常用的设计规则约束: 转换时间(Transition time) 扇出负载(Fanout load) 电容(Capacitance)Design Compiler给设计对象赋予属性来表示这些设计规则约束。表5.1列出了每一个设计规则约束对应的属性名。表5.1 设计规则属性Design Rule ConstraintAttribute NameTransition timemax_transitionFanout loadmax_fanoutCapacita

4、ncemax_capacitancemin_capacitanceCell degradationcell_degradationConnection classconnection_class设计规则约束是工艺库里指定属性,你也可以明确地、随意地指定这些约束。如果工艺库里定义了这些属性,在进行设计编译和生成约束报告时,Design Compiler暗中将它们应用于使用那个库的任何设计。你不能移走工艺库里定义的设计规则约束,因为它们是工艺的特定要求,但你可以使它们更为严格来适应你的设计。如果内在的和外在的设计规则约束同时应用于一个设计或一条线,更为严格的值拥有优先权。5-2-1 设置转换时间约

5、束线的转换时间约束是对它的驱动管脚改变逻辑值的时序要求。转换时间是以工艺库数据为基础。对于非线性延迟模型(NLDM),输出转换时间是输入转换和输出负载的函数。通过对一个单元的每一个输出管脚赋予max_transition属性,Design Compiler和Library Compiler模拟转换时间约束。在最优化过程中,Design Compiler试图使每一条线的转换时间都小于max_transition属性值。命令set_max_transition用来改变工艺库里指定的最大转换时间约束。通过对指定的对象设置max_transition属性,这条命令给设计中所有线或与确定端口相连的线设置

6、了最大转换时间。比如,对设计adder中的所有线设置最大转换时间3.2,输入:dc_shell set_max_transition 3.2 find(design,adder)利用remove_attribute命令来取消set_max_transition命令,比如,输入:dc_shell remove_attribute find(design,adder)max_transition5-2-2 设置扇出负载约束线的最大扇出负载是指这条线所能驱动的最大数目的负载。通过赋予每一个输入管脚fanout_load属性和一个单元的每一个输出管脚max_fanout属性,Design Compil

7、er和Library Compiler模拟扇出限制。扇出负载值不表示电容;它表示对整个扇出负载的数字上的贡献。强加于一个输入管脚的扇出负载不必是1.0。库的开发者可以指定更高的扇出负载值来模仿内在的单元负载效果。将有那个管脚驱动的所有输入的fanout_load值相加,Design Compiler计算一个驱动管脚的扇出。为确定这个管脚是否满足最大扇出负载约束,Design Compiler将计算的扇出负载值和管脚的max_fanout值相比较。图5.2显示了一个小电路。其中管脚X驱动两个负载,管脚A和管脚B。如果管脚A的fanout_load值为1.0,管脚B的fanout_load为2.0

8、,那管脚X的整个扇出负载为3.0。如果管脚X有一个大于3.0的最大扇出,比如说16.0,那管脚X符合扇出约束。图5.2 扇出约束实例在最优化时,Design Compiler试图满足每一个驱动管脚的扇出负载限制。如果一个管脚违反了扇出负载限制,Design Compiler会尽力改正这个问题(比如通过改变这个元件的驱动能力)。工艺库可能对整个库指定默认的扇出约束,或对库描述的一个单独的单元里特定的管脚指定扇出约束。为确定你的工艺库是否为扇出计算而模拟,你可以对单元的输入管脚搜索fanout_load属性:dc_shell get_attribute find(pin, my_lib/*/*)

9、fanout_load用set_max_fanout命令对设计或输入管脚设置比工艺库里指定的更为保守的扇出约束(用set_fanout_load命令对输出端口设置预期的扇出负载值)。set_max_fanout命令通过对指定对象设置max_fanout属性对设计中的所有线或指定的输入端口设置最大扇出负载。比如,要对设计adder中的所有线设置max_fanout为16,输入:dc_shell set_max_fanout 16 find(design, adder)如果你用set_max_fanout命令和存在库的max_fanout属性,Design Compiler会尽力满足更小的扇出限制

10、。用remove_attribute命令来取消set_max_fanout命令,比如,输入:dc_shell remove_attribute find(design,adder) max_fanout5-2-3 设置电容约束转换时间约束并没有提供一个直接的方式来控制线的真实电容。如果你想要直接控制电容,利用set_max_capacitance命令来设置最大电容约束。这个约束是完全独立的,因此除了转换时间约束外,你还可以使用它。通过给一个单元的输出端口或管脚赋予max_capacitance属性,Design Compiler和Library Compiler模拟电容约束。把线电容和管脚电容

11、相加,Design Compiler来计算输出线的电容。为确定线是否满足电容约束,Design Compiler把计算出的电容值与输出管脚的max_capacitance值相比较。比如,对设计adder中的所有线设置最大电容为3,输入:dc_shell set_max_capacitance 3 find(design,adder)用remove_attribute命令来取消set_max_capacitance命令,如,输入:dc_shell remove_attribute find(design,adder)max_capacitance你也可以用set_min_capacitance命

12、令对输入端口或管脚设置最小电容。第三节 设置最优化约束这一节中将讨论最常用的指定的最优化约束: 时序约束(Timing constraints) 面积约束(Area constraints)Design Compiler也支持功耗约束。图5.3解释了定义最优化约束的一些常用的命令。图5.3 Commands Used to Define the Optimization Constraints for Sequential Blocks5-3-1 设置时序约束时序约束指定了设计所要求的性能。为设置时序约束,1.定义时钟。2.定义与时钟相关的I/O的时序要求。3.指定组合路径延迟要求。4.指定时

13、序异常。表5.2列出了设置时序约束的命令。表5.2 设置时序约束的命令CommandDescriptioncreate_clockDefines the period and waveform for the clock.set_clock_latency set_propagated_clockset_clock_uncertaintyDefines the clock delay.set_input_delayDefines the timing requirements for input portsrelative to the clock period.set_output_dela

14、yDefines the timing requirements for output ports relative to the clock period.set_max_delayDefines maximum delay for combinational paths.(This is a timing exception command.)set_min_delayDefines minimumdelay for a combinational paths.(This is a timing exception command.)set_false_pathSpecifies fals

15、e paths. (This is a timing exception command.)set_multicycle_pathSpecifies multicycle paths. (This is a timing exception command.)下面的部分将详细介绍三个步骤。5-3-1-1 定义一个时钟对于一个同步设计,时钟周期是最重要的约束,因为它对设计中所有寄存器到寄存器的路径加以约束。1.定义时钟的周期和波形利用create_clock来定义时钟的周期(-period选项)和波形(-waveform选项)。如果你没有指定时钟的波形,Design Compiler使用50的占

16、空循环。比如,对端口clk指定25兆赫和50的占空循环,输入:dc_shell create_clock clk -period 40当你的设计包含多时钟时,密切注意这些时钟共同的基本周期。共同的基本周期是所有时钟周期最小的共同的倍数。比如,如果你有10,15,20的时钟周期,那共同的基本周期就为60。定义你的时钟以使这个共同的基本周期是每一个时钟周期的最小的整数倍数。这个共同的基本周期的要求是定性的,不存在硬性限制。如果这个基本周期大于最小周期的十倍,那结果是要求更长的运行时间和更大的内存。一个极端的情况是如果你有一个寄存器到寄存器的路径,其中一个寄存器的周期为10,而另一个寄存器的周期为1

17、0.1,那么共同的基本周期就为1010.0。通过指定不带小数点的时钟周期,插入不确定的时钟来调整时钟周期,你可以解决这个问题。dc_shell create_clock -period 10 clk1dc_shell create_clock -period 10 clk2dc_shell set_clock_uncertainty -setup 0.1 clk2用report_clock命令来显示设计中所有时钟资源的信息,用remove_clock命令来移走时钟的定义。2.创建虚拟时钟许多情况下,一个模块里可能不存在系统时钟。你可以用create_clock-name来创建一个虚拟时钟,模拟

18、系统中表现的时钟信号。通过创建一个虚拟时钟,你可以描述模块外的与时钟相关的延迟。dc_shell create_clock -period 30 -waveform 10 25 -name sys_clk3.指定时钟网络延迟默认情况下,Design Compiler假设时钟网络没有延迟(完美的时钟)。用set_clock_latency和set_clock_uncertainty命令来指定关于时钟网络延迟的时序信息。你也可以用这些命令来指定估计的或真实的延迟信息。用set_propagated_clock命令来指定通过时钟网络传播的时钟等待,比如:dc_shell set_propagated

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

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

21、的输入或输出的延迟。用remove_input_delay命令移走输入延迟约束。用remove_output_delay命令移走输出延迟约束。图5.4显示了延迟和有效的时钟沿之间的关系(如图中的上升沿)。图5.4 Relationship Between Delay and Active Clock Edge图中,模块A有输入DATA_IN和输出DATA_OUT。从波形图中可以看到,DATA_IN在时钟上升沿后稳定20ns;DATA_OUT必须在时钟上升沿前15ns有效。在你用create_clock命令设置时钟约束后,用set_input_delay和set_output_delay命令来指

22、定这些额外的要求。比如,输入:dc_shell set_input_delay 20 -clock CLK DATA_INdc_shell set_output_delay 15 -clock CLK DATA_OUT下面是一个加以约束的设计模块的实例:图5.5解释了设计模块my_block的时序要求,下面的命令行是用来定义这些时序要求的。图5.5 my_block的时序要求create_clock -period 20 -waveform 5 15 clkacreate_clock -period 30 -waveform 10 25 clkbset_input_delay 10.4 -cl

23、ock clka in1set_input_delay 6.4 -clock clkb -add_delay in1set_output_delay 1.6 -clock clka -min out1set_output_delay 4.8 -clock clka -max out15-3-1-3 指定组合路径延迟要求对于不被时钟周期限制的完全的组合延迟,命令set_max_delay和set_min_delay定义指定路径的最小和最大延迟。在HDL代码中产生异步逻辑,一种普通的方法就是对锁存器和触发器使用异步置位或复位。因为复位信号跨越几个模块,在顶层约束这个信号。比如,要对复位信号定义最大

24、延迟为5,输入:dc_shell set_max_delay 5 -from RESET对从IN1到OUT1的路径指定最小延迟为10,输入:dc_shell set_min_delay 10 -from IN1 -to OUT1用report_timing_requirements命令列出对你的设计所要求的最大和最小延迟。5-3-1-4 指定时序异常时序异常是对一个或更多的违反默认的单循环时序关系的路径指定时序关系。利用时序异常来对那些不遵循默认的单循环行为的路径或异步路径加以约束或使其失去作用。指定众多的时序异常会增加编译时间。然而,很多设计需要许多的时序异常。Design Compiler

25、只承认有正确参考点的时序异常。 设计中的有效起点是指时序单元的主要的输入端口和时钟管脚。 有效的结束点是指设计的主要输出端口和时序单元的数据管脚。如果你指定了一个无效的参考点,Design Compiler不会发出警告信息。你必须用命令report_timing_requirements中的-ignored选项来查明被Design Compiler忽视的时序异常。你可以利用时序异常命令来指定下列条件: 错误路径(False paths (set_false_path)) 最小延迟要求(Minimum delay requirements (set_min_delay)) 最大延迟要求(Maxi

26、mum delay requirements (set_max_delay)) 多循环路径(Multicycle paths (set_multicycle_path))用report_timing_requirements命令列出设计中的时序异常。1.指定错误路径Design Compiler在时序报告中不报告错误路径,或在时序优化时不照顾它们。用命令set_false_path指定错误路径。用这个命令来忽视那些非关键路径,它们可能掩盖其他一些在优化时必须考虑的路径;或者是那些在正常操作中从不会发生。比如,图5.6显示了一个寄存器的外形,它从双向总线(DATA)进行读写。图5.6 Confi

27、guration Register这个电路有这些时序路径:1. DATA to U1/D2. RD to DATA3. U1/G to CONFIG (with possible time borrowing at U1/D)4. U1/G to DATA (with possible time borrowing at U1/D)5. U1/G to U1/D (through DATA, with possible time borrowing)前面四条路径都是有效的,而第五条是一条功能错误的路径,因为正常的操作不可能要求对寄存器同时进行读和写。在这个设计里,你可以用这个命令来使这条路径失

28、效: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 FF12/D创建一条错误路径不同于使时序弧失效。使时序弧失效表示一条路径的中断。定义一个错误路径并不中断路径,它只是阻止在优化时,这条路径被考虑。2.指定最小和最大延迟要求你可以用set_min_delay和set_max_delay来指定路

29、径延迟要求,它们远比Design Compiler根据时钟时序得到的保守。利用reset_path命令取消set_min_delay和set_max_delay命令。(1)寄存器到寄存器的路径Design Compiler利用下列方程式得到寄存器到寄存器路径的最小和最大路径延迟的约束:min_delay = (T capture - T launch ) + holdmax_delay = (T capture - T launch ) - setup你可以利用set_min_delay和set_max_delay命令而不考虑得到的路径延迟(T capture T launch)。比如,假设你

30、有一条路径,时间20时从一个寄存器开始,在时间35到达一个寄存器,此时是时钟的下一个有效沿:dc_shell create_clock -period 40 waveform 0 20 clk1dc_shell create_clock -period 40 -waveform 15 35 clk2Design Compiler自动地得到一个最大路径延迟约束:(3520)(终点库的寄存器的建立时间)。指定一个最大路径延迟为10,输入:dc_shell set_max_delay 10 -from reg1 -to reg2Design Compiler以10(终点库的寄存器的建立时间)来计算最

31、大路径延迟约束,没有考虑最初得到的最大路径延迟约束。(2)寄存器到端口的路径Design Compiler利用下列方程式得到寄存器到端口路径的最小和最大路径延迟的约束:min_delay = period - output_delaymax_delay = period - output_delay如果你用set_min_delay或set_max_delay命令,这些命令中定义的值将代替约束计算中的周期值。比如,假设你有一个时间时钟周期为20的设计,输出OUTPORTA的输出延迟为5:dc_shell create_clock -period 20 CLKdc_shell set_outpu

32、t_delay 5 -clock CLK OUTPORTADesign Compiler自动地得到最大路径延迟约束15(205)。指定你想要的最大路径延迟10,输入:dc_shell set_max_delay 10 -to OUTPORTADesign Compiler计算最大路径延迟为5(105),没有考虑原先得到的最大路径延迟约束。(3)异步路径你也可以用set_max_delay和set_min_delay命令来约束穿越不同频率域的异步路径。比如:dc_shellset_max_delay 17.1 -from find(clock, clk1) -to find(clock, clk

33、2)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, clk1)(4)设置多循环路径当有疑问的路径长于单个循环或数据并没有如期的在单个循环内,多循环路径条件是适当的。用set_multicycle_path命令来指定Design Compiler使用的时钟循环的数目,来决定在特殊的终点什么时候需要数据。你可以为建立和保持检测指定循环乘法器。如果你没有为命令set_m

34、ulticycle_path指定-setup或-hold选项,Design Compiler只将乘数值应用于建立检查。默认情况下,在数据从起点开始,到终点下一个时钟的活跃沿检查建立(默认乘数为1)。在数据建立后数据保持一个时钟循环,但在建立时的那个沿检测(默认乘数为0)。图5.7显示了建立和保持时间之间的时序关系。图5.7 建立和保持时间时序路径从时钟管脚FF1(CLKA的上升沿)开始,结束于数据管脚FF2。假设触发器是正沿触发的,数据的建立从时间0开始,然后20时间单位后在FF2的CLKB的下一个有效沿检测数据;数据的保持从一个时钟(CLKA)循环开始(20单位),在检测建立的相同沿时检测(

35、20单位)。set_multicycle_path命令的-setup选项在默认沿的前或后移走用于建立检测的沿。如图5.7所示的例子, 零的建立乘数意味着Design Compiler利用零时刻的沿检测 2的建立乘数意味着Design Compiler利用40时刻的沿检测set_multicycle_path命令的hold选项在默认沿的前后开始数据的保持,但Design Compiler仍然在检测建立的沿检测数据的保持。如图5.7所示(默认的建立乘数), 1的保持乘数意味着数据从CLKA(时间40)开始保持到CLKB(时间20)检测 1的保持乘数意味着数据从CLKA(时间0)开始保持到CLKB(

36、时间20)检测用带有相同选项的reset_path命令来取消set_multicycle_path命令。(5)采用多重的时序异常命令一个特殊的时序异常命令用于一个单独的时序路径,而一个一般的时序异常命令用于更多的时序路径。如果你对更多的实例执行给定的时序异常命令,那么更多的特殊命令将覆盖更多的一般的命令。下列规则定义了给定时序异常命令的优先顺序: 当你定义从一个管脚到另一个管脚的时序异常时,享有最高优先权 一个使用-from选项的命令比一个使用-to选项的命令享有更高的优先权 对于时序异常命令中的时钟,如果同时指定了-from和-to选项, 它们将覆盖只指定了-from或-to选项的共有同样路

37、径的命令这个列表详细列出了由这些优先权规则定义的优先顺序:1. command -from pin -to pin2. command -from clock -to pin3. command -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

38、 2 -from A -to Bdc_shell set_multicycle_path 3 -from A下列规则总结了时序异常命令的相互作用: 一般的set_false_path覆盖特殊的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_a

39、rea属性,为当前设计指定最大面积。用工艺库里面积的单位来指定这个面积。比如,想要设置最大面积为100,输入:dc_shell set_max_area 100设计面积由每一个元件和线的面积组成。在Design Compiler计算设计面积时将忽视下列元件: 未知元件 未知面积的元件 独立于工艺的普通元件单元(元件)的面积是与工艺相关的;Design Compiler从工艺库里获取信息。当你同时定义时序和面积约束,Design Compiler将首先去满足时序约束。当你定义面积约束时,使用-ignore_tns选项将面积约束的优先权提到全部的消极的延迟之前:dc_shell set_max_a

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

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

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

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

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

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

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

47、):无论自顶向下还是从下到上,只要是最合适的,就应用于单一的子设计在下面的内容中,将以图5.8所示的简单设计为例来示范自顶向下和从下到上的编译策略:图5.8 Design to Illustrate Compile Strategies表5.4中列出了设计的顶层或全局的规范,适用于TOP和它所有的子设计。表5.4 Design Specifications for Design TOPSpecification typeValueOperating conditionWCCOMWire load model20x20Clock frequency40 MHzInput delay time3

48、nsOutput delay time2 nsInput drive strengthdrive_of (IV)Output load1.5 pf下面是设计TOP的约束文件:set_operating_conditions WCCOMset_wire_load_model “20x20”create_clock -period 25 clkset_input_delay 3 -clock clk all_inputs()-find(port, clk)set_output_delay 2 -clock clk all_outputs()set_load 1.5 all_outputs()set

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

50、d -f verilog D.vread -f verilog C.vread -f verilog B.vread -f verilog A.vread -f verilog TOP.vcurrent_design TOPlink/* resolve multiple references */uniquify/* apply constraints and attributes */include defaults.con/* compile the design */compile5-4-2-2 从下到上编译从下到上编译策略有如下优点: 利用divide-and-conquer方法编译大

51、的设计 比自顶向下编译,内存的要求更小 允许时间预算 重复直到接口稳定 人为的修改控制从下到上编译策略单独地编译子设计,然后在顶层设计中合并。应用顶层约束,检测设计是否有错误。即使有可能没有错误展现,这也是靠不住的,因为子设计之间设置的接口通常在开始不是那么准确。为改进内在模块约束的准确性,你读入顶层设计和所有的子设计,然后对子设计的单一的单元实例应用characterize命令。在编译过的子设计提供的更多的接近现实的信息的基础上,characterize捕获每一个单元实例的环境和时序信息,然后用新值替代现存的属性和约束。采用改进过的约束,重新编译子设计,并再次检测顶层设计。你应该了解改进过的

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

53、ign -all来移走内存中的所有设计8.读入先前特性化过的单元的RTL级设计重新编译RTL设计,而不是单元映射后的设计,可能导致更好的优化结果。9.设置特性化的单元的子设计为当前设计,利用保存的特性数据的脚本重新编译。10.读入所有其他编译过的子设计11.链接当前设计12.选择其他子设计,重复步骤3到步骤9,直到你利用它们真实的情况来重新编译过所有的子设计在应用从下到上的编译策略时,注意下列情况:l 命令read_file可以更为快捷地读入.db格式。如果在首次读入RTL级代码后,你不愿意修改它,保存这个未映射的设计为一个.db文件。在你重新读入这个设计时将节省不少时间。l compile命

54、令影响当前设计的所有子设计。如果你只想优化当前设计,你可以在你的数据库中移走或不包括它的子设计,或者对子设计设置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_file -format verilog block_sourcecurrent_design blocklinkuniquify/*

55、 apply global attributes and constraints */include defaults.con/* apply block attributes and constraints */block_script = block + .coninclude block_script/* compile the block */compile/* read in entire compiled design */read_file -format verilog TOP.vcurrent_design TOPlinkwrite -hierarchy -output fi

56、rst_pass.db/* apply top-level constraints */include defaults.coninclude top_level.con/* check for violations */report_constraint/* characterize all instances in the design */all_instances = U1,U2,U2/U3,U2/U4,U2/U5characterize -constraint all_instances/* save characterize information */foreach (block

57、, all_blocks) current_design blockchar_block_script = block + .wscrwrite_script char_block_script/* recompile each block */foreach (block, all_blocks) /* clear memory */remove_design -all/* read in previously characterized subblock */block_source = block + .vread -format verilog block_source/* recom

58、pile subblock */current_design blocklinkuniquify/* apply global attributes and constraints */include defaults.con/* apply characterization constraints */char_block_script = block + .wscrinclude char_block_script/* apply block attributes and constraints */block_script = block + .coninclude block_scri

59、pt/* recompile the block */compile5-4-2-3 混合编译策略你可以同时采用两种策略来获得两种策略的优点:l 对层次较少的模块应用自顶向下的编译策略l 应用从下到上的编译策略将层次较少的和更大的模块结合图5.9显示了一个混合编译策略的例子。图5.9 混合编译策略5-4-3 分解一个设计基准的多重实例在一个层次化设计中,子设计常常被多于一个的实例所引用。图5.10所示的设计top,其中设计C被引用了两次(U2/U3 and U2/U4)。图5.10 Multiple Instances of a Design Reference你必须在运行compiler命令前

60、分解这些多重实例。你可以使用如下的方法: uniquify compile-once-dont-touch ungroup5-4-3-1 uniquify如果被多次引用设计的实例的周围环境很不一致,采用uniquify来分解多重实例。这个方法包括使用uniquify命令来复制和重新命名被多重引用的设计,以致每一个实例引用一个唯一的设计。然后Design Compiler才能根据它的单元实例的唯一的环境对每一个设计副本进行最优化。默认情况下,uniquify命令将贯穿整个当前设计对所有的多重实例(除了那些赋予dont_touch属性的)创建唯一的设计副本。你也可以用-reference选项来创建

61、指定引用的唯一的副本;或者用-cells选项指定特殊的单元。Design Compiler对那些带有-reference或-cells选项的指定的单元制造唯一的副本,即使它们被赋予了dont_touch属性。Design Compiler用uniquify_naming_style变量中指定的命名习惯来产生子设计每一个副本的名字。默认的命名习惯是:%s_%d%s:子设计的原始名称(或-base_name选项指定的名称)%d:形成唯一子设计名称的最小的整数值你可以用uniquify命令仅仅分解多重设计引用,或者对分解后的当前设计重新进行编译。比如,下面的命令序列分解了设计top中设计C的多重引用

62、;用uniquify命令通过复制设计C来创建新设计C_0和C_1;然后用这两个复制品代替内存中的设计C。dc_shell current_design topdc_shell uniquifydc_shell compile图5.11显示了运行这个命令序列的结果。图5.11 uniquify结果与compile-once-dont-touch相比较,uniquify有如下的特征: 要求更大的内存 需要更长的编译时间5-4-3-2 compile-once-dont-touch如果被多次引用设计的实例的周围环境很相似,采用compile-once-dont-touch。在这种方法里,你用它的一个实例的环境来进行设计编译,然后你用set_dont_touch命令在剩余的优化过程中保存该子设计。用compile-once-dont-touch来分解多重实例,遵循下列步骤:1. 将子设计的实例的环境表现为最差情况;2. 编译被引用的子设计

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!