DC学习-第七章

本章详细介绍了Design Compiler中的设计规则约束和优化约束,包括最大过渡时间、最大散出、最大电容等,阐述了如何设置和管理这些约束以优化设计,以及约束的优先级和冲突解决策略。此外,还讲解了如何使用不同命令来定义和报告约束,以及在层次化设计中如何传播约束。

7定义设计约束
约束是一种声明,这种声明用可量化的电路特性来定义你的设计目标,这些特性包括时序,面积和电容。没有约束,Design Compiler工具就无法有效的优化你的设计。

在本章中,你会学到以下东西:
 Design Compiler约束类型
 设计规则约束
 优化约束
 管理约束优先级
 报告约束
 层次化设计中传递约束
Design Compiler约束类型
当Design Compiler优化你的设计时,它会使用到两种约束:
设计规则约束
这种约束是隐形约束;technology library定义了这些约束。这些约束对于一个设计能正常的工作是必须存在的,而且她们会应用到所有使用其库的设计中。你可以让这些约束比优化约束更严格。
优化约束
这种约束是显示约束;你必须定义它们。优化约束应用于当前运行的dc_shell会话的设计中并且表示了设计的目标。这些必须是和现实情况一样。
Design Compiler会尝试同时去满足这两种约束,但是设计规则约束的优先级更高。
Design Compiler计算两个成本函数:一个是设计规则约束,另一个是优化约束。在门级约束中,如果设计发生了改变,Design Compiler会报告每个成本函数的值。
你可以在命令行交互式的指定约束或者在约束文件中指定约束。
图7-1 显示了主要的Design Compiler规则约束和优化约束和设置约束的dc_shell接口命令。
图7-1 主要的Design Compiler约束

注意:
如果你使用Synopsys的功耗编译工具,max_dynamic_power和max_leakage_power是优化约束。为了使用这些约束,你需要一个功耗优化的license和支持功耗的库特性。
设计规则约束
设计规则约束反映了你的设计必须遵守的工艺规范限制,这样设计才能如预期的工作。设计规则约束设计的线网但是它和technology库的单元的引脚是相关的。绝大部分technology库指定了默认的设计规则。Design Compiler不能违反设计规则约束,即使违反了优化约束也不能违反设计约束。你可以设置更严格的设计规则,单万万不可使用更放松的设计规则。
设计规则约束包含了
 最大过渡时间
 最大散出
 最大及最小电容
 单元解构
你无法移除technology库设置的max_transitiong,max_fanout,max_capacitance和min_capacitance属性,因为这些事technology的必须属性,但是你可以为这些属性设置更严苛的值。如果为一个设计或者端口既有隐形的也有明确地值,那么更严格的那一个值会被使用。你可以移除你设置的值。
设计规则成本函数
Design Compiler帮助你修正设计规则违例。如果有多个违例,Design Compiler会优先修复优先级最高的违例。如果可能,它会评估并选择可以减少其他设计规则的违例的替代方案。Design Compiler使用和延时违例类似的方法。
图7-2显示了设计规则的成本函数方程
图7-2 设计规则成本方程

在编译报告中,设计规则成本部分报告了一个设计的设计规则约束的成本函数。
最大过渡时间
最大过渡时间是一个设计规则约束。一根连线的最大过渡时间是其驱动引脚改变逻辑值所需的最长时间。许多technology库包含了一个引脚的最大过渡时间的限制,该限制为使用该库的设计创建了隐含的过渡时间限制。
Design Compiler尝试让每个线的过渡时间少于max_transition的值,例如,通过在驱动门电路的输出时插入buffer。max_transitiong值是随着单元的操作频率变化的。
使用set_max_transitiong命令可以修改或者增加technology库的隐含的过渡时间值。
如果定义了库的max_transition和设计的max_transition的属性,Design Compiler会尝试去达到更小(更严格)的值。
如果你的设计使用多个technology库并且每个库都有一个不同的默认max_transition值,Design Compiler会对整个设计使用其中最小的max_transition值。
定义最大过渡时间
set_max_transition命令为时钟组,端口,或者设计的max_transition属性设置指定的值。在编译过程中,Design Compiler试图保证线网的过渡时间小于该指定值。
例子
设置一个加法器最大过渡时间为3.2,输入下面的命令:

使用remove_attribute命令可以撤销set_max_transition命令。输入下面命令:

