当我们做后仿时应该了解什么

1 什么是后仿

1.1 后仿定义        

在芯片研发过程中,至少存在三种仿真,只有这三种仿真都通过后,才能进入到最后的tape out阶段。这三种仿真分别是rtl 功能级仿真、综合后网表仿真(pre gate sim)、PR后网表仿真(post gate sim)[4]。rtl功能及仿真也被称为前仿,指针对不带任何延迟信息的RTL代码进行的功能验证。而后两种仿真,就是本文所要介绍的后仿。

后仿就是将物理实现上的各种延时参数,通过反标的形式标注到网表文件上,在仿真中模拟实际的器件延时行为,主要有两个目的:1 检查门级网表的功能是否符合设计意图;2 将门级网表的仿真波形用于功耗分析。前仿与后仿所使用的仿真器是相同的,所加激励也是相同的,不同点主要有:仿真所需文件不完全相同;作用不同;波形不同。

pre gate sim:前门级仿真使用综合后的网表进行的,一般综合时会在ss corner下完成,而用于功耗分析的前门级仿真会在tt corner下进行,因此在用vcs仿真时需要设置+nospecify+notimingcheck。综合后网表仿真不存在路径延时,但是在cell内部存在延时。

post gate sim:指使用PR之后的网表进行仿真,在PR之后已经添加了完整的路径延时且不论是在SS还是TT corner下都应该能满足时序要求实现芯片功能,因此在进行gate sim仿真时不能使用nospecify和notimingcheck,需要把所有的时序都反标上去,这样才能尽最大限度的模拟真实芯片工作时的情况(如不同信号的延时导致毛刺的产生,导致功耗增大)。PR后网表仿真是对最终网表的时序检查,但时序检查并不是只有这一种方法,另一种方法是静态时序分析。

前端DV所使用的网表以及SDF文件由后端同事提供,由RTL生成网表的过程以及简化后的后端FLOW如图1.1与图1.2所示。

图1.1 RTL与Netlist的验证方法[1]

图1.2 简化后的后端Flow[1]

1.2 在后仿中有哪些被检查

  1. 检查异步电路的时序。STA工具只能检查同步电路时序,异步处理部分在SDC约束文件中做的是false_path处理,STA工具并不会检查也不会报出violation,所以这部分电路的时序是否满足需要后仿来确定。
  2. 检查添加DFT逻辑的仿真。只有门级网表才包含扫描链条,需要检查DFT逻辑的插入是否会导致功能出现问题。
  3. 为后续流程如功耗(Power)分析、压降(IR Drop)分析提供波形。
  4. RTL与Netlist做一致性check—防止综合、布局布线过程中的意外。
  5. Postsim 可以检查系统reset的状态和reset的流程是否正确。
  6. Postsim可以检查上下电的流程是否正常。
  7. Postsim 相较于RTL simulation可以引入X(unknown)状态,可以发现更多的功能和时序问题。
  8. Postsim 可以检查网表的功能是否正确。
  9. Clock-tree synthesis check。
  10. 检查时序约束(SDC)的完备性。Multicycle path,Async path,IO delay is well considered[1]。

1.3 基本概念

1.3.1 Timing Check[3]

1. 时序

时序是数字电路设计中最为关注的主题之一,而建立时间与保持时间又是两个非常重要的基本概念。

(1) Setup Time

setup time是指在时钟有效沿(下图为上升沿)之前,数据输入端信号必须保持稳定的最短时间。

图2.1 触发器的setup要求

(2) Hold Time

hold time是指在时钟有效沿(下图为上升沿)之后,数据输入端信号必须保持稳定的最短时间。hold time时序检查确保新数据不会在触发器稳定输出初始数据之前过早到达D端而覆盖其初始数据。

图2.2 触发器的hold要求

(3) Setup & Hold详细分析

以图2.3为例,分析建立时间及保持时间。发送数据的触发器称为Launch flip-flop,接收/捕获数据的触发器称为Capture flip-flop。两触发器时钟端信号为同一时钟。

如图2.3所示,launch_path为:CLKM→BUF(launch)→UFF0/CK→UFF0/Q→Comb_logic→UFF1/D;capture path为:CLKM→BUF(capture)→UFF1/CK;

图2.3 两个触发器(flip-flop)组成的简单电路

(a) Setup

