DC 综合学习笔记

项目中涉及到DC综合,以此记录关于DC综合的学习,零零散散的。

DC(design complier)是数字IC设计不可或缺的一步,前端和后端工程师都要懂。是Synopsys公司用于做电路综合的核心工具,可以将硬件描述语言(Verilog/HDL)的电路转换为基于工艺库的门级网表。

一·理论知识

DC综合分为3个阶段:

1.转换(translation)

使用gtech.b库中的RTL级单元,将电路转换成一个网表。

2.优化(optimozation)

综合工具对已有的中间网表根据工作频率、面积、功耗来对电路优化,来推断出满足设计指标要求的门级网表;

3.映射(mapping)

将门级网表映射到晶圆厂给定的工艺库上,最终形成该工艺库对应的门级网表。 

DC在综合过程中会把电路划分为以下8大处理对象(objects):

designs:待综合的对象(module);

cells:被例化的模块;

ports:design最外部的端口;

nets:模块间的连线

pins:例化模块的端口

clocks:时钟

reference:例化的原电路。

library:cell的集合。如target_library link_library

DC综合的流程: 

使用DC逻辑综合的流程大致可以分为以下几个部分:

  • 预综合过程(Pre-Synthesis Processes):在综合过程之前的一些为综合做准备的步骤:
    • DC启动;
    • 设置各种库文件:
      • link_library;
      • target_library;
      • symbol_library;
    • 创建启动脚本文件;
    • 读入设计文件;
      • analyze;
      • elaborate;
      • read_file;
    • DC中的设计对象;
    • 各种模块划分;
    • Verilog的编码。
  • 施加设计约束:
    • 设置环境约束:
      • set_operating_coditions;
      • set_wire_load;
      • set_drive;
      • set_driving_cell;
      • set_load;
      • set_fanout_load;
    • 设置时序约束:
      • 设计规则的约束:
        • set_max_transition;
        • set_max_fanout;
        • set_max_capacitance;
      • 优化的约束:
        • create_clock;
        • set_clock_skew;
        • set_input_delay;
        • set_output_delay;
        • set_max_area;
  • 设计综合;
  • 后综合。

 本次项目DC综合的设计层次和细节规整如下:

1.启动Design Compiler

dc_shell命令行

2.设置一些常量和路径

 3.链接库

set search_path " $search_path ../lib/db_lib"

set search_path " $search_path ../../rtl_all"

算术运算库,在初始化DC时,不需要设置标准的DesignWare库standard.sldb用于实现verilog描述的运算符,DC会把加法、乘法等运算综合成性能较差的电路。如果需要扩展DesignWare,需要在synthetic_library中设置,同时需要在link_library中设置相应的库以使得在链接的时候FC可以搜索到相应运算符的实现。

set synthetic_library {dw_foundation.sldb } ##花括号免去一切替换和计算

目标库,目标库是综合后电路网表要最终映射到的库。读入的HDL代码首先由Synopsys自带的GTECH库转成DC内部交换的格式,然后经过映射到目标库,最后生成优化的门级网表。目标库一般是db格式,由lib格式转化而来。目标库包含了各个门级单元的行为、引脚、面积、时序信息等,有的还包含了功耗方面的参数。DC在综合时就是根据目标库中给出的单元路径的延迟信息来计算路径的延时,并根据各个单元的延时、面积和驱动能力的不同选择合适的单元来优化电路。

set target_library "scc55nll_vhs_rvt_ss_v1p08_125c_basic.db" 

链接库是设置模块或单元电路的引用。对于所有DC可能用到的库,我们都需要在link_library中指定,也包括要用到的IP。在link_library的设置中必须包含“*”,表示DC在引用实例化模块或者单元电路时首先搜索已经调进DC memory的模块和单元电路。

set link_library "* scc55nll_vhs_rvt_ss_v1p08_125c_basic.db mem_1rw_1r_104x64_ss_1.08_125.db  mem_1rw_1r_64x256_ss_1.08_125.db mem_1rw_1r_52x64_ss_1.08_125.db mem_1rw_1r_56x256_ss_1.08_125.db mem_1rw_1r_112x256_ss_1.08_125.db mem_1rw_1r_64x64_ss_1.08_125.db mem_1rw_1r_test_112x256_ss_1.08_125.db mem_1rw_1r_112x64_ss_1.08_125.db $synthetic_library "