更多详细的命令信息,请参考man page。
指定基于时钟的最大过渡时间
max_transition的值是随着一个单元的操作频率变化的。一个单元的操作频率就是其寄存器驱动一些列逻辑的最高时钟频率(时钟频率是使用creat_clock命令来定义的)。
对于一个有多个时钟域的设计,你可以使用set_max_transition命令来为指定的时钟组的引脚设置max_transition属性。
Design Compiler遵守以下规则来决定max_transition的值:
 当为一个设计或者端口和一个时钟组设置max_transition属性,其中最严格的约束会被使用到。
 如果多个时钟启动相同的路径,会使用最严格的约束。
 如果在technology库中指定了max_transition属性,工具会自动去尝试在编译期间来满足这些约束。
例如,下面的命令为所有属于Clk时钟组的pins设置max_transition的值为5:

最大散出
最大散出是一个设计规则约束。绝大部分technology库为驱动pins设置散出约束,为使用该库的设计中的每个驱动pin创建一个隐含的散出约束。
你可以为整个库设置一个更保守的输出约束或者为单个单元的库描述指定的pins定义散出约束。
如果已经有一个库散出约束并且你又指定了一个max_fanout的属性,Design Compiler会尝试去满足其中的更小(或者更严格)的值。
Design Compiler通过将fanout_load属性和每一个输入pin相关联和将max_fanout属性和单元上每一个输出(驱动)pin相关联来为散出限制建模。图7-3显示了这些散出属性。
图7-3 散出负载和最大散出属性

为了评估一个驱动引脚的散出(譬如图7-3的X),Design Compiler会计算所有由X驱动的输入端的fanout_load属性的和,并将该数目和存储于驱动引脚X的max_fanout属性的数目对比。
 如果散出负载的和不大于max_fanout值,由X驱动的线就是可用的。
 如果由X驱动的线是不可用的,Design Compiler可能会通过选择更高驱动力的部件来试图让该线有效。
最大散出计算示例
图7-4 显示了如何计算最大散出
图7-4 最大散出的计算

你可以通过如下的方式来为每个驱动pin和输入端口设置最大散出:

Design Compiler通过对比指定的max_fanout属性的值和散出负载,来检查最大散出约束是否满足驱动pin Z的要求。
在上图所示的情况下,设计时满足约束的。

驱动单元(U3)的散出负载没有必要设成1.0。库开发者可以指定一个更高的散出负载(例如,2.0)来为内部单元散出效果建模。
你也可以为一个输出端口(OUT1)设置散出负载来为外部散出效果建模。
散出负载是一个无量纲数,而不是电容。它代表着对总有效散出的数值上的贡献。
定义最大散出
set_max_fanout命令为列出的输入端口设置最大允许散出负载。set_max_fanout命令为列出的对象设置max_fanout属性。
使用remove_attribute命令可以撤销为一个输入端口或者设计设置的最大散出值。例如,

更多信息,请参考man page。
为输出端口定义期望的散出
set_fanout_load命令为列出的输出端口设置期望的散出负载值。
Design Compiler将散出值添加到所有其他的负载中,这些负载是驱动port_list中端口的pin的负载,并且试图使所有的负载总和少于pin的最大散出负载。
使用remove_attribute命令可以撤销set_fanout_load命令对输出端口的设置。例如,

使用get_attribute命令可以确定散出负载。
例子
为了找出库libA中的库单元AND2的输入pin的散出负载,输入

为了找出technology库libA的默认散出负载设置,输入

更多信息,请查看set_fanout_load的man page。
最大电容
最大电容是设计规则约束。它被当做引脚级别的属性来设置,这种属性定义了一个输出pin可以驱动的最大总电容负载。也就是说,该pin无法连接总电容(负载pin电容和连线电容)超过或者等于该pin定义的最大电容。
最大电容设计规则约束允许你直接控制连线的电容。(设计规则约束max_fanout和max_transition间接地限制了线网的实际电容。)max_capacitance约束的作用类似于max_transition,但是其代价是基于线网的总电容,而不是过渡时间。max_capacitance属性独立的工作,所以你可以将它和max_fanout和max_transition一起使用。
max_capacitance的值是随着一个单元的操作频率变化的。你可以通过设置compile_enable_dyn_max_cap的变量为true来让Design Compiler标注每一个驱动pin的基于频率的max_capacitance值。参考“specifying Frequency-Based Maximum Capacitance”。
max_capacitance约束的优先级比单元解构约束的高。
如果库的max_capacitance属性和设计的max_capacitance属性同时存在,Design Compiler会试图去满足其中更小(更严格)的那一个值。
定义最大电容
set_max_capacitance命令为连接到指定的端口的线网或者设计中所有的线网设置最大电容。该命令允许你直接控制电容并且为列出的对象设置max_capacitance属性。
Design Compiler通过将线网的线电容加入到连接到该线网的pin的电容来计算一根线网的电容。Design Compiler通过对比计算的电容值和驱动该线网的pin的max_capacitance值。来决定该线网是否满足电容约束。
使用set_max_capacitance命令来指定输入端口或者设计的电容值。该值应该小于或者等于驱动该线网的pin的max_capacitance值。
例子
设置加法器的最大电容为3,输入下面的命令:

