http://www.cnblogs.com/jyaray/archive/2011/05/11/2043091.html

 

完整的、详细的设计规范是验证工作的重要起点。

  验证工作根据设计规范(Specification)进行,详细的Spec是RTL代码的编写工作的依据,也是验证工作的依据。当验证过程发现DUT的响应与testbench预计的不符时,需要根据Spec判断是DUT出现错误还是testbench出现错误。

参数化的全局定义

  1. Register相关位及其数值的全局宏定义。reg_define.v
  2. 相关路径的全局宏定义。define_board.v
  3. 系统重要变量的显示信息。display.v
  4. 与Register相关的比较任务和报错任务。reg_cmp
  5. 时钟周期参数的定义,一般局部定义,用parameter定义。

存取波形及相应变量的数据,使用`ifdef为全局定义使用

1.波形源头文件是VCD波形,但过于庞大,可用来做功耗分析。

  $dumpfile(“wave.vcd”);

  $dumpvars(0, xxx);

  $dump0ff;

  $dumpflush;

2.SHM波形是Cadence的,可以用simvision打开。

  $shm_open(“wave.shm”);

  $shm_probe(xxx, “AST”);

  $shm_close;

3.FSDB波形是Novas的,可以用nwave打开。

  $fsdbDumpfile(“wave.fsdb”);

  $fsdbDumpvars(0, xxx);

4.VPD波形是Synopsys的,可以用dve打开。

  $vcdplusfile(“wave.vpd”);

  $vcdpluson(0, xxx);

5.变量的存取,可以使用宏来选择变量的存取与否与存取时间使用。

  `ifdef SAVE_LROUT

start_save = 1’b1;

#(10e6)    stop_save = 1’b1;

  `endif

  xxx = $fopen(“xxx”, “w”);

  if (start_save && !stop_save)

  $fwrite(xxx, “%f\n”, x);

  $fclose;

测试案例,case

  1.case本身尽可能模块化。`include”verify.v”

  2.自动的、自检的case,自动报错,以节省测试时间。

  3.覆盖率问题:覆盖率分为功能覆盖率,代码覆盖率,还有人为添加的一些覆盖点的覆盖率。它提供关于仿真的统计信息,包括所经历的结构和转移,以及如何经历。可以决定设计的哪些部分没有被仿真,以知道验证中的薄弱处。最容易实现100%的是代码覆盖率,但是如果verilog代码中使用了case的default,那就很难实现100%覆盖了。功能覆盖率就是一些函数的功能,还有状态机的状态覆盖率等等。然后还有就是验证工程师添加的覆盖点。一般验证工作完成以后要使用这些东西完成报告的。

  4.主要的仿真线程常常用初始语句initial模仿,包含一系列阻塞表达式。

  5.个人认为,写case本身并不是很重要,重要的是你的case里的测试点是否全面,相关的东西测的全不全。

  6.case要尽量提供随机激励信号来增加验证的测试空间,这样能够使验证覆盖的功能空间最大化。这里的随机一般是约束随机,而不是一般意义上的随机一般的随机没有针对性。

  7.case的编写可以分为以下三步:From specification to features, From features to testcase, From testcase to testbenches

  (1)Case编写的第一步是辨别需要验证的特征(feature),不同的feature,适合的验证层次也不同,有些适合在component(unit/reusable/ASIC)级进行验证,有些则必须在system级验证。Component级的feature完全包含在待验证的component中,因此其验证与系统其他模块无关,可以独立进行。System-level features涉及系统多个单元之间的相互作用,System-level features不宜多,能够在Component-level验证的features,不要定义为System-level features。

  (2)形成testcase之前,首先要对Features进行分类:

  Must-have(必须的):设计为了能正常工作或满足市场需要而必须具有的功能,这是first-time success的主要内容,应在各种条件下做彻底的验证。

  Should-have(应该有的):主要用于扩展设计的性能或与竞争对手相区别,只需对基本功能进行验证,若有时间与资源,可做进一步详细验证;

  Nice-to-have(最好有的):做为设计实现的可选项,若时间允许,可验证一次,一般都不做验证。

  根据Features的prioritize,可避免调整验证计划时漏掉must-have features。

  8.  case验证细节也需要划分。比如有些case可以直接通过自检或是通过波形便可知道功能对错,而有些case因为涉及到DSP性能指标(如信噪比、频谱、分离度等),需要验证人员将输出数据导出到MATLAB中得出更加具体的分析。

