数字逻辑综合 DC 相关理解(三)


  • 博客中很多内容都来自《专用集成电路设计实用教程》,有空可以细读一下,加上实践。

1. DC 编译策略及工具版本

  • 编译策略
    • 两种:top-down,bottom-up;
    • top-down
      • 顶层设计和子设计在一起编译;所有的环境和约束设置针对顶层设计;此种策略自动考虑到相关的内部设计。
      • 但是此种策略不适合大型设计;因为设计必须同时驻内存;硬件资源耗费大。
    • bottom-up
      • 子设计单独约束;当子设计成功编译后;被设置为 dont_touch 属性;防止在之后的编译过程中被修改;
      • 所有同层子设计编译完成后;再编译之上的父设计;直至顶层设计编译完成。
      • Bottom-up 策略允许大规模设计;因为该策略不需要所有设计同时驻入内存。
  • DC工具版本
    • 根据支持的功能特性的多少,有如下排序:DC NXT > DC Graphical > DC Ultra > DC Expert。

2. DC 中的优化

  • 设计中常常会出现多次例化的情况,我们可以使用指令uniquify为设计中每一个复制的模块产生一个唯一名字的拷贝,这样DC就可以根据每个模块本身特有的环境做优化和映射。
  • 电路的综合优化主要包括三个阶段,如下图所示。
    • 结构级优化
    • 逻辑级优化
    • 门级优化

2.1 结构级优化

  • 设计结构选择

    • 在DesignWare中选择最合适的结构或算法实现电路的功能。
  • 数据通路的优化

    • 选择CSA等算法优化数据通路的设计。
  • 共享共同子表达式

    • 提取可以共同使用的子表达式,减小资源消耗。
      // 优化前
      f0 = a + b + c
      f1 = a + b + d
      // 优化后
      tmp = a + b
      f0 = tmp + c
      f1 = tmp + d
      
  • 重新排序运算符号

    • 以获得更少的资源和更小的延迟。
    • 由于编译器解析表达式存在一定优先级,如果重排序加括号确定优先级,就可以实现一定的并行度,减小延时。
  • 资源共享:

    • 对于算数运算的资源共享,默认策略是约束驱动的。
    • 示例如下图所示:DC会将(a)中的电路转化为(b)中的电路。
    • 我们可以使用指令让DC使用面积优化策略,共享资源。如下面指令修改变量:
      set hlo_resource_allocation area
      
    • 如果不希望DC综合时进行资源共享优化,可以将上面的变量设置为none,但是如果想要类似优化,只能在RTL编码时处理了。

2.2 逻辑级优化

  • 做完2.1的结构级优化后,电路的功能以GTECH的器件表示。

  • 结构优化

    • 共用子表达式减少逻辑,是DC默认的逻辑级优化策略。
    • 结构优化过程中,可能会在电路中加入中间变量和逻辑结构。
      // 优化前
      f0 = ab + ac
      f1 = b + c + d
      f2 = b'c'e
      // 优化后
      f0 = at0
      f1 = t0 + d
      f2 = t0'e
      t0 = b + c
      
    • 注意:在2.1节也介绍了共用子表达式的设计,但是两者不同。2.1节是算数电路级的子表达式;而2.2节是门级电路的共用子表达式。
    • 使用下面指令设置结构优化
      set_structure true
      
  • 展平优化

    • 将多级的组合逻辑电路减少为两级,都变为先与后或的电路。如下图所示。
    • 主要用作速度的优化,电路面积可能会增大。
    • 与约束无关,可以使用下面指令设置展平优化。
      set_flatten true -effort low | medium | high
      

2.3 门级优化

  • 门级优化时,DC开始映射,实现门级电路。映射过程中的优化主要包括4个阶段:

    • 延迟优化
    • 设计规则修整
    • 以时序为代价的设计规则修整
    • 面积优化
  • 映射考虑组合逻辑和时序逻辑

    • 对于组合逻辑的映射,主要选择能够满足时间和面积的要求。
      • DC会对每个逻辑表达式进行多个变形,选择一个能够达到要求的逻辑表达式。
    • 对于时序逻辑的映射,选择的时序单元要求能够满足时间和面积的要求。
      • 有时,为例提高速度和面积,DC可能会选择比较复杂的时序单元。
  • 映射过程中,DC会检查电路是否满足DRC,如果有违例,DC会插入缓冲器以及修改单元的驱动能力。

    • DC会首先在不影响面积和速度的情况下,尝试修复所有的DRC违例;如果没有其它方法,那么DC会牺牲时间和面积为代价进行修复。
    • 在检查DRC时,可能出现一个寄存器驱动多个寄存器,导致扇出过大不满足DRC规则,DC会将作为驱动的寄存器复制多个,并将扇出进行分割。
      • 在 dc_shell -topo 模式下中可以使用下面指令,自动进行扇出分割的优化。
      compile_ultra -timing_high_effort_script
      