更多信息,请参考set_max_capacitance的man page。
指定基于频率的最大电容
max_capacitance值是随着一个单元的操作频率而变化的。你可以通过将compile_enable_dyn_max_cap变量设置为true来让Design Compiler标注每一个驱动pin的基于频率的max_capacitance值。
在你使用该功能前,你的technology库应该具有多频率的特征。该特征包括将每种频率下的最大电容值与每个驱动pin相关联,并在一维查找表中捕获该信息。更多关于创建max_capacitance查找表的信息,查看库编译文档。
Design Compiler遵循以下的步骤来确定max_capacitance值:
1、识别每个单元的操作频率
一个单元的操作频率是指驱动逻辑的寄存器的最高时钟频率(时钟频率是通过creat_clock命令来定义的)。
2、在technology库的查找表中为特定的频率查找对应的max_capacitance值。
3、用合适的max_capacitance值标注每个驱动pin,并且在综合时使用这些值。
最小电容
最小电容是设计规则约束。一些technology库指定了最小电容。min_capacitance设计规则指定了一个单元可以驱动的最小负载。它指定了一个单元运行时的负载范围的最低边界。在优化期间,Design Compiler要确保一个单元驱动的负载满足该单元的最小电容要求。当违例发生时,Design Compiler会通过调整驱动器来修正该违例。
你可以为在已存在的设计规则中使用min_capacitance设计规则。min_capacitance设计规则比最大过渡时间,最大散出和最大电容约束拥有更高的优先级。
你可以为连接到输入端口的线网设置最小电容来决定驱动单元在输入边界是否出现违例。如果在编译后报告了违例,你可以通过重编译驱动这些端口的模块来修正这个问题。使用set_min_capacitance命令来设置输入端口或者inout端口的最小电容;你无法在一个设计上设置最小电容。
如果库和设计中的min_capacitance属性同时存在,Design Compiler会试图去满足更大(更严格)的值。
定义最小电容
Set_min_capacitance命令设置列出的输入或者双向端口的定义的最小电容值。使用set_min_capacitance命令可以为连接到输入或者双向端口的线网设置最小电容。
例子
为名为high_driver的端口将最小电容值设置为12个单位,输入

使用report_constraint命令的-min_capacitance选项可以值报告最小电容约束的信息。
使用report_port命令可以获取关于当前端口设置的信息。
使用remove_attribute命令可以撤销set_min_capacitance命令的设置。
更多信息,请参考set_min_capacitance的man page。
单元解构
单元解构是一个设计规则约束。一些technology库包含了单元解构表。该表列出了一个单元可以驱动的最大电容,作为单元的输入端的过渡时间函数。
cell_degraduation设计规则指定了一个线网电容值必须小于的单元解构值。cell_degraduation设计规则可以和其他设计规则一起使用,但是max_capacitance设计规则比cell_degraduation设计规则的优先级更高。如果max_capacitance规则没有被违反,使用cell_degraduation设计规则不会导致违反max_capacitance规则。
set_cell_degration命令为指定的输入端口的cell_degradation属性设置指定的值。
在编译期间,如果cell_degradation表在technology库中已经指定了,Design Compiler会试图去保证一个线网的电容值小于指定的值。Cell_degradation表给出了一个单元可以驱动的最大电容,作为这个单元的输入端的过渡时间函数。
如果technology库没有指定cell_degradation表,你可以为输入端口显式的设置cell_degradation。
默认情况下,一个端口时没有cell_degradation约束的。
注意:
使用set_cell_degradation命令需要DC Ultra license。
其语法为

注意:
更多信息请参考set_cell_degradation的man page。
例子
该命令为命名为late_riset的端口设置最大电容值为2个单温:

使用report_constraint命令可以获得关于优化和设计规则约束的信息。
使用remove_attribute命令可以移除cell_degradation属性。
连接类
一个端口的连接类约束描述了特定工艺下的连接要求。只有负载和驱动有同样的连接类标签,它们才能合法的连接在一起。该约束可以在库中指定或者由用户指定。使用set_connection_class命令可以设置一个端口的连接类。更多细节,请参考该命令的man page。
管理设计规则约束的优先级
默认情况下,设计规则约束比优化约束的优先级高。但是,你可以修改这种优先级,参考“管理约束优先级”的章节。
设计规则约束的优先
Design Compiler在解决设计规则约束冲突时,遵循以下的依次递减优先顺序(靠前的更优先)。
1、 最小电容
2、 最小过渡时间
3、 最大散出
4、 最大电容
5、 单元解构
以下细节适用于设计规则约束的优先级:
 最大过渡时间的优先级比最大散出高。如果最大散出约束没有满足,调查它和最大过渡时间约束的冲突。Design Compiler不会为了修正最大散出违例而去牺牲过渡时间。
 最大散出的优先级比最大电容高。
 Design Compiler基于不同的库,有两种计算线网过渡时间的方式。
 对于使用CMOS延时模型的库。Design Compiler通过使用驱动单元的驱动阻抗和线网的容性负责来计算过渡时间。
 对于使用非线性延时模型的库。Design Compiler通过查找表和插值的方式来计算过渡时间。这是输出pin的电容和输入过度时间的函数。
 set_driving_cell和set_drive命令的行为是有区别的,这取决你所使用的technology库。
 对于使用CMOS延时模型的库。驱动阻抗是一个常量。在这种情况下,set_drive命令和set_driving_cell命令的结果是一样。
 对于使用非线性延时模型的库。set_driving_cell命令基于表的负载动态的计算过渡时间。当set_drive命令执行时set_drive命令返回一个值并且使用表中范围中间的一个值进行加载。
set_driving_cell和set_driv命令都会影响过渡延时。set_driving_cell命令为受影响的端口设置设计规则约束(用驱动单元标注)。
set_load命令为一个端口或者线网设置负载。该负载的单位必须和technology库的保持一致。该值用于时序优化,而不是用于最大散出优化。
设计规则场景
典型的设计约束场景是
 set_max_fanout和set_max_transition命令
 set_max_fanout和set_max_transition命令
一般来说,一个technology库指定默认的max_transition或者max_capacitance,但不会同时指定二者。为了获得最好的结果,不要混合使用max_capacitance和max_transition。
特殊线网上的禁用设计规则修正
使用set_auto_disable_drc_nets命令来对时钟,常量或者扫描线网的设计规则启用或禁用修正。该命令对当前设计下给定类型的所有线网都起作用;也就是说,基于你指定的选项,它会对所有的时钟线网或者所有的常量线网或者所有的扫描线网或者这三种线网的任意组合起作用。禁用了相应设计规则修正的线网会被记录在auto_disable_drc_nets属性中。
默认情况下,一个设计的时钟和常量线网都是设计规则修正禁用的(这和使用命令的-default选项的效果是一样的);但是扫描线网不会这样。你可以使用-all选项来对三种线网类型的设计规则修正都禁用。相应的,你可以独立的对时钟线网,常量线网或扫描线网进行设计规则修正的启用和禁用,通过分别对-clock,-constant或者-scan选择赋予true或者false的值来实现。最后,你可以使用-none选项来启用三种类型线网的设计规则修正。
注意:
默认情况下,时钟线网是理想线网。使用set_auto_disable_drc_nets命令来启用设计规则修正不会影响时钟网络的理想timing的属性。你必须使用set_propagated_clock命令来影响时钟线网的理想timing。
你不能使用set_auto_disable_drc_nets来覆盖标记为理想网络属性的理想网络的禁用设计规则修正。该命令不会覆盖有set_ideal_net或者set_idel_net_work命令的设置。
设计规则命令和对象的总结
表7-1 总结了设计规则命令和它们所作用的对象
表7-1 设计规则命令和对象总结

优化约束
优化约束代表了设计的速度和面积目标和限制,这对你设计的运行来说是你希望但是不一定重要。速度(时序)约束的优先级高于面积。
默认情况下,优化约束相对于设计规则约束是次要的(但是这种优先级是可以改变的;参考管理约束优先级的章节)。
优化约束包含
 时序约束(性能和速度)
 输入输出延时(同步路径)
 最小最大延时(异步路径)
 最小面积(门电路的数量)