系统激励

  1. 用MATLAB产生归一化的数据读入Verilog仿真。readmem

    同样可以将仿真后的数据读入到MATLAB中,以分析相关特性。

2. Testbench的时钟和复位应该在全局层次上模仿。用非阻塞赋值初始化testbench的时钟和复位,用阻塞赋值更新它们。

  `timescale 1ns/1ns

  `define PERIOD 5       //100MHz clock

  initial begin

clk <= 0;

forever #(`PERIOD) clk = ~clk;

  end

  initial begin

rst_n <= 0;

@(negedge clk) rst_n = 1;

  end

  3. 时间刻度:根据仿真精度和运行时间平衡来选择。`timescale

  4. 总线功能模型BFM:为仿真模型中定义的接口提供手段。也就是说,设计者没有仿真整个器件的低层次模型,就可以对一组时序或协议的要就进行校验。

后仿文件添加

1. 设计好的testbench一般允许方便地移植到门级仿真,带门级模块的测试台的主要变化是移去了可综合的RTL文件和添加带支持库和时序信息的网表。

  与前仿真相比,后仿真测试对象的变化带来的仿真环境的变化主要体现在两点:

  (1)引脚的连接:在RTL代码和逻辑网表中引脚定义的方式是相同的。但针对同一个逻辑,RTL代码综合后的逻辑网表的引脚命名方式同RTL代码中引脚的命名方式就有一些差别了。

  (2)调用SDF文件:Cadence的仿真工具NC-verilog既可以进行RTL仿真,又可以进行门级仿真。它提供解析SDF的任务,并在仿真的开始调用。

  `ifdef GATE_SIM

  $sdf_annotate ("sdf_file"

{,module_instance}

{,"config_file"}

{,"log_file"}

{,"mtm_spec"}

{,"scale_factors"}

{,"scale_type"} );

2. 设计者必须分别在快和慢两个极端时考虑保持和建立时间的冲突,与此对应,验证人员后仿时的SDF文件有slow_sdf,、fast_sdf 和typical三种。

验证语言与验证方法

  1.Verilog就不说了,是基本,要求是debug的时候能定位到错误发生的位置。

  2.Systemverilog是验证的核心,现在各家大公司用的验证环境几乎清一色的都是使用 systemverilog 搭建的。

  3.C一般是用来写stimulus,一般SoC都有至少一个cpu core,里面放C程序来跑仿真。

  4.至于脚本语言,因为Linux/Unix上基本都是命令行操作,脚本会大大提高你的工作效率,因此也是必须掌握的。脚本一般是在完成验证环境搭建以后,执行相关运行命令和批处理命令等,Perl、Shell、Tcl之类的学会至少一种即可。

  5.常见的验证平台有 VMM 和 OVM,以后还会有UVM。当然现在市场的主力军还是 VMM,但是由于 OVM 是开源的,所以 OVM 发展也是很快的。VMM是synopsys 公司主导使用的,OVM 是由 Cadence 和 mentor 合作开发的。

  6.断言(assert)是个好东西,assert 功能很强大,也很容易上手,能深层次的发掘设计错误,定位很准确,也正是由于这些优点,所以验证工程师不能非常容易的使用它,因为验证工程师一般可以不需要了解太多的设计细节就可以对设计模块进行验证,但是assert 需要比较清楚的了解内部信号,才能将内部信号连接到相应的 assert 上。建议 IC 设计工程师学习哦。

