后仿 ---- 转载

转载自: 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.同步处理第一级寄存器的违背

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

时间: 2024-12-19 07:28:59

后仿 ---- 转载的相关文章

用VerilogHDL设计一个与门逻辑,并进行前仿和后仿

执行菜单命令[File]-[New Project Wizard-],创建工程向导. 在What is the working directory for this project?下选择项目存储地址工作目录,What is the name of this project?下填写工程名,最后一栏填写顶层文件名. 添加已存在文件(可选),在[File name]下选择已经存在的工程项目,利用[Add]或[Add all]命令添加文件到新工程,点击[Next] 3.选择器件,[Device fam

碰到一个后仿问题

今天碰到一个后仿的问题很奇怪,输出一个占空比为20%的100M信号,后仿时候发现输出总是0,很奇怪,于是就逐个排查,每个cell都引出来输入输出,最终发现是iobuffer这个cell有问题,输入正常,输出就变成低电平了,很奇怪.如果把这个信号的脉冲宽度给增大到50%,就没有这个问题了,原因不清楚.还有,如果输入clk经倍频到250m的话,clkcontrl 模块就会出现输出是不定态,原因不清楚,但是这两种信号我直接接出来,用示波器看的话都很正常,难道是altera给的网表模型参量有问题?待求证

[转载+原创]Emgu CV on C# (三) —— Emgu CV on 均衡化

本文简要描述了均衡化原理及数学实现等理论问题,最终利用emgucv实现图像的灰度均衡. 直方图的均衡化,这是图像增强的常用方法. 一.均衡化原理及数学实现(转载) 均衡化原理及数学实现可重点参看——<直方图均衡化>和<图像处理(3)_灰度分布均衡化> 灰度分布均衡化又称直方图均衡化. 1.概述 这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不影响整体的对比度,直方图

WebDriverAgentRunner安装成功后build的常见报错

1.缺少development team $ xcodebuild -project WebDriverAgent.xcodeproj \> -scheme WebDriverAgentRunner \> -destination 'platform=iOS,name=iPhone (2)' \> test2019-12-17 09:20:29.973 xcodebuild[30451:2032814] DTDeviceKit: deviceType from aa3c395a15b4e

ASIC 前端功能验证等级与对应年薪划分[个人意见] (2011-07-04 15:33:35

下面的讨论转载自eetop,我选取了一些有意义的讨论,加了我的评注. 楼主zhhzhuawei认为 ===================================== 对于ASIC的前端功能验证(不含SOC的IP集成验证): 1. 只会在别人搭建的环境上跑跑用例.       年薪<8W 2. 若还会在别人搭建的环境上构造用例.       年薪<10W 3. 若还会对测试点进行简单的分解,并能利用脚本或高级语言进行简单的编程,搞些自动化.年薪<14W 4. 若自个能独立搭建自动

cpu设计过程

一款CPU是如何设计出来的? 前面一段,我们了解了芯片的制造过程,也就是如何从沙子中提取硅.把硅切成片,在片上通过离子注入实现PN结.实现各种二极管.三极管.CMOS管.从而实现千万门级大规模集成电路的大致流程.接下来,我们继续了解一下,一款CPU是如何设计出来的.集成电路设计一般分为模拟IC设计.数字IC设计以及数模混合等.而数字IC设计,比如设计一款ARM Soc CPU芯片的基本流程如下: 1)设计芯片规格:根据需求,设计出基本的框架.功能.模块划分.有些复杂的芯片可能还需要建模.使用MA

关于微信小程序,一些想法

不负众望,小程序终于在昨天1月9日正式上线,从凌晨微信公开课发布了微信<一月九日,一年之约>到现在,整整一天的时间,朋友圈.自媒体平台都在不断的发着关于小程序的各种文章,"APP杀手"."千亿级市场"."颠覆"."超级应用"等等各种词汇都用在了小程序身上,连人民日报公众后都转载了微信公开课的文章<[提醒]微信小程序上线了,关于它的解答都在这里>,一个小程序能有这么大魅力? 1.小程序访问渠道 在小程序还

(转)说说芯片设计这点事

芯片设计这个行当 ,从大的方面讲,主要分模拟和数字两大块, 而每大块又分前端和后端, 我想大部分同学对这个肯定是非常清楚的, 下面就数字电路聊聊芯片设计的一些事情,就是芯片设计有哪些活做, 这并不是全面完整的系统介绍,只是个人的了解和总结, 希望抛砖引玉,也许不全面, 不正确, 欢迎同学们指正和补充 说到数字芯片,不能不说FPGA, 这种是可编程的数字电路, 用法原理也不说了, 数字电路设计的目标,就是把这些功能,做成我们自己专用的ASIC/SOC, 这样无论面积, 成本或者安全性等等都能有保证

点亮一个LED灯

设计定义: 二选一多路器 两个输入IO,a.b.可以是高电平, 输入按键按下时,LED灯与a端口状态保持一致, 按键释放时,LED灯与b端口状态保持一致 设计输入:创建一个project 编写功能代码 module LED(a,b,key_in,led_out); input a;//输入端口a,b: input b; input key_in;//按键输入,实现输入通道的选择 output led_out;//led控制端口 assign led_out=(key_in==0)?a:b;//当