优化成本函数
在映射的第一阶段,Design Compiler的工作是减少优化成本函数。Design Compiler通过评估该函数来决定对设计的更改是否会优化成本。
全优化成本函数会考虑到以下组件(按照重要程度排列)。不是所有的组件在所有的设计中都是激活的。
1、 最大延时成本
2、 最小延时成本
3、 最大面积成本
Design Compiler按照重要程度的顺序独立评估各个成本函数组件,并且会在可以减少一个组件的成本而不增加更重要的成本的情况下可以接受优化操作。例如,提升最大延时成本的优化操作总是可以执行的。
优化会在所有的成本变成0或者无法进一步降低时停止进行
时序约束
在定义时序约束时,你应该考虑到你的设计由同步路径和异步路径。同步路径是通过指定设计中的时钟来约束的。使用creat_clock命令来指定时钟。在指定时钟后,建议同时指定输入输出端口的时序约束。使用set_input_delay和set_output_delay命令。
异步路劲是通过制定最小和最大延时值来约束的。使用set_max_delay和set_min_delay命令来指定这些点到点的延时。计算最小和最大延时会在下面的章节描述。
更多额外的信息,请参考Synopsys Timing Constraints and Optimizing Uset Guide。
最大延时
最大延时时一个优化约束。Design Compiler有一个内建的用于评估时序约束的静态时序分析。静态时序分析工具通过门电路和连线延时来计算路径延时,但是不会对设计进行仿真。Design Compiler时序分析工具对关键路径进行跟踪来检查设计中每条时序路径的最小和最大延时。最关键的路径并不一定是时序设计中的最长的组合路径,因为路径在路径的起点和终点是和不同时钟相关的。
时序分析工具基于时序值和technology库的环境信息来计算最小和最大信号上升和下降路径的值。
成本计算
最大延时一般是优化成本函数最重要的部分。最大延时优化函数指导Design Compiler生成一个能在你期望的速度下运行的设计。
最大延时成本包括多个部分。图7-5显示了最大延时成本方程。
图7-5 最大延时成本计算

在考虑到时钟波形和skew,库的setup times,外部延时,多周期或者false path的设置和set_max_delay命令后,设计中每条时序路径最大延时目标值就会自动算出。负载,驱动,操作条件,线负载模型和其他因素也同样要考虑到。
Path通过group_path和creat_clock命令如何分组会影响最大延时成本。
 如果只有一个path组存在,最大延时成本就是该组的成本:最差违例的数量乘以组的权重。
 如果有多个path组,所有组的成本会被加到一起来计算设计的最大延时成本。组成本一般是0或者更大。

最小延时
最小延时时一个优化约束,但是Design Compier会在它修正设计规则违例时修正最小延时约束。最小延时约束可以通过set_min_delay命令显式的设置或者通过保持时间要求来隐含的设置。
一个pin或者端口的最小延时必须必目标延时大。
Design Compiler只会在使用set_fix_hold命令时考虑最小延时成本。
如果没有为任何时钟指定fix_hold,在编译期间是不会考虑最小延时成本的。如果指定了fix_hold或者min_delay,最小延时成本是二次优化成本。
set_min_delay
定义设计中时序路径的最小延时。
set_fix_hold
在编译期间指导Design Compiler修正寄存器的保持时间违例。你可以通过使用set_false_path或者set_multicycle_path命令来覆盖被set_fix_hold影响的路径的默认路径延时。
只有set_fix_hold命令应用于相关时钟时,保持时间违例才会被修正。
成本计算
一个设计的最小延时成本和最大延时成本是不同的。最小延时成本不受路径组的影响,而且所有的违例都会增加成本。图7-6显示了最小延时成本方程。
图7-6 最小延时成本计算

对于单个pin或者端口和多个pin或者端口其最小延时成本函数的delta都是一样的。

最大面积
最大面积是优化约束。最大面积代表了设计中的门数,而不是设计占用的物理面积。通常来讲,设计的面积要求指的是能满足性能目标的最小设计。定义最大面积会指导Design Compiler在时序优化完成后去优化设计的面积。
Set_max_area命令指定了当前设计的最大允许面积。Design Compiler通过设计层次最底层的所有组件的面积和来计算设计的面积(和线网的面积)。
在计算电路面积时Design Compir会忽略以下部件:
 未知的组件
 面积未知的组件
 工艺无关的通用单元
一个单元(组件)的面积时工艺相关的而且可以冲technology库中获得。
成本计算
最大面积成本方程如下

定义最大面积
set_max_area命令指定面积目标并为当前设计设置max_area属性。
例子

定义最小设计可能会是有用的。下面的脚本指示指导Design Compiler优化面积。在你不关心时序时,它只约束了设计的最小面积。为了让时序有意义,你必须提供时钟和输入输出延时。

更多信息,请参考set_max_area的man page。
管理约束优先级
在优化期间,Design Compiler使用成本向量来解决约束冲突。表7-2 显示了默认优先级顺序。该表显示了在默认情况下设局规则约束的优先级高于优化约束。但是你可以使用set_cost_priority命令来重排用粗体字列出的约束的优先级。
表7-2 默认约束成本向量

