zoukankan      html  css  js  c++  java
  • DC学习(7)环境和面积约束

    一:工作环境属性约束

      工作环境约束一方面是设置DC的工作环境,也就是DC要从在什么样的环境下对你的设计进行约束,举个例子,比如你的芯片要在恶劣的环境中进行工作,DC如果在优质的环境中对你的设计进行约束,你的芯片生产出来,就很有可能工作不了。因此一般就要告诉DC,使用恶劣的模型对设计进行约束。另一方面是为了保证电路的每一条时序路径延时计算的精确性,特别是输入/输出路径的精确性,单单靠外部的输入延时和输出延时的约束是不够,还要提供设计的环境属性。

    1:包括

      *输入端口,激励驱动

      *输出端口,驱动负载

      *PVT

      *集成参数影响

    2:电路图

      

      

      输入管脚:驱动能力,input transition time

      输出管脚:RC模型,loading模型

      PVT conditions

      parasitic RC:寄生RC

    3:输出管脚 loading模型

      默认情况下,DC假设端口上的外部电容负载为0,我们可以指定电容负载为某些之,也可以使用load_of选项明确说明电容负载的值为工艺库中某一单元引脚的负载(一般是选择输入引脚

      例如:

      *set_load [expr 30.0/1000] [get_ports B]

      *

      

      左图:set_load [load of my_lib/AN2/A] [get_ports B]  ;#采用工艺库my_lib里的AN2,A是cellAN2的pin脚

      右图:set_load {expr[load of my_lib/inv1a0/A]*3} [get_ports B]  ;#采用工艺库my_lib里的inv1a0,三个并联

    4:input或者inout端口设置驱动强度

      默认情况下,激励是理想的,没有transition

      *set_input_transition 0.12 [get_ports A];#直接设置输入端口的转换时间

       *当不知道输入转换时间时,可使用下面命令调用库器件模型

      

      set_driving_cell -lib_cell OR3B [get_ports A] ;#调用库lib_cell里的OR3B

      set_driving_cell -lib_cell FD1 -pin Qn [get_ports A] ;#调用库lib_cell里的FD1的管脚Qn

    5:PVT(process,voltage,temperature)

      工艺库单元通常用“nominal”电压和温度来描述其默认特性;库文件中,包含对各种不同条件的具体描述,如slow,fast,typical等;可以通过使用命令set_operating_conditions命令把工作条件加入到设计上。综合时,原来按“nominal”环境计算出的单元延迟和连线延迟,将按工作条件作适当比例调整。

    如下图为为延迟与工作条件的关系:

               

      

      list_libs ;#查看当前工艺库

       report_lib libname;#查看libname的PVT等信息

      

      设置工作条件可用下面命令:

      set_operating_conditions -max $OPERA_CONDITION -max_library $LIBNAME

      set_operating_conditions -max "wccom"  ;#有wccom,typical,bccom选项

    7:集成参数互联(设置线负载模型)

      在计算时序路径延迟时,除了需要知道门单元延迟,还需要知道连线的延迟。

      连线延迟目前用线负载模型(wire load model,简称WLM),WLM是厂商根据多种以及生产出来芯片的统计结果,在同样的工艺下,计算出某个设计规模范围内负载扇出为1的连线平均长度,负载扇出为2的连线平均长度,负载扇出为3的连线平均长度等。WLM根据连线的扇出进行估算连线的RC寄生参数。

      线负载模型为DC提供统计性估算的线网负载信息,随后DC使用这些线网负载信息,以负载的大小为函数来模拟线上的延迟;如果DC遇到连线的扇出大于模型中列出的最大扇出值,它将使用外推斜率来计算连线的长度。具体格式由工艺库决定(下)(也可使用report_lib $lib_name 查看格式):

               

      上图格式中,若连线扇出为7,而连线最大扇出为5,连线的长度计算如下:

      232.68 + 50.3104*(7-5) = 333.3008;这条连线的电容和电阻分别为 333.3008*0.00017=0.0566pf,333.3008*0.000217=0.0903千欧

      关于WLM的命令如下

      DC自动选择线负载模型:set auto_wire_load_selection false

      手动选择线负载模型:set_wire_load_model -name $WIRE_LOAD_MODEL -library $LIB_NAME

      如果连线穿越层次边界,连接两个不同的模块,那么有三种方式对这种跨模块线连接的类型进行建模,set_wire_load_mode命令用于设置连线负载模型的模式。有三种模式供选择:top、segment和enclosed。三种模式的示意图如下所示:

                 

                 

      由图可见, 该设计的顶层设计(top)包括一个子模块, 该子模块又包括两个更小的模块。 顶层设计对应的连线负载模型为50×50; 子模块对应的连线负载模型为40×40;更小的两个模块对应的负载模型为20×20和30×30。

      假设有一个连线贯穿两个小模块, 但没有超出子模块的范围。 对于这种连线, 在三种模式下, 所用的连线负载模型是不同的,下面是介绍:

      比较悲观的形式:这时,top为顶层设计,电路的规模比SUB模块大,连线负载模型最悲观。在top模式下, 采用top层的连线负载模型, 即50×50;因此,连线的延迟最大。我们一般选用这种方式,命令如下:

            set_wire_load_mode  top 

      比较不悲观方式:用enclosed的方式选择WLM,该W LM对应的设计完全地包住这条连线,这时DC将选择SUB模块对应的连线负载模型。在enclosed模式下, 采用子模块的连线负载模型, 即40×40;因SUB模块比较TOP设计小,所以连线的延迟比较短(不悲观,就是连线延时小)。对应的命令为:

          set_wire_load_mode   enclosed

       在segmented模式下, 位于两个小模块中的部分采用这两个小模块对应的连线负载模型,  中间部分采用子模块的连线负载模型。

    二:输入驱动,输出负载预算

    1:预算规则

      *输入驱动选择弱cell,但不能过弱

      *输入端口电容限制set_max_capacitance

      *输出端口load个数估算

    例如:(只是举例)对于下面的电路图:

               

      其规格为:模块输入端口驱动的负载不大于10个“AND2”门的输入引脚的负载,模块输出端口最多允许连接3模块,如果某个输出端需要连接多于3个模块,我们要在代码中复制该输端口

    2:example

    三:环境变量例子

      环境约束举例如下所示:

               

      语法中,设置(定义变量时),如上面的:

      Set  ALL_IN_EXCEPT_CLK  [remove_from_collection [all_inputs]  [get_ports  $CLK_NAME]]中,后面的remove_from_collection是移除设计物集对象的意思,我们知道,DC可以将设计识别成多个对象,比如输入端口、输出端口等等,然后这个就是从all_inputs这个对象集合中,移除掉CLK_NAME这些代表的端口;如果命令之中有命令时,需要用[]来括起来。

      然后是expr是表达式求值的意思,因为load_of取出了一个端口的负载值(因为哟load_of这个命令,即命令中有命令,因此需要加[]),这个值*10 是个表达式,因此用expr来指出求值,求值是一个命令,因此用[]括了起来。

      上面中,LIB_NAME、WIRE_LOAD_MODEL、DRIVE_CELL 、DRIVE_PIN、OPERA_CONDITION这些变量的内容都不是随便定义的,需要根据综合库书写,下面进行解释,库的具体内容参考综合库那一节。

    LIB_NAME:库的名字,这里使用的恶劣的情况:

             

    WIRE_LOAD_MODEL:线负载模型,打开slow.lib这文件,可以找到各种线负载模型:

             

              约束中选的是w150的。

    DRIVE_CELL:驱动单元,也就是用来模拟驱动输入端的驱动单元,这要选择库中有的单元,比如反相器:

             

    DRIVE_PIN:驱动管脚,为单元的输出管脚,也就是“Y”了。

    OPERA_CONDITION:这个操作环境也是要填写库里面有的:

              

    设置完这些变量之后,还设置了ALL_IN_EXCEPT_CLKMAX_LOAD变量,其中ALL_IN_EXCEPT_CLK变量代表了除了时钟之外的输入管脚。MAX_LOAD变量就表示了最大的负载,代表的是库中某个单元的输入负载值。

    四:面积约束

    1:面积的单位

           ·2输入与非门(2-input-NAND-gate)

      ·晶体管数目(Transistors)

      ·平方微米(Square microns)

    2:我们用set_max_area命令为设计作面积的约束。例如:

     

          set_max_area  10000

     

      当设计不是很大的时候,根据上面的描述,我们就可以使用下面的命令进行面积约束:

     

          set_max_area  0

     

      让DC做最大的面积优化约束。

    五:其他命令

    1:约束加完后检查

      report_port -verbose ;#检查端口约束

      report_clcok;#检查clock约束

    2:重定向

      重定向输出脚本并且输出到一个log文件里

      redirect -tee -file precompile.rpt  

    3:  help

        help *clcok

      help -verbose create_clock

      create_clock -help

      man create_clock

    六:实战

      由于种种原因,这里只有环境属性的约束的实战,其他的约束也可以通过上面的讲解和下面的这个实战进行设计。

      首先,我们来看看设计约束规格:

      (设计原理图)

                

    (设计规范)

    在前面一节的基本时序约束规范上加上下面的规范:

                

    ·DC启动环境的设置我们根据设计原理图和设计规范开始进行实践:

    (跟上一节一样,这里不再重复)

    ·约束文件的编写

      基本的时序路径约束和上一节一样,不进行改动,下面进行工作环境的约束:

    -->输入端口的驱动设置:

      1.要我们使用库里面的bufbd1来驱动除了clk和Cin*之外的所有输入端口:

       这里是直接使用库里面的单元来驱动的,根据前面的讲解,我们很容易得到约束的命令为:

        set_driving_cell  -lib_cell  bufbd1  -library  cb13fs120_tsmc_max  [remove_from_collection  [all_inputs]  [get_ports "clk Cin*"]]

       (命令的格式为)set_driving_cell  -lib_cell  单元的名字  -library  单元所在库的名字  要设置约束的对象

       注意:当一条命令太长,要进行分割时,使用反斜杠作为分隔符,且反斜杠后面不能加空格。

      2.Cin*是芯片级的端口,需要加上120ps的最大转化时间,这是直接设置转换时间,因此可以这样约束:

       set_input_transition  0.12  [get_ports  Cin*]

    -->输出负载的约束:

      1.除了cout输出,其它输出驱动值都是库单元bufbd7的引脚I负载值的两倍,也就是用单元的端口进行约束,因此有:

          set_load [expr 2 * {[load_of cb13fs120_tsmc_max/bufbd7/I]}] [get_ports out*]

      2.cout驱动最大值为25pf的负载,因此可以这样设置:

        set_load 0.025 [get_ports Cout*]

    -->操作环境的设置:

       由于用到了库里面的单元,我们还在最好设置一下操作环境,虽然DC可以从启动环境里面找到单元所在的位置库,但是我也要设置操作环境,如下所示:

          set_operating_conditions -max cb13fs120_tsmc_max

    下面的步骤跟前面的一样,这里就不展开描述了:

    ·启动DC,设计读入前的检查

    ·读入设计和检查设计

    ·执行约束和检查约束

    ·进行综合

    ...

     

  • 相关阅读:
    TPLINK GPL code 简要分析
    Openwrt 初探
    物联网-手机远程控制家里的摄像头(3)
    物联网-手机远程控制家里的摄像头(2)
    lumia 520无法开机
    树莓派无法驱动移动硬盘
    Cannot Change Opencv Webcam Setting
    IIC协议理解(转)
    应用调试(六)记录回放输入子系统
    应用调试(五)侵入式SWI
  • 原文地址:https://www.cnblogs.com/xh13dream/p/8688519.html
Copyright © 2011-2022 走看看