两触发器间的数据传输通常在一个时钟周期内完成。

数据到达UFF1/D所需时间Arrival time为:

Ta = T_launch + T_ck2q + T_dp

满足setup要求时所允许的最长时间Required time为:

Tr = T_capture + T_clk - T_setup

因此setup time要求可表示为:Tr - Ta = T_margin >= 0。

根据图2.4,setup time要求还可表示为:

T_launch + T_ck2q + T_dp + T_margin + T_setup = T_capture + T_clk

其中:

T_launch:CLKM到UFF0时钟端CK的延时

T_ck2q:UFF0的CK->Q的传输时间

T_dp:组合逻辑延时

T_margin:设计裕量

T_setup:UFF1的setup时间要求

T_capture:CLKM到UFF1时钟端CK的延时

T_clk: 时钟周期

由此可见,setup检查发生在不同时钟边沿,与时钟频率有关。

图2.4 时序分析

(b) Hold

数据到达UFF1/D所需时间Arrival time为:

Ta = T_launch + T_ck2q + T_dp

满足hold要求时所允许的最短时间Required time为:

Tr = T_capture + T_hold

因此hold time要求可表示为:Ta - Tr = T_margin >= 0。

根据图2.4,hold time要求还可表示为:

T_launch + T_ck2q + T_dp = T_capture + T_hold + T_margin

其中:

T_launch:CLKM到UFF0时钟端CK的延时

T_ck2q:UFF0的CK->Q的传输时间

T_dp:组合逻辑延时

T_hold:UFF1的hold时间要求

T_margin:设计裕量

T_capture:CLKM到UFF1时钟端的延时

T_clk: 时钟周期

由此可见,hold检查发生在同一时钟边沿,与时钟频率无关。

(c) 总结

setup time是针对Capture edge来说,待传输数据不能来太晚;hold time是针对Capture edge来说,新数据不能来太早,以确保待传输数据保持一段时间。总结为一句话:当前待传输的数据,相对于Capture edge来说,必须早来(setup time)晚走(hold time)。

(4) RECOVERY

撤销复位时,恢复到非复位状态的电平必须在时钟有效沿来临之前的一段时间到来,才能保证时钟能有效恢复到非复位状态,此段时间为recovery time。类似于同步时钟的setup time。

(5) REMOVAL

复位时,在时钟有效沿来临之后复位信号还需要保持的时间为去除时间removal time(去除时间)。类似同步时钟hold time。

图2.5 RECOVERY&REMOVAL

(6) Setup & Hold违例解决方法

(a) Setup需满足以下条件:

T_launch + T_ck2q + T_dp + T_setup <= T_capture + T_clk

记Clock Skew: T_skew = T_capture- T_launch,即:

T_ck2q + T_dp + T_setup <= T_skew + T_clk

因此,setup violation修复方法包括:① T_clk:增加T_clk,也就是降频。② T_dp:优化组合逻辑延时,具体包括:增加一个中间触发器来切割Timing Path,分割组合逻辑延时(流水线结构);对于有较大负载的节点可以考虑插buffer、逻辑复制的方法来优化扇出,减少关键路径上的负载(插Buffer,逻辑复制);小Cell换成大Cell,更换更大驱动的Cell,增强驱动能力;更换SVT/LVT的Cell。③ T_skew:采用positive skew(T_skew >0),但是要注意可能引入的hold问题,以及前后级的margin问题。④ T_ck2q:更换更快的时序逻辑单元,如HVT->LVT。

(b) Hold需满足以下条件:

T_launch + T_ck2q + T_dp >= T_capture + T_hold

记Clock Skew: T_skew = T_capture- T_launch,即:

T_ck2q + T_dp >= T_skew + T_hold

因此,hold violation修复方法包括:① T_dp:增加组合路径延时,通过插buffer、插delay cell、更换驱动、更换阈值的方法(组合逻辑深度的增加会增加芯片的面积、布线资源、功耗,可能产生在慢速工艺库条件下建立时间违例);② T_skew:减小skew,甚至采用negative skew,但需做好时钟树的balance。③ 插入低电平有效的锁存器(Lock-up Latch):高电平期间,锁存器输出保持不变,相当于人为将数据推迟了半个时钟周期,以保证满足hold时间要求。

1.3.2 SDF简介