在下面的场景你可能希望将优化约束max_delay的优先高于最大设计规则约束。
 在许多的technology库中,唯一无法在不影响延时的前提下修复的显著的设计规则违例是过约束的线网,譬如带有大量外部负载或者标记为don’t_touch的输入端口。将max_delay的优先级置于所有的设计规则约束之前可以允许以不影响延时的方式来修复所有的设计规则约束违例。譬如,Design Compiler或许允许在另一模块调整驱动。
 在编译一小块逻辑的过程中,譬如一个更大的设计中抽出的关键区域,该区域边界过约束的可能性很大。在这种情况下,设计规则修复可能会被更好的推迟直到小模块被重分组到更大的设计后。
其语法余下

指导Design Compiler使用其默认优先级,如表7-2所示

指定下面成本的优先级(首先列出最高的):max_delay,min_delay,max_transition,max_fanout,max_capacitance,cell_degradation和max_design_rules。
注意:
使用cost_list选项需要DC_Ultra的license。
例子
优先级max_delay置于最大设计规则约束前,输入

将顶层优先级赋给max_capacitance,max_delay和max_fanout(以这样的顺序),输入

Design Compiler会将没有列在列表中的成本赋予低于列出的优先级。该例子没有列出max_transition,cell_degradation或者min_delay,所以Design Compiler会将它们的优先级置于max_fanout之后。
如果你在设计中多次指定set_cost_priority,Design 会使用最近的一次设置。
报告约束
report_constraint命令报告了当前设计的约束值,允许你检查设计规则和优化目标。
约束报告为当前设计的每种约束列出了:
 该约束满足或者违反了
 该约束满足或者违反了多少
 最严重违例的设计对象
 最大延时信息,以path组的方式显示成本。包含了寄存器或者带输出延时端口setup时序违例,也包含了set_max_delay命令的违例。
 最小延时成本,包含了寄存器或者带输出眼熟的端口的保持时间的违例和set_min_delay命令的违例。
约束报告已你设置的优先级顺序报告约束的总结。你设计中没有出现的约束是不会被包含在报告中的。为了在约束报告中列出更多的信息,请使用report_constraint命令的-verbose选项。列出所有的约束的违例,请使用report_constraint命令的-all_violators选项。
更多关于report_constraint命令,请参考man page。
在层次化设计中传播约束
层次化设计是由子设计组成。你可以以下面的方式向上或者向下在层次中传播约束:
特征化
捕获特定例化单元环境信息,并将这些设计的信息作为设计的属性赋予给他们所连接的单元。
建模
将特征化的设计创建为库单元。
在层次结构上传播约束
将时钟,时序例外,和禁止时序参数从底层子设计传播到当前设计。
子设计特征化
当你单独编译子设计时,譬如输入驱动力,输入信号延时(达到时间)和输出负载等边界条件可以从父设计派生而来并为每个子设计设置这些条件。你可以通过下面的方式来完成这些事:
手动
使用set_drive,set_driving_cell,set_input_delay,set_output_delay和set_load命令。
自动化
使用characterize命令或者设计预算工具。
使用characterize命令
characterize命令将信息和属性放置在设计上,这些信息和属性描述了在顶层设计中指定实例化的上下文环境。
Characterize的主要目的是捕获子设计的时序环境。当你使用不带参数的characterize或者当你使用它的-constraint,-connections或者-power选项时就会发这种情况。
Characterize命令获取和断言下面的信息和属性,这些信息和属性是位于实例所连接的设计中。
 除非指定了-no_timing选项,characterize命令将通过下面命令之前设置的时序特征设置在子设计上。

 如果指定了-constraint选项,characterize命令将之前通过下面命令设置的面积,功耗,连接类和设计规则约束设置到子设计。

 如果你指定了-connection选项,characterize命令将下面命令设置的连接属性放置在子设计上。连接类信息只有在你使用-constra选项才会使用。

 如果你指定了-powe选项,characterize命令将下面命令之前设置,计算或保存的切换活动信息,翻转率和静态概率放置在子设计上。

