新年第一盘干货走起,本文涵盖如下内容:
什么是Combinational loop
在数字集成电路中有许多许多的专有名词,特别难用一个汉语词或一段汉语句子清晰表述,有时候直接引用英文并不是为了装逼也不是偷懒,只是为了不曲解。对Combinational loop 的定义:
常见的Combinational loop
跟Latch 一样,Combinational loop 如果不是用于特别用途,通常是不应该出现在代码中的,所有不预期的Combination loop 都要当做bug 处理,需清除,除此之外常见的Combinational loop 有:
Genus 如何处理Combinational loop
默认,综合工具都会对RTL 代码做QA 检查,当发现代码里有不期望的东西存在时就会报警,比如遇到Latch 会报警,遇到位宽不一致会报警,遇到未定义的module 会报警,遇到Combinational loop 同样会报警,在Genus 中,如果RTL 中有Combinational loop 工具会在elaborate 的时候报TIM-20 的警告:
本质上,Combinational loop 是timing 问题,会导致某些path 分析不到,所以不论是综合跟P&R 还是STA 都需要把Combination loop 打断。通常有以下两种方式来处理Combination loop:
Genus 命令 check_timing_intent 检查SDC QA 时,会检查代码中的Combination loop. 如果代码中有Combination loop 且SDC 中没有对应的命令 "set_disable_timing" 将其打断,则:
所谓的cdn_loop_breaker 是工具从库中选择的一个buffer, 并且disable 了对应cell input pin 到output pin 的timing arc.
处理起来看似很简单,但是如果电路本身比较复杂,让工具自己分析去打断Combinational loop 有时候是不经济的有时候是不科学的有时候是不可行的,如下一个简单的电路:
忠告:不论电路复杂简单,所有意图之内的Combinational loop 请用set_disable_timing 打断,所有意图之外的Combinational loop 请修掉。
LEC 如何处理Combinational loop
Combinational loop 在LEC 中是不允许存在的,LEC 会在modling 的时候插入CUTPOINT 打断Combinational loop, CUTPOINT 属于keypoints. LEC 插入CUTPOINT 的过程:
可以通过如下命令来report modeling 的具体过程:
report message -modeling –verbose
通常,如果Golden 跟Revised 有相同或极类似的Combinational loop, 工具可以会找到对应的位置插入CUTPOIN, 那么都不会有什么问题。但真实case 总会有一些特别情况,如优化之后Revised 中Combinational loop pin/net 的名字完全改变,数量也有变化;如Combinational loop 跨了逻辑层;对于这些复杂情况,首先需要依靠工具内嵌算法去做分析,如可以加一些modeling 选项,打开某些更复杂的算法去分析:
set flatten model -cut_remove_redundant
set flatten model -cut_place_algo 1
也可以让工具给出更多信息:
set flatten model -cut_show_net
也可以让工具进一步分析cut point, 如果设置了set_analyze_option -auto, LEC 会自动分析cut point, 对于复杂设计这一步可能需要较长时间:
analyze setup -cut
经过如上分析之后,如果还有由CUTPOIN 引起的不等,则需要进一步分析处理,可以用如下命令分别报出工具已经插入的CUTPOIN, 设计中所有的Combinational loop 及其在代码中对应的位置:
report gate -type cut
REPort PAth -feedback
report path -feedback -source
忠告:不论电路复杂简单,所有意图之内的Combinational loop 请用add cut point 打断,所有意图之外的Combinational loop 请修掉,否则不仅可能导致LEC 不等,还可能导致runtime 过长。
Innovus/Tempus 如何处理Combinational loop?
默认,Innovus 跟Tempus 见到Combinational loop 同样会报警会,并且自动将其打断。
CTE_loops.rpt 中有如下信息:
可用check_timing 报出设计中所有的Combinational loop:
如上所述,工具自动打断Combinational loop 有可能将其它需要check 的timing path 也打断,在Innovus 跟Tempus 中可以设置如下变量,使能工具更先进的算法,在打断Combinational loop 的时候尽量不打断需要check 的timing path.
timing_dynamic_loop_breaking
忠告:不论电路复杂简单,所有意图之内的Combinational loop 请用set_disable_timing 打断,所有意图之外的Combinational loop 请修掉.
写在最后,Combinational loop 是常规设计必须要规避的电路结构,如果不得不有,若交给工具,因为每个工具的算法不同,得到的结果会有差异,所以最好由硅农用命令设掉。Combinational loop 除对综合,形式验证,布局布线,静态时序分析有影响之外,对DFT 同样有影响,此处引用一段原话:
Feedbacks may cause oscillations, races or memory-like behavior in logic, which complicates the test generation process, this may cause:
驴说IC