门级仿真根据网表不同,又可以分为综合后仿真,以及布局布线后仿真。前者是用综合后的网表进行仿真,这时由于没有做CTS,所以会出现不少时序违例的情况;真正时序验证的网表是后端做完布局布线,timing clean的网表,我们称为pnr网表。进行pnr网表的后仿时,我们需要告知仿真工具cell和net的延时,因此就需要SDF文件。

SDF(standard delay format):描述电路布局布线后单元及互联线的延时数据,主要作用是将延迟信息反标(back annotation)到功能模型中,模拟芯片在真实工作时的状态。反标SDF文件有两种方法:一种是作为elaboration的选项指定,一种是使用系统函数$sdf_annotate来完成。

SDF表头部分[2]:

  1. SDFVERSION:表示该SDF遵循哪个版本的SDF标准所生成,2.1以后的版本该部分可以省略
  2. DESIGN:表示产生timing数据的设计名称
  3. DATE:表示产生SDF文件的时间
  4. PROGRAM:表示产生SDF文件的工具
  5. VERSION:表示产生SDF文件的工具的版本
  6. DIVDER:表示SDF文件中的分隔符,一般是 / 或 .
  7. VOLTAGE:表示该SDF中三种状态(best、normal、worst)下的电压值。
  8. PROCESS:表示该SDF中三种状态(best、normal、worst)数值所乘的factor。
  9. TEMPERATURE:表示该SDF中三种状态(best、normal、worst)下的温度。

以cell位单位作为基本单元,Cell中用于反标的时序信息包括延时部分(关键词DELAY)和时序检查部分(关键词TIMINGCHECK)[2]:

  1. CELLTYPE:该基本单元的种类
  2. INSTANCE:该基本单元的名称
  3. DELAY:timing specification 的关键词,后续所描述的数值为该基本单元的规格
  4. ABSOLUTE:表示之后的延迟时间可以完全取代在annotation阶段已经存在的延迟数据
  5. PORT:端口延迟,即信号进入本单元需要加上的延迟
  6. IOPATH:输入到输出所造成的延迟
  7. DEVICE:器件延时
  8. COND/CONDELSE:条件延时
  9. INTERCONNECT:互连线延时
  10. TIMINGCHECK:时序检查的关键词,对器件的输入信号进行检查以确定是否能产生正确的输出信号
  11. SETUP:检查建立时间,待测信号在clock信号或边沿触发信号的触发沿前,所要保持逻辑状态稳定的最小时间
  12. HOLD:检查保持时间,待测信号在触发信号之后,所要保持逻辑状态稳定的最小时间
  13. WIDTH:指出脉冲的最小宽度,positive表示正脉冲的宽度,negative表示负脉冲的宽度
  14. RECOVERY:检查异步控制信号在其释放后到下一个clock信号有效沿之前的时间

1.3.3 常见corner介绍

影响corner的因素包括PVT三个。

P:Process是指Fab在生产过程中工艺、机台等的差异导致芯片的偏差。分为TT SS FF FS SF等这几类情况。

V:Voltage 指的是芯片的工作电压。例如tt电压为1V ss的电压就是0.9V ff的电压就是1.1V。

T:Temperature 是指芯片工作的温度。例如tt的温度是0℃ or 25℃。高温就是125℃,低温一般为-40℃。

下表[2]为不同工艺角情况介绍,根据需求选择对应Corner进行后仿真,一般并不需要跑全部corner。

图2.6 工艺角情况介绍

二 如何去做后仿

2.1 后仿流程

后仿需要准备的文件有:DC综合或布局布线后生成的网表文件.v和SDF文件.sdf,与综合时所用工艺库db对应的标准单元工艺库.v文件(不区分工艺角),以及前仿所用的测试激励文件(testbench)。

(1) 确认工艺corner:后仿需要SDF、网表、库文件以及前仿中的激励文件。网表和库文件只有一份,sdf文件根据corner不同会有多份,后仿DV工程师需要选择使用哪一种corner下的sdf文件,一般选择worst case。

(2) 环境适配:①需要对filelist进行修改,将RTL文件替换为网表,再跟后端同事对齐,添加网表对应的库。②然后修改环境中信号路径,UVC绑定等来解决编译报错的问题。③先跑pre gate sim,当所有case都通过后,再跑post gate sim(反标SDF),需要将input delay添加进环境中。