现在一般设计采用层次化设计,相应地验证工作要采用分层验证的方法。

  验证层次一般划分如下:

  –Unit-Level Verification(功能单元的验证)

  –Reusable Components Verification(可重用单元的验证)

  –ASIC and FPGA Verification(ASIC和FPGA验证)

  –System-level Verification(系统级验证)

  –Board-Level Verification(板级验证)

  各验证层次的特点和验证方法分别叙述如下:

  1.  Unit-Level Verification(功能单元的验证) Design unit的划分是一种逻辑划分,随着设计的深入,design unit的功能和接口将发生较大的变化,因此Design unit的验证一般由设计者自行验证,验证的目的是保证设计单元的RTL代码无语法错误且能实现基本的功能,不用考虑代码的覆盖率及递归测试。对于大型设计,每个Design unit都需要一个专门的验证环境,产生激励和检查响应要花去大量的时间,而且每个Design unit都写testbench ,工作量非常之大,所以进行正式的验证过程是不可能的,所以Design unit的验证一般采用ad-hoc(特别)的形式。但Design unit的集成性需在ASIC或FPGA-level进行验证。对于复杂的ASIC设计,可能存在复杂的Design unit,该Design unit的验证需具有较强的可见性与可控性,而且和该Design unit相关的功能尽可能都得到验证。

  2.  Reusable Components Verification(可重用单元的验证) 可重用单元是一种独立的设计部件,和具体应用无关,它具有标准的外部接口,其testbench 具有重用性。修改过的可重用单元应进行递归验证,以保证设计的后向兼容性,如果对设计的功能进行了修改,形式验证不会起作用;设计可重用单元时,应将验证过程以文档的形式加以记录,获取用户对可重用单元的信任;

  3.  ASIC and FPGA Verification(ASIC和FPGA验证) ASIC and FPGA 属于物理上的划分,它们的接口和功能在初步设计时就定义好了,不会有太大改动,这时可进行black-box验证。对于复杂的ASIC芯片,可将ASIC验证做为系统验证;

  4.  System-level Verification(系统级验证) System是一种逻辑上的划分,由独立验证过的部件组成,系统级验证主要验证Design unit之间的相互关系,对于Design unit本身的功能在Unit-level或ASIC-level已进行过验证。为了减少仿真的迭代,对定义的testcase,尽量将testcase不需要的Design unit排除,使system规模尽可能小。

  5.  Board-Level Verification(板级验证) 利用Board-level 设计工具生成的板级模型,设计的物理实现和Board-level仿真之间是一致的,与System 逻辑模型不同。板级模型所包含的组件模型可来自第三方也可用hardware modeler代替,验证时应对板级物理参数进行模拟,保证功能的正确性。Board-level连通性的验证采用形式验证,将对组件管脚连接的描述和Board-level 设计工具生成的网表进行比较。验证时首先要定义验证的粒度等级,如:system level、unit level,同时还需确定各级的testcase,根据对设计实现的把握决定back-box或white-box的testcase,即testcase 的抽象级别,然后确定激励的输出结果及输出结果的检查办法。

转载于:https://www.cnblogs.com/asic/archive/2011/05/18/2049657.html