移除之前的标注
在大部分场景,特征化一个设计会移除之前的特征化的效果并替换相关信息。但是,在反标时(set_load,set_resistance,read_timing,set_annotated_delay,set_annotated_check),特征化步骤会移除标注并且无法覆盖之前已存在的子模块的标注。在这种情况下,你必须在你再次运行characterize命令显式的从子设计移除标注(使用reset_design)。
由下而上和自顶向下的优化对比
在优化期间,你可以使用characterize配合set_dont_use来保持层次。这就是由下而上的优化,这样你可以使用golden实例或者唯一访问来应用它(手动使用uniquify命令或者自动的作为compile命令的一部分)。另一种是自顶向下的优化,也称为层次化编译。在自顶向下的优化中,工具自动为子设计进行特征化和优化。
边界条件的推导
Characterize命令基于其父设计的上下文自动推导一个子设计的边界条件。它检查一个实例的环境来获取实际的驱动,负载和时序参数,并计算三种类型的边界条件:
时序条件
输入端口期望的信号延时。
约束
集成父设计的需求,譬如最大延时。
连接关系
端口间,或者端口和电或者低之间的逻辑关系,譬如常0,和另一个端口的逻辑反转。这些结果会引用到引用。
图7-7 显示了实例和引用
图7-7 实例和引用

如果一个子设计在不止一个地方被用到,你必须手动描述他或者为每一个实例创建一个设计的副本并且描述每一个。参考“characterizing Multiple Instance”。
characterize命令的限制
characterize命令提供了很多有用的功能,但是不要总是依赖该命令来推断层次化设计中子设计的约束。在你描述一个设计前,记住以下限制:
 characterize命令不会推断时序预算。(它反映了设计的当前状态。)
 忽略层次边界的clock_skew和max_time_borrow属性(一般来说这不是问题,因为这些属性一般是时钟和单元的)。
在不带选项时,characterize命令会用从父设计推断出的信息来替换子设计端口的信号信息(负载,端口驱动,输入和输出延时,最大和最小路径延时,和端口负载)。
当顶层设计有反标信息(负载,阻抗或者延)时,characterize命令会将其识别出来,并将这些数据向下移动到子设计以为后续的优化做准备。
保存属性和约束
characterize命令捕获子设计的时序信息。使用write_script命令配合着characterize来保存当前设计的属性和约束。默认情况下,write_script命令将dc_shell命令写入到标准输出。你可以使用重定向操作符(>)来将该命令的输出重定向到磁盘文件。
characterize命令计算
本章节描述了characterize命令如何推断特定负载和端口的时序值。
characterize命令使用一些值,这些值允许特征化设计的输出端口的定时数和打平设计然后定时的值一样。
后面“Load Caculations”和“Input Delay Calculation”章节使用层次化设计例子(图7-8)描述了characterize命令使用的负载和输入延时计算。
图7-8 层次化设计例子

负载计算
图7-9为图7-8显示的例子提供了线负载和输入pin电容值。
图7-9 带反标负载的层次化设计

在图7-9中,a到f是计算中使用的线段。该例子假设使用段线负载模型,该模型会考虑块互联线网负载,并为线负载使用线性函数。
 层次的B块的P引脚的外部负载计算如下

 每个段负载的计算如下

 输入端IN1到块A的外部负载计算使用0驱动pin,段a散出有1个,而且顶层线负载的每个散出有5个负载。
计算如下

 块A的输出端的外部负载计算如下

对于计算中的每一段,本地线负载模型由于计算负载。也就是说,块A的输出pin的计算使用顶层的线负载5的负载作为段C的散出,并且块B的线负载2的负载作为段d的散出。
 块B的输出端口的外部负载计算如下

 块B的输入pin X的外部负q载的计算如下

 输入pin Y的外部负载计算如下

图7-10 是在图7-8上的修改,其中标注了外部负载。
图7-10 特征化后的负载

输入延时计算
因为特征化提供了外部负载的精确细节,输入信号的路径延只反映了通过驱动该端口的最后一个门的固有的延时。输入信号的路径延时不包括门的负载延时或者线网的连接延时。
例如,块B的输入pin的特征化输入延时从驱动该特征化端口的pin延时计算出,不包含门负载延时或者线网连接延时。
特征化块B的时序计算如图7-11所示。
图7-11 显示了默认驱动能力和块A和信号IN1的固有延时。
图7-11 带反标的设计的时序计算

输入Pin X的延时计算如下

特征化子设计端口信号接口
不带选项的characterize命令用从父设计推断出的信号来替换子设计的端口信号信息(时钟,端口驱动,输入和输出延时,最大和最小路径延时,和端口负载)。子设计也会继承操作条件和来自顶层设计的时序范围。
你可以通过使用下面的命令来手动的设置端口信号信息:

characterize命令设置线负载模型选择组合子设计的模型。子设计继承了顶层的线负载模式。子设计的线负载模型有下面决定:
 如果顶层的模式是top,那么子设计会继承顶层的线负载模式。除非指定了实例的特定模式或者选择组。实例特定的模式和选择组设置的优先级高于设计层级设置。
 如果顶层模式是enclosed或者segmented,线负载模型是基于如下:
 如果低层模块没有定义线负载模型而且线负载无法被面积决定,会使用顶层设计的线负载模型。
 如果低层模块没有定义线负载模型而且线负载可以被面积决定,会在编译时基于单元面积重选择线负载模型。
