翻译_怎样优化面积和时序_2
Rober B. Wiegand
系列目录
5.0 重新审视MIN/MAX方法论
要实现对传统综合方法的显著面积改进,需要一种方法论,该方法论解决了前面列出的关键问题。
在SNUG99 San Jose的论文“使用MIN/MAX编译在多通道综合流程中”中有详细描述这样一种方法论。这种方法论使用characterize来在三次自下而上的编译通道之间细化约束。
在DC2000的ACS中实现了一种类似的多通道方法,它使用时间预算代替characterize,使用的命令是acs_compile_design、acs_recompile_design和acs_refine_design。
正如MIN/MAX论文中所描述的,首先使用合理的默认约束、设计规则的余量以及取消编译生成的层次结构,自下而上地编译较低级别的模块。
然后在核心级别应用准确和详细的约束和异常,并将这些约束characterize到所有较低级别的模块上。
接下来,再次自下而上地使用来自顶层的并行characterize约束编译较低级别的模块。再进行一次从核心开始的characterize,紧接着是第三次自下而上的增量模块编译。
然后,在核心级别使用insert_scan进行扫描触发器的缝合,接着进行核心级别使用min/max条件的自上而下的增量编译,以修复设置、保持和设计规则违规问题。这些程序可以应用于多个核心。
接下来,编译时钟和pads blocks,然后进行顶级网表组装、顶层扫描缝合,以及使用min/max条件进行最终的布局前优化,以修复任何剩余的设置、保持和设计规则违规问题。
如果需要,最后进行布局后的优化,再次使用min/max条件。流程在图1中进行了总结。
图1展示了原始的MIN/MAX流程,包括以下几个步骤:
- 第一次自下而上的模块编译
- 自上而下的并行characterize
- 第二次自下而上的模块编译
- 自上而下的并行characterize
- 第三次自下而上的增量模块编译
- 核心级别MIN/MAX优化
- 编译垫块和时钟块
- 顶级网表组装
- 布局前网表MIN/MAX优化
- 布局后网表MIN/MAX优化
5.1 利用“乒乓效应”
正如在MIN/MAX论文中详细解释的,这种方法论利用了characterize的“乒乓效应”来在每次迭代中细化约束,逐渐逼近核心级别的时序要求。由于并行characterize会将路径的总时差(无论是正值还是负值)分配给该路径中的每个模块,我们可以通过图2所示的两个模块的路径来简单示例说明这一效应。
图2. 使用Characterize的乒乓效应
a) 第一次编译,使用默认约束
b) 第二次编译,使用并行characterized约束
c) 第三次增量编译,使用并行characterized约束
- 10纳秒为所需路径延迟
- 路径1和2的4纳秒和6纳秒分别表示在不同编译阶段的时序余量
- TPS = 总正时差余量 (Total Positive Slack)
- TNS = 总负时差余量 (Total Negative Slack)
在第一次编译后,路径1有2纳秒的正时差余量。随后进行并行characterize和第二次RTL编译,路径1现在显示为2纳秒的负时差余量。放宽的约束条件允许了较慢的设计组件实现,以时序的牺牲换取了面积的节省。
再经过一次并行characterize和增量编译,我们假设约束条件被精确满足,可以重新获得正时差余量。由于在增量编译前的设计组件未被分组,增量实现选择(IIS)被禁用,允许较小的实现保持不变。
路径2在第一次编译后开始有2纳秒的负时差余量。经过并行characterize和第二次RTL编译,路径2现在显示为2纳秒的正时差余量。更紧的约束条件导致了更快的设计组件实现,以面积的增加换取了时序的改善。再进行第二次并行characterize和第三次增量编译,我们可能期望回到负时差余量。然而,由于第二遍通道中更快的设计组件实现未被分组,时序的改善得以保持。在这种情况下,为了满足时序要求,不得不牺牲面积。
5.2 近期改进
尽管这种方法论的大部分内容仍然有效,但最近的工具改进已经允许一些变化和改进的实施。
最初,布局前优化是使用带有一整compile_
的变量代替compile_
执行的。现在,这一步骤是使用compile_top
来执行的。MIN/MAX过度悲观的问题已经在Design Compiler中被悄悄解决了(我相信是从1999.05版本开始,但肯定是在1999.10-6版本中),消除了隐藏变量解决方法以及所有严格多重操作条件时序报告的需求。MIN/MAX论文详细描述了布局后优化,无论是否使用Floorplan Manager。在使用COT环境中的时序驱动布局工具的情况下,这一步的需求被消除了,尽管Floorplan Manager(现在是DC Ultra的一部分)仍然可以用于自定义线负载生成。取而代之的,是Design Compiler或PrimeTime约束的准确转换,用于时序驱动的放置和路由。
现在,由于时序驱动的放置在给定不良约束时可能会像综合一样或更甚于综合造成损害,因此对高度准确和详细的全芯片约束的需求变得更加关键。
使用MIN/MAX方法论,前两次编译通道是使用中等编译和面积努力进行的,而第三次通道是使用max_area 0约束的高努力增量编译。这种方法特别有利于面积,因为max_area 0约束是以分而治之的方式应用的,在它可以产生更大影响的地方,而高努力是在时序和约束接近收敛时以增量方式应用的。核心级别优化是再次使用高努力增量编译进行的,但是使用中等面积努力,因为面积已经在自下而上的编译中被推动了。面积约束,等于第三次通道核心面积结果,允许设计规则和保持时间基本上免费地被修复,而不影响面积。最后,使用compile_top在没有面积约束的情况下对全芯片进行优化,以修复剩余的顶层问题,而不影响运行时间。
6.0 细节问题
一旦有了合适的方法论和标准化的脚本集,就可以构建一些精细调整的细节。以下是一些关于实现最佳面积和时序结果的细节和建议。
6.1 hlo_resource_implementation = constraint_driven
在1999.05版本的Design Compiler中,这个变量的默认值被更改为use_fastest。这个新默认值会强制使用更多占用面积的设计组件实现,无论是否需要。在单通道方法论中,这可能使时序收敛更容易实现,但代价是增加了面积。原来的默认值constraint_driven允许综合选择仍然满足时序要求的最小实现。这种方法对面积更友好,但在多通道流程中效果最佳。
6.2 hdlin_use_cin = true
设置这个隐藏变量允许使用加法器的进位输入来实现a+b+1,而不是使用单独的加法器和递增器,从而带来相当大的面积优势。
6.3 hdlin_don’t_infer_mux_for_resource_sharing = false
这个设置与hdlin_infer_mux = default一起工作,以确保当使用infer_mux指令时,MUX总是会被推断出来,前提是hdlin_mux_size_limit变量为设计设置了足够高的值。这将防止当合成操作符驱动case语句的多个分支时发生资源共享,但如果使用了infer_mux指令,这被认为是意图。
6.4 hdlin_mux_size_limit = 256
这个变量与RTL中的infer_mux指令一起工作,在综合中产生MUX操作符。根据您的设计中推断出的MUX的大小,默认值32可能不够。如果发生这种情况,MUX仍然不会被综合。为您的设计选择一个合适的二进制值。
6.5 auto_wire_load_selection = false
尽管自动线负载选择很方便,但在编译过程中,当门计数超过选定的线负载,并且选择了下一个更高的线负载时,可能会发生问题。在这一点上,负时差的突然跳跃会发生,为了克服增加的延迟而消耗面积。相反,使用封闭模式按设计层次指定线负载(尽可能使用自定义生成的线负载)。封闭模式的线负载更准确地模拟了时序驱动放置的结果,而不会过度构建设计并消耗额外的面积。
6.6 Critical Range and Weighting
如果不使用关键范围,综合将恢复到默认的关键范围为零,这会导致综合一次只处理最关键路径。
如果一个错误的约束导致无法修复的时序违规,综合将放弃,甚至不会看其他违反较少的路径,即使它们可以很容易地被修复。这会导致时序收敛问题,从而导致面积消耗。
通过使用关键范围,可以同时查看更多违反的路径,有效地加宽“打地鼠”的棒子,减少任何时序收敛问题。如果编译后最差的负时差小于关键范围,那么所有路径都已优化。
当存在多个时钟和不同的频率时,根据设计,最快的时钟成为设计的速度限制。综合自动按时钟域创建路径组,但给予它们相等的权重,这导致综合在所有时钟域中平等地处理最差负时差的量级。
如果所有时钟域都是异步或彼此独立的,这是期望的行为。
如果有分割的时钟,例如除以二,并且同时使用原始和分割的时钟,较慢的时钟实际上可以容忍是较快的一个两倍的负时差,然后它成为设计的速度限制。通过在时钟声明后使用weight选项手动创建路径组,如下所示:
group_path –name [clock name] –critical_range [value] –weight [value, 默认值为1],
可以通过时钟域按比例分配负时差分配,指导综合在每个时钟域中投入加权的努力。如果必须调整较快的时钟目标频率以满足上市时间(假设有大量的违规路径,并且实际上可以调整),负时差缩放可以用来防止不必要的面积消耗。
6.7 理想网络和扫描链重排序
除了时钟网络外,复位和扫描使能网络也应该在综合中被视为理想网络。
出于与时钟树综合(CTS)保留给布局的相同原因,复位和扫描使能也应该保留给布局。
这大大减少了布线拥塞,有助于改善时序,并允许更积极地调整芯片尺寸以利用综合中减少的面积。
扫描链重排序也应该在布局中进行,以进一步减少布线拥塞,以及大大减少这些网络的设计规则缓冲。减少扫描路径上的线长和电容也将有助于功能路径上的时序(因为每个触发器同时驱动功能路径和扫描路径),以及降低设计的功耗。
6.8 处理特征化写脚本文件
当在包含其他标有“不应触碰”(dont_touch)属性的设计时,执行特征化操作后,生成的写脚本约束文件会将“不应触碰”属性设置在实例上,而不是设计本身。
为了能够顺利进行核心级别的扫描插入和优化,以及顶层优化,必须去除这些“不应触碰”属性。使用以下结构去除设计上的“不应触碰”属性比从实例中去除更为直接:
foreach (des, find(design)) {
current_design des
remove_attribute current_design dont_touch
}
current_design [original design]`。
要纠正写脚本中的问题,需要进行一些简单的后处理。一个简单的命令可以完成这项工作。
grep -v 'set_dont_touch ' filename > newfilename
mv newfilename filename
在命令中,引号前的空格是有意为之,以确保所有 set_dont_touch_network
命令保持不变。任何故意设置的单元格上的“不应触碰”属性可以通过在下一次编译时包含一个修订过的脚本文件来恢复。
6.9 核心级扫描链缝合与优化
完成多通道自下而上的编译后,可以开始核心级扫描链的缝合与优化工作。
使用预优化的核心区域作为面积约束,可以几乎不消耗额外面积地进行扫描链缝合、设计规则和时序优化,以及必要时的保持时间修复。
首先,使用insert_scan运行扫描链缝合,不进行设计规则或时序优化,然后进行增量编译,编译时使用高映射努力和中等面积努力(为了节省运行时间,因为高面积努力已经应用于较低级别的模块)。
为了获得略微额外的面积改进(取决于设计),在扫描链缝合和增量编译步骤之间运行reduce_constants。此外,仅在核心级优化时设置以下变量:compile_sequential_area_recovery = true
。
最后,如果可用,可以在增量编译期间使用DC Ultra优化功能,以进一步改进时序和面积,但这在较低级别模块的最终高努力增量编译中对面积的影响更大。
6.10 预布局网表创建与优化
正如MIN/MAX方法论中所讨论的,首先编译时钟和pads block,然后进行全芯片网表组装。
任何出现在pads block或顶层的逻辑都应按照选择性取消分组部分中讨论的方式进行处理。
一旦网表组装完成,就执行顶层扫描链缝合。缝合可以手动使用脚本化的create_net和connect_net命令执行,或者使用insert_scan设置为仅路由串行,不进行任何设计规则或时序优化。
最终的预布局网表优化是使用compile_top执行的,其中compile_top_all_paths设置为true。
为了修复保持时间违规,在这个过程中使用MIN/MAX条件执行set_fix_hold all_clocks(),并在编译中添加——prioritize_min_paths开关(至少在1999.10-6版本的Design Compiler中仍然有效,如果他们破坏了这个,可能需要DC Ultra许可证来设置成本优先级以确保保持时间得到修复)。
6.11 预布局保持时间修复
本文中提到的预布局保持时间修复一直是一个备受争议的话题,实施前需要非常谨慎的考虑。
其目的是提前解决已知的保持时间场景,以避免或减少后期布局中可能出现的保持时间问题,这些问题可能会干扰布局,影响时序收敛、上市时间和面积。如果不进行非常仔细的分析和准备,预布局保持时间修复可能会带来灾难性的结果,插入数万个缓冲器。
准确预测时钟树插入延迟和偏斜,以及对设计的准确约束至关重要。在像复位和扫描使能这样的理想网络上不应该有保持时间修复,以及芯片的静态和异步输入上也不应该有。
这可以通过以下方式取消约束最小路径来避免:
Set_input_delay –max [value] –clock [clock_name] [input_name]
Remove_input_delay –min [input_name]
对于核心级专用扫描链输入端口,在用insert_scan路由扫描链但优化和修复保持时间之前,使用以下命令:
Set_false_path –hold –from [scan input ports, usually test_si*]
在异步时钟域之间,不应该有保持时间修复。使用以下命令取消这些最小路径的约束:
Set_false_path –hold –from asynchronous_clock1 –to asynchronous_clock2
在单个时钟域内,可接受的偏斜必须足够紧,以最小化该域内的保持问题,特别是在触发器的扫描输入上。
具有负保持时间的库在这里有很大的优势,允许更高的偏斜值。剩余的可能性包括芯片输入到捕获寄存器,如果适用的话,寄存器到芯片输出,以及具有不同插入延迟的同步时钟域之间的路径。
插入延迟差异可能源于分割时钟的独立树、门控和非门控时钟,以及有意的早期和晚期时钟。这些是即使在布局之后也几乎肯定会有保持问题的地方。
通过提前解决这些问题,可以大大减少后期布局中的保持时间修复。使用时序驱动的放置,预布局保持时间修复可能在过程中被优化掉,但所需的真实修复所需的门已经考虑在内,避免了最后一刻的意外。
7.0 结论和未来工作
通过将多种因素整合到一个对面积友好的方法论中,时序收敛和面积缩减可以成为并行的目标。
然而,重要的是要记住,面积仍然是与时序收敛和上市时间三者之间的权衡。
这里提出的方法和细节尝试在这些因素之间找到平衡,在某些情况下,可能仍然有进一步改进面积的空间。面对好、快、便宜之间的选择时,我们应该能够使用这些方法接近三者兼顾,同时享受减小面积带来的好处。
未来改进面积的可能性包括在Design Compiler中使用MC(模块编译器)结合Designware Foundation、DC Ultra和Design Compiler 2005使用partition_dp代替transform_csa。
另一种可能性是使用Power Compiler RTL时钟门控,其中在寄存器组前的MUX被替换为基于锁存器的时钟门控单元,以实现时钟使能寄存器。
最后,使用Physical Compiler消除线负载模型的不准确性可能对面积产生积极影响。
通过在最终优化期间使用MIN/MAX条件下的physopt –area_recovery开关同时修复保持时间,应该能够实现最佳的时序和面积平衡。
8.0 References
- Akhil Bagri and Chanda Dani; “Getting the Most from Design Compiler for Area & Delay,” SNUG 2000 San Jose Tutorials.
- Tom Wilderotter and Jay Adams; “Synthesis 2000: Design Compiler,” SNUG 2000 Boston Tutorials.
- Wiegand, Robert; “Using MIN/MAX Compile In A Multi-pass Synthesis Flow,” SNUG 1999 San Jose Proceedings.
- Mohammad Mohsin; “Hierarchical Wire Load Estimation,” SNUG 1997 Proceedings.
- Design Compiler Reference Manual, Synopsys Online Documentation Version 1999.10.
- Design Compiler Reference Manual, Synopsys Online Documentation Version 2000.05.
- Jon Baldry; “A Compile Strategy Using Design Budgeting,” Design Budgeting Applications Note, Synopsys, Inc., October, 1998.
AI 总结
这篇文章《Have Your Cake And Eat It Too: How To Optimize For Area AND Timing》由Robert B. Wiegand撰写,主要探讨了在集成电路设计中如何同时实现面积优化和时序收敛的目标。文章指出,尽管这两个目标通常被视为相互矛盾,但通过一系列综合考虑和策略,可以在不牺牲时序性能的前提下减少芯片面积。以下是对整篇文章的总结:
-
引言:介绍了面积优化在ASIC设计中的重要性,以及如何在追求快速上市的同时不牺牲时序和面积。
-
尺寸的重要性:阐述了面积减少如何直接影响成本、减少布线拥塞、改善时序收敛,并提高可靠性、可测试性和产量。
-
解决担忧:讨论了如何在不负面影响时序收敛和时间表的情况下考虑面积优化,强调了标准化综合脚本和方法论的重要性。
-
关键方法论问题:提出了一系列影响面积优化的问题,包括计划压力、风险感知、编译策略等,并提出了相应的解决方案。
-
MIN/MAX方法论:详细介绍了一种多通道综合流程,使用characterize技术在多次编译过程中细化约束,以改善面积和时序。
-
细节问题:深入讨论了一系列具体的技术细节和建议,包括变量设置、MUX推断、线负载选择、关键路径范围和权重等。
-
结论和未来工作:总结了通过整合多种因素到面积友好的方法论中,可以实现时序收敛和面积缩减的并行目标,并提出了未来可能的改进方向。
-
参考文献:列出了用于撰写本文的参考资料和进一步阅读的建议。
文章的核心观点是,通过采用综合的策略和细致的方法论,可以在ASIC设计中实现面积和时序的双重优化,从而在成本、性能和上市时间之间找到一个平衡点。作者还强调了持续改进和适应新工具技术的重要性,以实现更高效的设计流程。