组合逻辑环(Combinational Loop)

(该笔记参考于微信公众号:陌上风骑驴看IC https://mp.weixin.qq.com/s/wCHWbJtb2AOZS4Ty3u9v0Q,该笔记仅为了便于自己查阅。)

  1. 什么是Combinational loop?
    Combinational loop: A combinational feedback loop is a path that can be traced through combinational logic - back to the starting point.
    组合逻辑环:起始于某个组合逻辑单元经过一串组合逻辑又回到起始组合逻辑单元的逻辑环路,称为组合逻辑环。
    在这里插入图片描述

  2. 常见的Combinational loop
    跟Latch 一样,Combinational loop 如果不是用于特别用途,通常是不应该出现在代码中的,所有不预期的Combination loop 都要当做bug 处理,需清除,除此之外常见的Combinational loop 有:
    伪随机数生成器,由奇数个反相器组成的回环;
    DFT Bypass 逻辑,在DFT 模式有组合逻辑环;

  3. 综合工具遇到Combinational loop
    默认,综合工具都会对RTL 代码做QA 检查,当发现代码里有不期望的东西存在时就会报警,比 如遇到Latch 会报警,遇到位宽不一致会报警,遇到未定义的module 会报警,遇到Combinational loop 同样会报警,在Genus(Cadence综合工具) 中,如果RTL 中有Combinational loop 工具会在elaborate 的时候报TIM-20 的警告:
    在这里插入图片描述
    本质上,Combinational loop 是timing 问题,会导致某些path 分析不到,所以不论是综合跟P&R 还是STA 都需要把Combination loop 打断。通常有以下两种方式来处理Combination loop:

  • 交给工具处理,需要额外的分析时间,而且不一定可以得到期望的『断点』。
  • 用户通过命令设置,老驴推荐这种方式,如果Combination loop 不是设计意图,请及早修掉,如果是设计意图,请在期望的点上用对应命令将其打断。

Genus 命令 check_timing_intent 检查SDC QA 时,会检查代码中的Combination loop. 如果代码中有Combination loop 且SDC 中没有对应的命令 “set_disable_timing” 将其打断,则:
如果在syn_gen 之前执行report_timing , 那工具会自动插入 cdn_loop_breaker;
如果在syn_gen 之前未执行report_timing, 那工具会在syn_gen 过程中插入cdn_loop_breaker.
所谓的cdn_loop_breaker 是工具从库中选择的一个buffer, 并且disable 了对应cell input pin 到output pin 的timing arc.

处理起来看似很简单,但是如果电路本身比较复杂,让工具自己分析去打断Combinational loop 有时候是不经济的有时候是不科学的有时候是不可行的,如下一个简单的电路:

  • 有多个点可以插入loop breaker 将loop 打断,但是哪种选择是Designer 期望的?是所谓『经济』的?对于工具而言没有足够的输入信息无法做出经济的抉择; 在任何一个点插入loop breaker 将loop

  • 打断都会导致某条真正的timing path 断掉,哪条path 是可以被抛弃的『子儿』,如何选择才合理公平科学?

  • 对于更复杂的电路,工具分析了许久,就是找不到可以插入的点,于是工具会像个傻子一样在原地爱的魔力转圈圈。
    在这里插入图片描述
    因此:不论电路复杂简单,所有意图之内的Combinational loop 请用set_disable_timing 打断,所有意图之外的Combinational loop 请修掉。

Combinational loop 是常规设计必须要规避的电路结构,如果不得不有,若交给工具,因为每个工具的算法不同,得到的结果会有差异,所以最好由硅农用命令设掉。Combinational loop 除对综合,形式验证,布局布线,静态时序分析有影响之外,对DFT 同样有影响。

猜你喜欢

转载自blog.csdn.net/weixin_43755290/article/details/104656467