组合设计例子
图7-2 显示了组合设计顶层的子设计块。自动或者手动的设置端口接口属性。
 脚本1使用characterize来自动设置属性。
 脚本2手动的设置属性。
图7-2 特征化驱动,时序和负载值-----组合设计

在脚本2中,
第二行捕获驱动单元信息。
第三行设置将线网n2的到达时间设置为3.3。
第四行将U3的负载设置为1.3。
第五行设置继承的set_max_delay,其值为10 – 0.8(每个反相器的延时为0.4)。
时序设计例子
图7-12 显示了时序设计顶层的子设计块。手动或自动地设置端口接口信息。
 脚本1,手动的设置信息。
 输入延时(从ff1/CP到u5/in1)为1.8
 输出延时(经过u4加上ff2的建立时间)是1.2
 Out1线网的外部负载是0.85
 脚本2使用characterize命令自动的设置信息。
图7-13 特征化时序设计驱动,时序和负载值

特征化子设计约束
characterize –constraints命令使用从父设计推断出的值来替换子设计的max_area,max_fanout,max_capacitance,和max_transition属性。
特征化子设计逻辑端口连接
characterize –connection命令使用从父设计推断出的连接属性来替代子设计的端口连接属性。
连接属性是由命令set_euqal,set_opposite,set_logic_one,set_logic_zero和set_unconnected设置的。
例子
图7-14 显示了设计顶层的子设计块。手动或自动地设置逻辑端口连接。
脚本1手动地设置属性
脚本2使用characterize –no_timing –connection来自动地设置属性。-no_timing选项禁止计算端口时序信息。
图7-14 特征化端口连接属性

特征化多个实例
characterize命令在每次调用时为每个子设计的实例总结边界条件。如果一个子设计被多次使用,在为每个实例characterize命令前用uniquify命令来让每个实例都是独立的。
uniquify命令创建子设计的副本,这些子设计会被多次引用。然后它会重命名这些副本并更新其对应的单元引用。更多关于uniquify命令的信息,请参考该命令的man page。
例子
图7-15 显示了如果对子设计块使用uniquify和characterize,这些子设计在但愿你U1和U2中被引用。
图7-15 多次特征化子设计引用

特征化带时序例外的设计
当跨越层次的路径包含了不同的时序例外,characterize命令创建虚拟时钟时序约束来捕获这些信息。
可能的时序例外包括set_multicycle_path,set_false_path,set_max_delay和set_min_delay。虚拟时钟方案也可以处理多时钟。
图7-6 显示了采样设计,在该设计中的从ALARM输入端口到U3的HOURS_OUT_reg*路径被约束成两周期路径。例7-1显示了U0块的未压缩的characterize –verbose结果的部分。
图7-16 U0块的characterize –verbose结果

在层次中向上传播约束
如果你有层次化设计并编译子设计,然后向上移动向更高层级的块(由下而上编译),你可以从低层级的.ddc文件向当前设计传播时钟,时序例外和禁止时间参数,通过使用propagate_constraints命令可以完成这种传播。
更多信息,请参考propagate_constraint的man page。
线上传播约束的方法
使用propagate_constraints命令可以从低层级向当前设计传递约束。如果你不适用该命令,你可以从更高层级的设计向当前实例传播约束,但是无法将设置在低层级模块的约束向例化其自身的高层级模块传播。
注意:
使用propagate_constraints命令可能会导致内存使用增加。
例7-2 显示了向上传递约束的方法。假设A是顶层,B是低层次的设计。

为了生成所有向上传播的约束,可以使用-verbose和-dont_apply选择并将输出冲顶先到文件:

使用-write –format ddc命令来保存带传播的约束的ddc文件,所以没有必要在重启一个新的dc_shell会话时再次进行传播。
处理设计间的冲突
下面显示了如果低层次设计和高层次设计冲突时会发生什么。
时钟名字冲突
低层级时钟的名字和当前设计(或者其他模块)的时钟一样。
时钟不会传递,并触发一个警告。
时钟源冲突
一个低层级块的时钟源已经定义为一个高层级块的时钟源。
低层级的时钟不会传递,并触发一个警告。
到非扩散时钟或来自非扩散时钟的例外
这可能是虚拟时钟或者是因为一个冲突无法扩散自该块的时钟。
例外
一个低层级的例外会覆盖定义在相同路劲上的高层级的列外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值