处女项目后关于IC验证经验的总结相关推荐

  1. 十年磨一剑,两万字长文深剖析分享IC验证经验

    有人认为我验证做得很牛,也有人认为我的验证早就丢下了:有人认为我发现了各个项目的不少问题,也有人认为我在CMM库的几百个问题单大部分属纯净水. 好吧,无论怎样,我还是把我在验证中如何发现和定位Bug的 ...

  2. IC验证工程师高效战斗手册---提问之道(上篇)

    1.为什么先谈这个主题? 如果有人问:"你觉得什么技能是工程师最重要的技能?" 杰瑞IC验证认为,不是你的代码能力或某项具体的技术,而是"提问"的能力. < ...

  3. 华为内部的关于IC验证的经验总结

    华为内部的关于IC验证的经验总结 ----IC验证工程师的"易筋经" 有人认为我验证做得很牛,也有人认为我的验证早就丢下了:有人认为我发现了各个项目的不少问题,也有人认为我在CMM ...

  4. 对 IC 验证有哪些深刻理解?十年资深经验工程师为你解读(二)

    Q:要不要做门级仿真? A:如果是走 design-service,不知道最终带 sdf 的 netlist 仿真是否需要做,如果做的话, 最好在 release 综合后 netlist 的时候也做一 ...

  5. 十几年经验的原华为海思工程师亲述ic验证如何转ic设计

    先简单和你说下我的经历,给你点信心. 我大学学的自动化,第一份工作是软件开发,windows桌面应用,用C和C++:第二份工作本来还是某为终端的软开,但因为个人原因入职推迟了三个月,最后被调到了某思芯 ...

  6. 【数字IC验证快速入门】45、UVM项目实践之APB_SPI(13)UVM 验证方法学总结

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

  7. 【数字IC验证快速入门】22、SystemVerilog项目实践之AHB-SRAMC(2)(AHB协议基本要点)

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

  8. IC验证-SDHOST项目1

    现在越来越多的人转行做IC验证,以至于校招中仅有一个项目明显处于劣势,一般来说比较好入手的项目有SRAMC.SPI.MCDF.SDHOST等. 要了解SDHOST项目首先要了解它的结构以及功能和特性 ...

  9. 【数字IC验证快速入门】36、UVM项目实践之APB_SPI(4)APB_SPI 激励(Sequencer)产生【Sequence 机制】

    导读:作者有幸在中国电子信息领域的排头兵院校"电子科技大学"攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思.清华紫光.联发科技等业界顶尖集成电路相关企业面授课程, ...

最新文章

  1. c#写图像tif gdal_C# GDAL显示TIF
  2. 获取某一周_“双十一”前,这群人备好了3600瓶假冒某品牌护肤品,结果……...
  3. 如何实现一个HTML5 RPG游戏引擎——第一章,实现地图类
  4. 互联网技术架构的启示
  5. 中班机器人教室设计方案_奇思妙想一起玩,机器人来了安格利亚东郡生态幼儿园亲子活动...
  6. 7.1 SAP MASS批量修改操作手册
  7. explicitWidth与width,和用setActualSize()方法有什么区别?
  8. Spring入门-框架搭建
  9. 【python笔记】python基础(注释,缩进,变量,表达式,运算符)
  10. c#调用java的webservice方法,C# 调用 Java WebService | 思考的极致
  11. Jenkins使用教程
  12. CodeLite12.0.0 MinGW 8.1.0 安装配置
  13. 网易2019年实习生招聘笔试题
  14. 【Linux】Linux关闭防火墙、关机重启和查看系统运行级别
  15. 单位dB(分贝)的含义和好处,dBm(dBmW 分贝毫瓦)的含义
  16. word中利用题注实现公式图表自动编号及引用
  17. 分布式id生成器:彻底解决雪花算法时间回拨问题
  18. php学生考勤管理毕业设计源码080900
  19. 数据库select的查询使用方法
  20. FPS中子弹飞行轨迹随视点位置变化而变化的问题

热门文章

  1. Zxing 生成条形码(一维码)
  2. P1823 [COI2007] Patrik 音乐会的等待 单调栈
  3. 后端语言-Coffeescript
  4. 智能新物种!斐讯京东新品日:不可错过的高颜值科技美物
  5. linux鼠标滚轮不能上下滚动页面,Windows10鼠标滚轮无法滚动页面如何解决
  6. deepin QQ/TIM显示不了图片的解决方法
  7. nc java 5.7,用友ERP NC v5.7 ——安装详解篇
  8. 人工神经网络算法的应用,神经网络是机器算法吗
  9. 2023年,大型数据中心PUE将降到1.3以下...
  10. 解决通过微信小程序获取的定位坐标在百度地图渲染误差过大问题