2004年本科大四时偶尔看到《计算机体系结构-软硬件接口》以及量化研究方法,从而对计算机组成产生了兴趣,进而选择了芯片设计为硕士专业。硕士期间做过x86以及arm7tdmi的软核开发。

2008年硕士毕业进入A公司从事芯片验证(逻辑功能),一干就是5年。要换工作了,由于年龄增长记忆力减退,为了将来孩子问起爸爸当年工程经历时不至于无从说起,特抽时间对原有经历过的项目,技术有一个相对详细的总结。

 

 

1. 逻辑验证漫谈

说起验证,很多人,尤其是刚毕业的学弟学妹们都有抵触心理。我自己也一直有这种心理,但是不可否认的是,规模较大的项目对验证工程师的知识结构和能力要求还是很高的,一般的知识性要求如下:

  • verilog/vhdl 这个是必须的;
  • systemverilog 这个也是必须的,OVM/UVM已经发展的很不错了,sv的是基础;
  • c 必须的,工程师写个算法,c要有信手拈来的感觉(大学搞过两年acm,c还是比较熟);
  • c++ 必须的,oop的基础,项目大的情形下,oop还是首选,当然ovm/uvm也是oop,不过感觉还是c++/java这种软件的东西更专业一点;(不是常说会sv的不算程序员么:) )
  • scripts 必须的 bash/tcl/perl/... 我对自己的要求是会写一种,能读懂其他就好;

 

对刚入行的学弟学妹,我一般要求c熟练,oop的概念有就行了,当然verilog,vhdl不能少。

对于能力的要求,我觉得就一点,就是必须能debug,设计越复杂,bug越多而且隐藏的越深,为了给后来者以感性认识,后面会举例说明。

 

 

2. SoC验证

SoC验证是验证的一个部分,在A公司,逻辑验证分为很多种,如system level/chip level/core level/block level 等,这种分类是对应于大型系统而言的,例如一代复杂cpu的芯片在开发的工程中,首先会定义功能性能要求,然后定义所需功能模块,对于无法复用的功能模块要组织人手开发验证,这种功能模块验证可以大致对应于corelevel verif,例如cpu的取指单元或者L1L2 cache单元,而block level就像是对L1、L2的这些更细节的点进行验证。chip level可以比作cpu core verif,systemlevel可以比作加上io的验证。

 

我从事的SoC验证是指基于标准IP的system验证,例如某一款手机的应用处理器就是一个SoC,里面的ip包括embedded processor core,graphic processor core,memory controller,usb core,flash controller,gps core, ethernet等等,当SoC设计工程师把这些IP连接到一起(总线)后,如何保证这些ip在一起能够正常工作就是我们的事情了。

 

在这里就体现了对验证工程师的另外一个要求,就是你是否对这些ip接口协议足够熟悉。在arm世界里,amba,axi,ahb,以及挂载在这些总线上的重要ip,如ethernet,usb,pcie是否有足够的了解。这也对验证工程师提出挑战,当然在powerpc的世界里,plb6 plb4 opb dcr和上述总线对应。

SoC验证的假设是IP是经过ip core level的验证的,对SoC应该是golden的,所以SoC会关注于芯片各个ip能否协同工作。如何保证他们协同工作呢,就是通过test pattern或者叫testcase把这些ip配置起来然他们工作一段时间。

 

在A公司,我们有一套叫TOS的系统,Testing Operating System,该系统是一个简单的多任务系统。对于一个操作系统而言,任务调度,进程通信,内存管理,中断管理是其核心功能,但是对于TOS,我们简单化了通信,内存中断管理,任务调度,以及驱动开发。此外增加了debug相关的功能,如log trace功能,增加简单bus接口方便对tb的仿真模块进行控制等。

 

下图为tos中一种testcase的运行过程,首先tos系统booting后,会进入到一个loop,检查是否有ready的case,一旦发现一个或多个就会转到相应的case入口去执行。执行完了会返回给loop并通知exer,执行最后的清理工作。对于多个case的情形,例如ethernet的Transfer case在从memory取数据传输到远端的ethernet,这个过程会持续很久,所以tos加入了yield调用,一旦transfer case调用了yield,程序执行权就回到了tos的那个loop,就会使其他的case也进入运行状态,从而达到多个ip同时工作的情形。

所有的test都用c来书写,最常用的就是对某一个mmio写一个值,或者输出一些log信息等,还是蛮有趣的。

当然,不能忽略的是,把tos启动起来的过程基本上和芯片bringup的过程类似,配置memory空间,分配中断,配置默认寄存器,然后disable reset。

 

 

3. 如何判断SoC验证是否充分

验证永远是不充分的,永远是没有最好的,用一个同事的话说,如果非要给验证订一个期限的话,我希望是一万年。

目前通用的做法是看coverage,SoC验证就是看IP interface的cov和functional point cov。

A公司在coverage上也是很有一套的,后面会说到;此外,我在A公司也有些逆向的评判方法的实验(patented),后面会提到。

 

 

在A公司做了2年的SoC验证后,A公司淘汰了TOS平台,改用另外一种更强大灵活的框架:Fusion。