set compile_preserve_subdesign_interfaces true ##控制编译命令是否保留子设计接口。当此变量设置为 true 时,它将在编译期间禁用子设计外部逻辑的自定义,并保留子设计接口。设置为 false(默认值)时,compile 会根据子设计的内部逻辑自定义子设计外部的逻辑

set verilogout_no_tri true ##通过将三态(tri)逻辑声明成线网(wire)来确保网表中不会出现三态逻辑

set write_name_nets_same_as_ports true 

设置命名规则

define_name_rules sec_verilog -type port \

                              -equal_ports_nets \

                              -allowed "A-Z a-z 0-9 _ [ ]" \

                              -first_restricted "0-9 _" \

                              -last_restricted "_";

define_name_rules sec_verilog -type cell \

                              -allowed "A-Z a-z 0-9 _ \__" \

                              -first_restricted "0-9 _" \

                              -last_restricted "_" ;

define_name_rules sec_verilog -type net \

                              -equal_ports_nets \

                              -allowed "A-Z a-z 0-9 _ [ ]" \

                              -map {{"^N","n"}} \

                              -first_restricted "0-9 _" \

                              -last_restricted "_" ;

4.读取RTL

使用analyze和elaborate指令。

5.判断约束环境是否施加成功

在定义完环境属性之后,我们可以使用下面的命令检查约束是否施加成功:

  • check_time:检查设计是否有路径没有加入约束;
  • check_design:检查设计中是否有悬空脚或输出短接的情况;
  • write_script:将施加的约束和属性写出到一个文件夹中,可以检查这个文件看看是否正确。

6.施加约束

cons.scr设置约束 

 先施加DRC(Design Rule Constraint设计规则约束)

常用的DRC约束有以下三种:

  • set_max_transition:约束design中的信号、端口、net最大transition不能超过这个值,值越小越苛刻;那天的transition time取决于net的负载(fanout),负载越大,transition time越大;
  • set_max_fanout:对design、net、output port进行操作,设定的不是具体的电容值。扇出负载值是用来表示单元输入引脚相对负载的数目,它并不表示真正的电容负载,而是个无量纲的数字;
  • set_max_capacitance:基于工艺库的信息设定最大电容。

这三个约束由工艺厂商提供,但我们可以约束的更紧一些。

第一条和第三条在数字IC设计中必须约束,否则无法流片。

定义面积约束

de_shell-t> current_design PRGRM_CNT_TOP
dc_shell-t> set_max_area 100

上例中的100有三种定义:

  • 两输入与非门个数;
  • 晶体管个数;
  • 平方微米

 添加时钟和时序约束

dc_shell-t> create_clock -period 10 [get_port clk]
dc_shell-t> set_dont_touch_network [get_port clk]   //对所有定义的时钟网络设置为dont_touch,
                                                    //既综合的时候不对clk信号优化
                                                    //因为实际电路设计中时钟数综合有自己特别的方法,
                                                    //需要考虑实际布线后的物理信息。

定义输入延迟,例如:

dc_shell-t> set_input_delay -max 4 -clock clk [get_port A]
                //设置A端输入口满足建立时间的最大延迟为4

定义输入延迟,例如:

dc_shell-t> set_output_delay -max 5.4 -clock clk [get_port B]
                //设置B端输出口满足建立时间的最大延迟为4

 7.综合complie

 

 综合结果输出

综合后的结果包括:

  • 整个工程以ddc格式保存下来以供后续查看和修改;
  • 网表netlist,用于布局布线和仿真;
  • sdf文件,标注了用到的标准单元的延迟值,后仿真也需要用到;
  • 面积报告,包含时序电路、组合电路和总电路面积;
  • 约束报告,给出了综合过程中哪些,没有满足要求;
  • 时序报告,包含建立时间和保持时间。

8 综合中优化电路的常用方法

DC进行优化的目的是权衡timing和area约束,以满足用户对功能、速度和面积的要求。

优化过程是基于用户为design所加载的约束:

  • design rule constraint:优先
    • transition;
    • fanout;
    • capacitance;
  • optimiza constraint:
    • delay;
    • area。

参考的原文链接:Design Compiler入门 - 知乎 (zhihu.com)

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值