zoukankan      html  css  js  c++  java
  • 芯片后仿

    1、芯片后仿的意义:

    既然前仿保证了逻辑功能,STA 保证了时序,PT对各个corner进行了时序穷举计算并确保时序收敛,那么作为数字IC设计流程的最后一环后仿真的意义是什么呢?

    原因有若干:

      1、 多时钟域的timing确认(跨时钟域信号的同步处理)。

      2、由于异步处理部分在SDC约束文件中做的是fath_path处理,所以这部分时序是否满足,PT并不会检查也不会报出violation。

      3、异步的处理方式在PD处理后有问题: example:dmux结构,data signal latnecy过大;导致后仿出现ctrl信号先 data stable后的case。

      4、一些test pattern需要做后仿,调整合适的timing margin,太紧的话,片子容易fail。

      5、时钟切换电路?

      6、DFT逻辑的插入是否导致功能出现问题。

    2、芯片后仿违例类型:

      1、Setup/hold违背(posedge D -> posedge CK  , negedge D -> posedge CK)

      2、Recovary/Removal违背 (posedge CDN -> posedge CK  ,posedge SDN -> posedge CK)??

      3、Width违背 (CK,CDN,SDN)

      4、IP接口时序不符合datasheet?外设器件是否也需要带延时的model?

      

    3、后仿全面介绍:http://www.chipsbank.com/news_detail/newsId=121.html

    1.后仿是否必要
    随着芯片规模的增大,关于IC设计流程中的后仿是否必要,有多种声音。

    认为不必要的理由是:布局布线后的网表,已经可以通过STA保证时序,后仿只不过是确认一遍电路的时序。而且随着电路规模不断增大,仿真工具的仿真速度的提升仍不明显,后仿必然是一个很耗时的步骤,时间代价大而收益不明显。

    认为有必要的理由是,从公司以往多个项目的经验来看,后仿中也发现了一些问题。而对于有些设计,STA并不能完全覆盖所有的路径。后仿的工作是对后端实现最后的check。

    本文认为,以公司现阶段的研发力量,后仿还是必须的。

    2.前后仿的区别
    前仿:RTL的仿真

    后仿:门级仿真。又分为综合后仿真和布局布线后仿真

    a.关注点不同;

    前仿:关注RTL在功能上是否正确(符合设计)

    后仿:关注电路在各种工作条件下,插入了延时后,功能是否依然正确。 

    b.仿真对象不同;

    前仿:仿真的对象是RTL

    后仿:仿真的对象是门级网表+sdf文件(可能包括一些IP的sdf)

    综合后仿真用的是综合后的网表+PreSTA产生的sdf(无net延时,cell延时不准确,时钟树不准确)

    布局布线后仿真用的是PR后的网表+PostSTA产生的sdf

    c.外部激励与响应检查;

    所用的激励和响应检查应一致

    后仿可能让时钟漂移以模拟极端的情况

    3.后仿的各种组合情况
    如果考虑OSC漂移以及三种Corner,可以组合以下六种情况

    Fast OSC  + Fast SDF

    Slow OSC + Fast SDF

    Fast OSC  + Typ SDF

    Slow OSC + Typ SDF

    Fast OSC  + Slow SDF

    Slow OSC + Slow SDF

    说明:对于普通的设计,实际只需考虑3中sdf即可。对于osc偏移可能带来的影响(如,flash编程),则后仿需要考虑更多Osc偏移带来的影响(时序不满足)

    4. 认识sdf文件
    sdf = 标准延时文件

    请参考附录1中对于sdf文件的注释

    5. Sdf反标
    反标:vcs将sdf文件中的延时信息添加到门级网表中对应的地方

    $sdf_annotate

    例:$sdf_annotate("/home/chengp/project/zi2201/trunk/Digital/FrontEnd/sta/sdf/zi2201.20100726_v0.26_post_min_case1.eco.sdf",U_zi2201e_digital);

    6.后仿违背的类型
    a.时序器件

    Setup/hold违背(posedge D -> posedge CK  , negedge D -> posedge CK)

    Recovary/Removal违背 (posedge CDN -> posedge CK  ,posedge SDN -> posedge CK)

    Width违背 (CK,CDN,SDN)

    b.IP时序违背

    IP接口时序不符合datasheet

    7.针对违背采取的措施
    a.同步处理第一级寄存器的违背(注:这一级的X态主要是由于同步复位的寄存器导致的)

    i.方法一

    1,建立文件Sync.v,格式如下:

    initial begin

    force  Top.uXX.uYY.uZZ_reg.notifier = 1'b0;

     …………

    end

    2,在SimTop中的include此文件;

    解决了寄存器输出为x的情况,但仿真会报很多warning

    ii.方法二

    1,建立文件Sync.v,格式如下

       instance {

    Top.uXX.uYY.uZZ_reg,

    ……

       }   {noTiming}

    2,在runsim文件中加入  +optconfigfile+./Sync.v

    b.其他

    i.时序约束是否存在问题

    ii.时钟树是否合理

    iii.电路设计是否有潜在风险

    iv.接口设计是否遵循datasheet

    8.后仿脚本
    1,+neg_tchk 

    寄存器可能出现负的setup limit和hold limit。??

    如果sdf中存在负的setup limit或hold limit,则使用特定的规则检查

     

    实际仿真结果:

    仿真加 +neg_tchk

    仿真调用的sdf如下图所示:

    a,正的setup + 负的hold

     

    Posedge D 发生在时钟沿前 (-2.6ns , -1.8ns)会出现setuphold违背

    b,负的setup + 正的hold

     

     Negedge D发生在时钟沿后 ( 1.7ns , 2.9ns )会出现setuphold违背

    2,+sdfverbose

    反标过程中打印详细的信息

    9.后仿注意的问题
    1,对于一些IP的仿真模型,定义了一些延时量,但一般不针对某个corner。因此最好定义各个corner下的延时量。

    10.  后仿遗留问题
    1,反标负延时?

    vcs手册中说用-negdelay可以允许sdf中的cell和net使用负延时。

    备注:负延时的一种情形:

    实际仿真时,修改了某个cell的延时为负,仿真不加-negdelay,仿真提示:

    Warning-[SDFCOM_NDI] Negative Delay Ignored

    /home/chengp/project/zi2201/trunk/Digital/FrontEnd/sta/sdf/zi2201.20100726_v0.26_post_max_case1.eco.sdf, 34671

    module: inv0d0, "instance: zi2201eTest.U_zi2201e_digital.U3827"

      SDF Warning: Negative delay is ignored and replaced by 0.

      Please use -negdelay to support it.

    如果加-negdelay仿真,仿真提示如下:

    Warning-[SDFCOM_NIOD] Negative IOPATH Delay encountered

    /home/chengp/project/zi2201/trunk/Digital/FrontEnd/sta/sdf/zi2201.20100726_v0.26_post_max_case1.eco.sdf, 34671

      SDF Warning: Negative IOPATH Delay I to ZN is replaced by 0.

      This negative value cannot be handled with switch -negdelay. Please check SDF files.

    2,+overlap作用

    3,sdf中的mindelays ,maxdelays

     pt在使用bc_wc测例做sta分析时,生成的sdf可能mindelays和maxdelays可能不一样。如:(IOPATH I ZN (0.540::0.642) (0.302::0.362))。反标sdf时,vcs脚本中加+mindelays则反标的是0.540和0.302,加+maxdelays则反标的是0.642和0.362。

    附录1  sdf文件 

    (DELAYFILE

    (SDFVERSION "OVI 2.1")

    (DESIGN "zi2201_digital_virage")  // top name

    (DATE "Mon Jul 26 11:06:27 2010")

    (VENDOR "tsl18fs020_max")   // 生成sdf所使用的库

    (PROGRAM "Synopsys PrimeTime")

    (VERSION "B-2008.06-SP2") 

    (DIVIDER /)

    // OPERATING CONDITION "tsl18fs020_max::tsl18fs020_max"

    (VOLTAGE 0.90::0.90)   // corner参数

    (PROCESS "1.200::1.200")

    (TEMPERATURE 125.00::125.00)

    (TIMESCALE 1ns)   //延时单位

    (CELL

      (CELLTYPE "zi2201_digital_virage")

      (INSTANCE)

      (DELAY

        (ABSOLUTE

        (INTERCONNECT U4384/ZN U3558/I (0.001::0.001))  // 两个cell的pin之间连线的delay

        )

      )

    )

    (CELL    // 网表中的每个单元的信息都是由 (CELL ..    )包括

      (CELLTYPE "inv0d0")

      (INSTANCE U3558)   // 网表中的单元

      (DELAY

        (ABSOLUTE

    (IOPATH I ZN (0.540::0.642) (0.302::0.362))   // 延时数据

    //          0.540= min delay from I(1->0)  to Z (0->1)

    //          0.642= max delay from I(1->0)  to Z (0->1)

    //          0.302= min delay from I(0->1)  to Z (1->0) 

    //          0.362= max delay from I(0->1)  to Z (1->0)

        )

      )

    )

    (CELL

      (CELLTYPE "dfcrn1")

      (INSTANCE U_Decoder_TRCalCntH_reg_0_)

      (DELAY

        (ABSOLUTE

        (IOPATH CP QN (1.546::1.721) (1.551::1.727))

        (IOPATH CDN QN (1.907::1.907) ())

        )

      )

      (TIMINGCHECK    // timing check 参数

        (WIDTH (posedge CP) (0.532::0.532))

        (WIDTH (negedge CP) (0.972::0.972))

        (HOLD (posedge CDN) (posedge CP) (1.216::1.216))

        (RECOVERY (posedge CDN) (posedge CP) (-0.653::-0.653))

        (WIDTH (negedge CDN) (0.412::0.412))

        (SETUP (posedge D) (posedge CP) (0.219::0.219))

        (SETUP (negedge D) (posedge CP) (0.193::0.193))

        (HOLD (posedge D) (posedge CP) (-0.202::-0.202))

        (HOLD (negedge D) (posedge CP) (0.057::0.057))

      )

    )

    附录2  仿真模型
     

    module inv0d0 (I,ZN);

    output  ZN;

    input   I; 

    not #1 (ZN,I); 

    `ifdef functional

    `else

    specify

    // Parameter declarations

     specparam i_lh_zn_hl=-1,i_hl_zn_lh=-1;

    // Delays

     (        I -=> ZN) = (i_hl_zn_lh,i_lh_zn_hl);

    endspecify

    `endif

    endmodule

    module dfcrn1 (D,CP,CDN,QN);

    output  QN;

    input   D,CP,CDN;

    `ifdef neg_tchk

    wire d_D,d_CP,d_CDN;

    `endif

    `ifdef functional

    U_FD_P_RB #1 (QN_not,D,CP,CDN);

    `else

    reg notifier;

    `ifdef neg_tchk

    U_FD_P_RB_NO #1 (QN_not,d_D,d_CP,d_CDN,notifier);

    `else

    U_FD_P_RB_NO #1 (QN_not,D,CP,CDN,notifier);

    `endif

    `endif

    not (QN,QN_not);

    `ifdef functional

    `else

    specify

    // Parameter declarations

     specparam tsu_d_h_cp=0.12,tsu_d_l_cp=0.22,tsu_cdn_h_cp=0.00,th_cp_d_h=0.00,

     th_cp_d_l=0.00,th_cp_cdn_l=0.33,tpw_cp_h=0.26,tpw_cp_l=0.43,tpw_cdn_l=0.23,

     cp_lh_qn_hl=0,cp_lh_qn_lh=0,cdn_hl_qn_lh_1=0;

    // Violation constraints

    `ifdef neg_tchk

     $setuphold (posedge CP &&& (CDN==1'b1),posedge D &&& (CDN==1'b1),tsu_d_h_cp,th_cp_d_l,notifier,,,d_CP,d_D);

     $setuphold (posedge CP &&& (CDN==1'b1),negedge D &&& (CDN==1'b1),tsu_d_l_cp,th_cp_d_h,notifier,,,d_CP,d_D);

     $recrem (posedge CDN,posedge CP,tsu_cdn_h_cp,th_cp_cdn_l,notifier,,,d_CDN,d_CP);

    `else

     $setup (posedge D &&& (CDN==1'b1),posedge CP &&& (CDN==1'b1),tsu_d_h_cp,notifier);

     $setup (negedge D &&& (CDN==1'b1),posedge CP &&& (CDN==1'b1),tsu_d_l_cp,notifier);

     $recovery (posedge CDN,posedge CP,tsu_cdn_h_cp,notifier);

     $hold  (posedge CP &&& (CDN==1'b1),negedge D &&& (CDN==1'b1),th_cp_d_h,notifier);

     $hold  (posedge CP &&& (CDN==1'b1),posedge D &&& (CDN==1'b1),th_cp_d_l,notifier);

     $hold  (posedge CP,posedge CDN,th_cp_cdn_l,notifier);

    `endif

     $width (posedge CP &&& (CDN==1'b1),tpw_cp_h,0,notifier);

     $width (negedge CP &&& (CDN==1'b1),tpw_cp_l,0,notifier);

     $width (negedge CDN,tpw_cdn_l,0,notifier);

    // Delays

     if (CDN==1'b1)

     (posedge CP   => (QN -: D   )) = (cp_lh_qn_lh,cp_lh_qn_hl);

     (negedge CDN  => (QN +: 1'b1)) = (cdn_hl_qn_lh_1,0);

    endspecify

    `endif

    endmodule

  • 相关阅读:
    xcode swift对应版本
    VM12安装OS X10.11步骤及说明
    Java开发Webservice的组件
    xml文件格式说明
    android开发中在界面上实现曲线图的几个开源项目
    C#中SQL Server数据库连接池使用及连接字符串部分关键字使用说明
    c#对数据库访问完应关闭连接
    I2C VHDL程序
    数码管一些列功能的verilog实现
    PWM控制灯亮暗的verilog实现
  • 原文地址:https://www.cnblogs.com/littleMa/p/10795759.html
Copyright © 2011-2022 走看看