(3) 仿真用例选择:一般不会针对后仿新造case,而是采用原有的case进行后仿。与RTL仿真相比,后仿需要占用更多的机器资源以及消耗更多的仿真时间,因此后仿case挑选的基本原则一般为:Case 尽量短,能够覆盖关键 Datapath 及高风险区域,且 RTL 仿真能够 Pass。基于上述原则,后仿case应该覆盖以下几点:

        (a) 完整的 Clock、Reset 初始化配置流程,Bootrom 最好也测一测。

        (b) 各个 Clock 频点、Power ON/OFF

        (c) 寄存器访问

        (d) 主要工作模式、典型功能、关键路径、异步路径、外部接口、数据流

        (e) Mbist等

(4) 将SDF文件反标DUT:为了使网表仿真携带时序信息,需要通过仿真工具,将SDF反标到对应NETLIST的specify语句中,SNPS的VCS工具支持如下两种反标方式[6]:

        (a) VCS命令行反标:vcs -sdf min|typ|max:instance_name:file.sdf

        (b) System Task反标:$sdf_annotate ("sdf_file"[,module_instance] [,"sdf_configfile"][,"sdf_logfile"][,"mtm_spec"][,"scale_factors“] [,"scale_type"]);

                ● sdf_file指定SDF文件及其存放路径

                ● module_instance指定SDF文件的反标范围

                ● sdf_configfile指定SDF配置文件

                ● sdf_logfile指定SDF的log生成文件,这个文件会保存vcs在运行过程中产生的error信息和warning信息。

                ● mtm_spec指定vcs 反标哪一类延迟信息,可以使用“MINIMUM,TYPICAL,MAXIMUM,TOOL_CONTROL(default)”。一般情况下,SS corner需要选择MAXIMUM,即最大的delay(对应最严格的setup检查);FF corner需要选择MINIMUM,即最小的delay(对应最严格的hold检查)

                ● scale_factors指定minimum,typical和maximum延迟的因子。通过冒号分割成3个字符串,默认值是“1.0:1.0:1.0”(可以不填)

                ● scale_type指定在缩放比例之前使用的SDF 文件里面延迟值,可能的值有“FROM_TYPICAL”,“FROM_MIMINUM”,“FROM_MAXIMUM”,“FROM_MTM”(默认值)。重点说明参数scale_type,SDF文件中时序信息都会由3个数字组成,分别对应是minimum,typical,maximum三种情形下的延迟(当然,有时候会只有minimum和maximum的情况,那么typical的延迟没有就省略)。因此,需要打开sdf文件看一下是否有typical的延迟,一般先进工艺下,typical的延迟为空。如果typical的延迟为空,则scale_type就不能选择FROM_TYPICAL(一般默认)。

        (c) 如何确认反标是否完成:在反标完成后,可以从log中看到这样一句话:Annotating SDF file “test.sdf” … Done。打开sim目录下的sdfAnnotateinfo文件,可以看到反标率。

        (d) 反标完成后,通过后仿波形,验证设计中延迟和SDF文件延迟是否一致,比如对于一个register,在SDF反标完成后,它的D端和CP端一般不会同时到达。在反标SDF后,specify块中定义的延迟值不再有用,取代的将是SDF文件中的延迟。所以如果sdf文件的条件信息如果在verilog的specify中没有的话,就会报SDFCOM_INF的warning,意思是IOPATH not found。

        (e) 反标语法:

        `ifdef SDF

        initial begin

                begin

                    $sdf_annotate("../../rtl/post_sim/test.sdf",u_top,,"sdf.log",);

                end

        end

        `endif

(5) 添加input delay:对于模块级或者子系统级的后仿,需要让后端给一个input delay, 即输入的数据信号相对于时钟信号的延时,然后DV根据这个input delay去驱动数据信号。 这个input delay可能会影响模块第一级触发器的时序,delay一般取0.6个时钟周期。添加信号input delay的语法例子:

        int  delay_num = 600;

        wire MST_SLV_awvalid;

        wire DLY_MST_SLV_awvalid;

        initial begin

               if ($value$plusargs("delay_num=%d"), delay_num))

                      $display(“will delay %0d ps”, delay_num)

        end

        assign #(delay_num * 1ps) DLY_MST_SLV_awvalid = MST_SLV_awvalid;

(6) 仿真与violation确认:如果用例失败了,定位是否是时序未加载正确导致的,如果仿真pass了,但报violation了,确认报出来的violation是否是后端进行的时序收敛问题,与设计同事和后端同事一起确认。在后仿过程中,后端同事会不断的更新网表文件跟SDF文件,直到给出他们认为timing clean的版本,在这个版本上,case有望跑通,也不应该出现timing violation。

(7) 后仿的仿真选项

        (a) without sdf

        vcs compile option:

               ● +nospecify 关闭模块的时序检查和路径延时设置

               ● +no_notifier "notifier"在英文中的意思是通知人、通告人,在后仿真过程中他的作用就跟他的英文意思一样。在代码中,notifier是一个reg类型,常作为SystemTimingCheckTask(常用的task如下表所示)的一个参数。选项功能:关掉时序检查产生的不定态。通过这个命令参数可以使时序检查任务中检测到时序违例后,不影响其参数列表中的notifier的值,从而避免了notifier变化引起udp输出不定态的情况,该命令仅对notifier的值有影响,对于时序检查任务检测到的时序违例不产生任何影响。

                ● +notimingcheck 时序检查开关,比如setup/hold/width检查等等,如使用了该option,则仿真时不检查时序,行为类似于RTL仿真。在PR未结束,sdf反标文件还没准备好时,可用该选项忽略延时,可用于功能性的粗略检查。但真正跑后仿真时,不可使用该选项,否则仿真有效性大大降低。在post gate sim可将特定的路径加到no timing check list file中来关闭检查。

                ● +delay_mode_zero 将标准单元库中定义的延时替换成0。testbench中的#延时也都被消除。

                ● +vcs+initreg+random initialize all variables, registers and memories to random value 0 or 1, with the user defined seed

        vcs sim options:

                 ● +vcs+initreg+0 initialize all variables, registers and memories to value 0

        (b) with sdf

        vcs compile option:

                ●+sdfverbose 显示所有的sdf反标错误

                ●+vcs+initreg+random

                ●+neg_tchk 支持负延时检查,带SDF门仿建议加此选项

                ●-negdelay 支持SDF中的负延时 Enables the use of negative values in IOPATH and INTERCONNECT entries in SDF files

                ●-sdfretain 在波形上显示 retain 信息

        vcs sim options:

                ●+vcs+initreg+0

三 仿真过程中的注意事项

3.1 Warning清理

(1) Warning-[DRTZ] Detect delay value roundoff to 0

Delay from design or SDF file roundoff to 0 based in timescalue. Please check dumped diagnostic file (timescale.txt).

这个警告是由于cell的timescale没有设置好,可以查看timescale.txt, 分析cell的timescale是什么。

(2) Warning-[SDFCOM_UHICD]

SDF Warning in instance

logic_mix.FE_OCPUNCOC97857_l2_connector_ram_1_1_data_mem_d_69_ of

module HD45_SH_BFX16:

/home/dspshop/amid/prime_power/tb14/glv_db/

logic_mix.fe_rut.try8.sdf.gz:192, SDF Warning: INTERCONNECT ->

accOutput(uphierarchy), port1 (Z) DEVICE delay applied

This warning is typically issued when one SDF interconnect delay has

to be backannotated on a net going from a device output to an output

port of one hierarchical block.

当SDF的互联延时是从一个cell的output port到up hierarchy的某个输出port时就会报这个警告。因为SDF格式要求INTERCONNECT延时都是某个output/inout到某个input/inout的。仿真器会将这种互联延时加到cell的device延时上面,从波形上看标上去的延时是符合预期的,所以这种警告可以忽略。

(3) Warning-[SDFCOM_NICD]

SDF Warning: Negative INTERCONNECT Delay

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

这种情况是由于SDF中的负interconnect延时不符合VCS的要求,即VCS在该负延时前后找不到正的延时进行合并处理。VCS user guide中说明如下:

To consider a negative INTERCONNECT delay, one of the following should be true:

-Sum of INTERCONNECT and PORT delays should be greater than zero

-Sum of INTERCONNECT and IOPATH delays should be greater than zero

-Sum of INTERCONNECT and DEVICE delays should be greater than zero

Otherwise, the negative INTERCONNECT delay is ignored, and a warning message is generated for the same.

(4) Warning-[SDFCOM_ANICD] Adjust Negative INTERCONNECT DELAY

tb.dut.U1234.X to

tb.dut.U1235.A

该警告的意思是说,将负的互联延时调整到前一个cell的IOPATH上了,提醒你注意一下!

比如,U1234.X->U1235.A的互联延时是-3ps, 而U1234的IOPATH A->X的delay原本是30,现在考虑到负的互联延时,就把U1234的IOPATH调整成30-3=27ps。

要知道EDA工具是很难模拟负延时的,因此只能将负的互联延时合并到前一级cell的IOPATH进行处理。因此就必须要求互联延时+前一级IOPATH延时>0。

(5) Warning-[NTCDNC] Negative Timing Check Did Not Converge[7]

Negative timing check delays did not converge, trying to solve by setting minimum constraint to zero.

当2个以上的timing check使用同一个reference event(比如 posedge ck),且这些timing check检查的时间窗口没有重合时,EDA工具没办法处理这种情况,即负延时检查没有收敛。

图3.1 negative timing check

EDA工具会尝试把最小的一个负值改成0,去尝试解决这个问题。这样做会比原始的检查更为严格,所以是对仿真无害的。

(6) Memory warning

关于memory的warning不应该存在,这有可能会导致sdf加载不成功,进而导致x态传播,最后仿真失败。

3.2 常见问题以及解决技巧

(1) 确认SDF反标是否正确[5]

通过系统函数将SDF反标到DUT上后,会将反标是否正确的信息打印到上述语法中写到的sdf.log中,在分析timing violation之前,先检查sdf.log中的打印信息是否有异常,比如是否存在error或者warning。error一般是sdf和netlist不匹配如某个cell类型不一致,warning可能是后端中加的各种延时仿真工具不能处理报出来的。在sdfAnnotateinfo中,会显示反标率,当反标率没有到达100%需要根据log中的打印信息去分析为什么没有反标上。在先前的后仿中,遇到过model没有反标上的问题,经确认确实反标不上,不影响后仿结果,可以通过config file去除掉。

(2) 确认端口input delay是否生效

在将环境适配完成后,开始仿真后,在分析violation之前,先把后仿真的波形打开看看,看加载的inputdelay正确着没有,符合预期着没有,因为有时候的violation或者功能报错都可能是自己环境里面加载的inputdelay没加载正确造成的。

(3) 无复位端寄存器赋初值

因为无复位端寄存器的面积比有复位端寄存器面积要小,所以有些功能下就会使用无复位端寄存器,在前仿真的时候无复位端寄存器会把x态判断为0进行仿真,不会出现X态传播,但是进行后仿真的时候,如果没有将这些无复位端寄存器赋初值,那么就会出现X态传播,所以后仿真一定要给无复位端寄存器赋初值。具体方法即通过vcs initreg选项给寄存器赋初值,笔者最初在做pre gate sim时,因为没有加入vcs initreg选项,寄存器通路一直出现X态。

(4) 网表中子模块接口信号行为可能和前仿真行为不一致

这里的行为不一致主要包含三个方面:①根据综合时候约束不同,可能会将整个IP进行综合,那么DUT内部子模块的接口信号可能就被综合工具优化处理了。这里说的信号优化,除了将整个信号优化掉,也会将信号的部分bit位优化掉,被优化的bit位在波形上显示是“z”。②信号存在取反现象,经后端工具取反后,部分信号甚至信号的部分bit位的极性存在取反的现象,如果该信号接到UVC上,那么就应该将该信号再取反后再给到UVC。③存在复制的信号,在后仿中,同一个信号可能存在其他复制,而复制的信号又被驱动给其他module。如果在绑定UVC时,UVC只驱动了原信号,而没有驱动这些复制的信号,则可能会导致出错。那当信号被优化掉怎么定位呢?答案是看寄存器的输出值,在后仿网表中寄存器因为要存储信息,一般是不会被优化掉的,而且其行为肯定和前仿真的行为是一致的,所以可以利用后仿网表中的寄存器行为来定位问题。

(5) 时钟信号与复位信号

前面提到在做后仿前,首先要确认工艺角是什么,不同的工艺角对应不同的时钟频率,而时钟频率跟SDF又会影响是否会产生timing violation,所以要根据工艺角确定不同时钟的频率,如果后仿的频率比。确认复位信号是否正确,只有正常解复位了,在此基础上定位其他问题才有意义。

(6) 跨时钟域信号的sync cell

对于工作在异步路径的sync cell, 静态时序分析时没有对它们进行约束和分析,因此在动态仿真时也一定会出现timing violation。针对此问题,可以让后端同事提供一份包含sync cell的list,前端DV再将其整理成notiming config file。

(7) 尽量不要对网表模块内部interface做驱动和采样

从rtl上看,网表顶层的module和下一层module 的interface之间都是直连,之间没有任何逻辑,但被综合成网表后,这两层之间也会加入很多invert和buffer,所以再中间层驱动采样导致的最终结果可能会达不到预期。有的时候,网表顶层没有UVC能够bind的一组bus信号,此时必须将UVC bind到模块内部,这时候,驱动给UVC信号可能要取反。

(8) rst结束之前的timing violation

仿真log中报timing violation的话,需要注意一下报错时间,如果是在DUT rst结束之前的violation,可以忽略。

(9) memory初始化和控制信号

memory有时需要初始化,未初始化会导致数据无法正常读写。需要确认memory的控制信号是否正确。

(10) 仿真时间缩短与资源管理

VCS仿真分为两步:compilation和simulation,这两步都相当花费时间,在这两步上都有方式可以节省时间。在给input delay时,不同组的bus信号可能需要不同的delay的值,可以把这些delay值做成参数化的形势,在simulation阶段可以改配,这样就省去了重新编译的时间,具体方式如2.1中的步骤5所示。在simulation阶段,在对memory写值时,可以考虑采用后门load的方法。

跑后仿需要大量的机器资源,如磁盘空间与服务器内存,在跑仿真的时候,需要额外关注这两项资源,因为后仿不仅仅是你一个提交job在跑,当机器资源耗尽的时候,仿真就会hang住,如果机器资源不能及时缓解,仿真就会停止,不仅会影响到自己,也会影响到其他人。

随着SoC规模的越来越大,后仿的资源消耗不断加剧,仿真时间也变得越来越长,这个时候,一些切分的策略就变得尤为重要。比如可以部分子系统真实网表+部分子系统采用RTL的方式或者真实网表但不带timming check的方式(通过VCS optconfig file可以将部分subsys tree定义为nospecify + no timing check)。采用切分策略做后仿时要注意完备性原则,确保每一个网表都被验证过。

(11) rtl功能级仿真与后仿波形对比

后仿的工具是网表,rtl经后端工具优化后,原有的很多信号都找不到了,此时定位问题十分困难,所以首先应该确认相同的case,相同的seed条件下,前仿是否能仿真通过。如过前仿不能通过,那么此时应该定位前仿的失败原因;如果前仿能够通过,可以将两个case的波形都打开,对比波形,看是哪些地方不一致。对比对象有module的输入输出,模块内部的中间信号(虽然有很多信号被优化掉了,但仍然存在一些信号跟rtl的信号名类似,可以看出含义)。

(12) X态问题的分析定位

在做后仿时,一定会遇到X态的问题,一开始会没有头绪,尝试从以下角度逐步去分析:

  1. 是否所有的DUT input端口都给予了一个known的值。
  2. 是否对没有复位端的寄存器作了初始化。
  3. DUT里有哪些Memory, 是否有必要进行初始化?
  4. 如果是Timing violation引起的X态,则需要先分析Timing violation。一般X态的引入都是来源于timing violation,因为X态是逐级扩散的,所以先从解复位出现的第一个timing violation开始定位。将报错的路径输入verdi中,定位到出错的instance,将时钟,输入以及输出打开,分析violation的原因。如果是时序检查不满足报的violation,可以通过调整delay的值rerun。
  5. 当还没有找到原因,那只能逐级往前追信号,直到追到X态的源头。在追X态时,可以使用verdi的显示信号状态功能。

参考文档

  1. https://zhuanlan.zhihu.com/p/664894328
  2. https://blog.csdn.net/weixin_59028470/article/details/129506523
  3. https://zhuanlan.zhihu.com/p/278523793
  4. https://blog.csdn.net/u011974971/article/details/130589496
  5. https://blog.csdn.net/qq_41360172/article/details/127640701
  6. https://blog.csdn.net/qq_34326957/article/details/140695784
  7. https://blog.csdn.net/HelloQili/article/details/129128625
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值