3. 优化策略

3.1 增量编辑

  • 使用增量编辑时,设计不会回到GTECH,不会进行结构级优化和逻辑级优化,但是DesignWare的实现可能会发生变化。

3.2 自定义路径组和关键范围

  • 这篇博客中有介绍修复setup违例,其中一种方法就是group_path。需要额外指定group_path是由DC优化策略所决定的。

  • DC默认的行为就是对关键路径进行优化,关键路径出现违例,而且没办法为关键路径找到一个更好的优化解决方案时,综合过程就停止。次关键路径也不会被优化,只是简单的完成映射而已。

  • 除了group_path外,还可以指定关键范围,举例如下,DC会对在相较于关键路径差2ns的范围内的所有路径作优化。

    set_critical_range 2 [current_design]
    
    • 解决次关键路径的时序问题可能也可以帮助关键路径的优化。
    • 但是如果由于对次关键路径的优化导致关键路径的时序变差,那么DC将不对次关键路径进行优化。
    • 建议关键范围的值不要超过关键路径延时总值的10%。
  • group_path + 关键范围

    • 使DC对更多的路径做优化。
      group_path - name CLK1 -critical_range 0.3
      
  • group_path & 关键范围

    • group_path:DC可能会牺牲一个路径组的时序,而让另一个路径组的路径时序有改善。所以可能加入一个路径组,导致时序最差的路径时序变得更差。
    • 关键范围:不允许因为改善次关键路径而导致关键路径时序变差。

3.3 模块划分

  • 由于DC在对整个电路做综合时,必须保留每个模块的端口,因此逻辑综合不能够跨越模块边界,相邻模块的组合逻辑也不能合并。可以使用group和ungroup命令重新进行模块划分。

  • 举例如下,A到C之间的组合逻辑有些长,第一张图由于划分为三个模块,而DC工具没办法去跨模块进行优化。

    • 如果A、B、C之间没有层次的分隔,那么综合工具对组合逻辑的优化技术可以充分的使用。如第二张图所示。
      • 对于寄存器和组合逻辑顺序的划分可以选择 组合逻辑在寄存器前 或相反。
      • 但若将组合逻辑放在寄存器前,可以对时序电路有更好的优化效果。
      • 因为,工具在对时序电路进行优化时,可以选择一个更为复杂的触发器(JK\T\Muxed\Clock-enabled等),将一部分的组合逻辑电路吸收到触发器中,从而使电路的面积更小。
  • 模块划分时,尽量不要使用胶合逻辑,可以如下图所示。

    • 胶合逻辑是模块到模块之间的组合逻辑,由于其不能被其他模块吸收,优化受到了限制。我们可以将胶合逻辑加到某一个模块的组合逻辑中,解决这个问题。
  • 对于模块的划分,我们可以在RTL级进行修改,也可以在DC层进行修改。

    • DC修改方式

      • 自动修改划分
        # 选择优化延时/面积,更详细的可以参考《DC Synthesis Variables and Attributes Version》
        compile -auto_ungroup area|delay
        # 也可以直接使用指令,该指令在综合时自动取消所有模块分区和层次结构。
        compile -ungroup_all
        
      • 手动修改划分
        • 使用group可以产生新的层次模块。

          group -design_name NEW_DES -cell_name U23 {U2 U3}
          
        • 使用ungroup取消一个或所有模块分区。

          ungroup -start_level 2 U23
          
    • 如果所有结构完全展开,那么会导致形式验证、ECO、后仿调试,会大大加大难度。所以,一般建议只flatten跨模块的大组合逻辑。

posted @ 2023-06-26 22:46  可达达鸭  阅读(344)  评论(0编辑  收藏  举报