数字IC验证校招指南_牛客专刊_牛客网

前言

本文来源《数字IC验证校招指南》
https://www.nowcoder.com/tutorial/10096/index


原作者的导入:秋招结束已有数月,在这个过程中笔者收获颇多,再次根据个人经历和感受,简单谈一下对IC验证岗位的校招流程,并总结一篇校招指南。

数字IC验证校招指南_牛客专刊_牛客网_第1张图片

# 岗位介绍


在芯片开发流程中,验证属于前端,验证工程师主要负责尽可能多的发现模块、子系统或系统级设计在RTL阶段(也就是Verilog代码)时隐藏的bug,待测试的模块或系统一般称为DUT(Design Under Test,待测设计)。模块级验证的工作内容有:

  1. 阅读功能文档,提取验证所需要的的信息,如设计接口、寄存器、配置流程等。功能文档一般由leader提供,设计人员和验证人员在一起开一个会,确定自己接下来负责的模块,设计人员根据功能文档进行设计,而验证人员根据功能文档展开验证。由于设计和验证都是各自根据功能文档展开工作,所以在理解上存在一定的偏差,因此在一个项目中,验证人员要尽可能多的与设计人员沟通,互相讨论对设计的理解,可以减少不必要的问题。

  2. 撰写验证计划,计划一般包括:

    1. 使用何种语言或验证方法学搭建验证环境;

    2. 使用哪些EDA工具、验证技术以及对设计进行仿真验证;

    3. 工程师自己从设计功能文档中所理解到的设计功能有哪些,将采用什么样的寄存器配置方式或激励进行测试;

    4. 功能覆盖组的定义和覆盖率收集的方式,功能覆盖率确保需要验证的设计功能有没有疏漏,而代码覆盖率可以发现设计内部的逻辑错误导致的无法执行的语句和冗余的代码;

    5. 验证环境的结构图;

    6. 将会使用到哪些VIP;

    7. 参考模型如何准备;

  3. 根据验证计划使用熟悉的语言和验证方法学搭建环境,并创建若干冒烟测试(冒烟测试的目的是检查环境是否能够正常运行,以及DUT的基本功能有没有问题,如mem读写、寄存器读写、FIFO读写、总线接口协议是否正确等)。验证环境的初期可以没有Scoreboard(计分板)、refmod(参考模型)以及coverage_model(覆盖率模型),只需要保证该环境具有可扩展性、复用性,以及能够基于该环境创建需要的测试用例就好。

  4. 根据验证计划,逐一测试设计的功能。在这个部分大概率需要Scoreboard和refmod,用于检查功能上的错误。Scoreboard由验证人员定义,而Refmod可以使用C模型或自己定义。每一个功能可以由一个或多个TC(Test Case,测试用例)测试,在多种随机约束的范围下保证该功能点的正确性。当然,只测试功能文档中的功能点是不够的,验证人员需要脑洞大开,尽量描述多种边界场景,测试DUT的极限情况,这样才能更有效的挖掘设计中潜在的bug。

  5. 定义覆盖率模型,用于收集功能覆盖率。

  6. 回归测试,合并每一条用例收集到的覆盖率数据。若没有达到目标,则需要继续创建TC提高覆盖率。

  7. 与leader和设计人员开会进行review,检查在整个验证过程中是否存在疏漏。这种review会议可能会开很多次,每一次之后设计和验证人员都要完善自己的工作内容。

  8. 写一份验证报告,作用是向leader汇报,以及在将来别人接手该工作时能有个幼小的参考。验证报告的内容因公司而异,笔者大概总结必须要有的报告内容:

    1. 验证环境的目录、编译命令、仿真命令;

    2. 最终验证环境的结构图;

    3. 验出的bug和是否修复;

    4. 若覆盖率没有达到100%,则需要给出功能覆盖率或代码覆盖率没有达到100%的原因。

系统级与模块级的验证工作存在一定的差别,因为系统是由已经验证过的模块集成而成,因此在模块级基本没有bug,所以系统级验证的关注点主要放在集成连线、系统级场景描述和性能测试上。由于笔者只接触过模块级的验证,因此关于系统级验证不做过多阐述。而当你负责的模块完成验证后,这个模块会被放到子系统或系统中进行验证,你的验证环境也可能被复用到系统级验证环境中,到时候系统级的的验证负责人可能会频繁的询问你对于模块的理解和模块级环境的使用。

就笔者本人而言,使用的验证语言为SystemVerilog,验证方法学为UVM,这也是业界使用最广泛的语言和方法。使用的EDA工具为VCS、Verdi和eman,使用VCS进行编译仿真、波形查看以及消息打印,同时VCS也支持C测试,并具有优化过的UVM版本(UVM源码存在一些bug),Verdi和eman配合使用,进行回归测试。

不同公司的验证岗位工作内容大致一样,但可能在语言和工具的使用上有不同,求职者需要根据具体情况学习相应的知识。

# 前期准备


首先投递一个公司先要看清楚公司对岗位的需求,而IC验证岗位中Verilog、SV、UVM基本是必须的,这些都是验证的基础。

## 简历准备

找工作不能少了简历,个人简历内容一般包括:

  • 个人信息;
  • 教育背景;
  • 工作经历;
  • 项目经历;
  • 所获奖项;
  • 专业技能。

个人信息除了姓名、邮箱、电话、学校、专业之外,还有投递岗位、期望工作地、现居城市、当前状态(在校or实习or工作多少年)。教育背景写的就是本科和研究生所在的学校、专业以及主修课程,研究生需要写上研究方向,最好加上学习的时间段,比如本科是2015 ~ 2019,硕士是2019 ~ 2022。工作经历这一栏,有实习或工作过的就可以写上,如果一直在校,这一栏可以不要。建议研究生期间抽空找一个实习工作,且工作内容和秋招岗位相符。工作经历需要写在哪个公司做过什么样的岗位,负责过哪些工作。项目经历里尽量写和期望岗位做的工作一致的,如果实在没有,就写在实验室做过的东西,主要是让公司知道你是有实际的经验,还是仅处于学习过理论的状态。所获奖项可以写奖学金、大赛奖、荣誉奖,反正自己有的都写上就行。专业技能介绍自己会的语言、工具和掌握程度,比如“Verilog熟悉”、“SystemVerilog熟练”,但是注意没有十足的自信不要写“精通”,不然面试时可能会被怼的很惨……

不同公司的同一岗位名称可能会不一样,如IC验证、数字验证、数字IC验证、数字前端验证等,投递简历时注意修改。

## 投递流程

如果公司在学校开宣讲会,则可以进行现场投递,提前准备好纸质版个人简历。有时候宣讲会也会直接进行现场笔试,求职者最好提前了解信息,早做准备。而基本所有公司都会开放网申通道,本人目前接触过三种网申方式:

  • 公司官方网站

  • 邮件投递

  • 微信直接发送简历

公司官网投递直接根据网站内容的指引,将个人信息填入,部分公司需要上传个人简历和证件照等材料。

邮件投递一般是发送一个邮件给公司的HR,邮件附件上传个人简历。发送邮件时记得写上自己是哪个学校,什么专业,投递的是哪个岗位,以及期望工作地。

微信发送简历的渠道较少,如果有机会加到公司HR或者员工的微信,可以直接问能否投递简历,同意后就可以将电子版个人简历发送给对方。

## 个人经验

这里放一份我秋招时的个人简历,一些私密信息我打了码,因为研究生大部分时间在实习,所以没有参加过电赛没有各种奖项,也没发过论文,读者参照这个结构就可以了,注意简历要简约大方,突出重点,不要花里胡哨。

接下来总结一下制作简历的个人经验。

首先制作简历时不要把内容写得太多,1 ~ 2页最优,界面不要花里胡哨,照顾一下HR小姐姐/哥哥。项目经历2~3个就够了,最好挑自己熟悉的项目,如果只是给一个项目打下手,就不要写到简历里了。笔者曾经最开始时在简历上写了5个项目,简历页数有3页半,属实没必要……我在制作简历时在最开始增加了一栏“个人简介”,将自己目前的学习状态和比较拿手的方面总结了一下,并且在一些特长技能上加粗了字体,这样能凸显出自己的优点,更快的让面试官看到,例如“研究过形式验证技术”、“有商用VIP使用经验”、“有自研VIP经验”等。像这种比较独特的技能,而且是其他大部分学生没有接触过的技能,最好都写在简历上,让面试官觉得你很特别,提高通过率。

准备笔试一定要多刷题,最好提前几个月就刷,边刷题边记录自己欠缺的知识点,并针对性的补充学习(牛客网里的笔试题资源很多)。如果是线上笔试,尽量找一个安静的房间,不要因为其他人乱入摄像头导致系统认为你作弊,这样就太亏了。

面试环节一般第一个问题是自我介绍,如果是外企还会有英文自我介绍,提前写一份背熟。自我介绍内容一般有姓名、毕业院校、攻读专业、研究生研究方向、掌握的技能、做过的项目、实习经历、奖项,个人性格等。

不管是哪种面试,到最后面试官大概率会让你提问一个问题,提前准备好一两个就好,不要说没有问题。专业面试可以就刚才提问过的问题展开,比如“面试官你刚才问我的XXX问题有没有更好的说法或者需要补充的地方”,也可以就自身提问,比如“面试官你觉得我现在还需要补充哪一方面的知识,我下去好好学一下”。综合面试可以提问公司业务方面的问题,比如“公司目前芯片是用于哪一领域的,有哪些自研芯片等”,HR面试可以针对入职、实习、培训方面提问,比如“入职后试用期多久,有没有入职培训等”。

最后笔者说一下流程之外增加录用率的办法。

公司一般在7月份左右开启正式秋招(这几年越来越早),而在3到5月份会开启一些实习招聘,录用一些学生在暑假期间到公司实习,我个人建议是能投尽量投,一方面提前感受招聘过程,给秋招攒一些笔试面试经验,另一方面部分公司对于有实习offer的学生会开放绿色通道,比如乐鑫可以免笔试,并且秋招只加一轮HR面试,平头哥在秋招中对于有实习offer的学生只安排一轮面试(技术+HR同时进行)。

公司在秋招前会进行“提前批招聘”,并且有内推名额,建议同学们多打听渠道并尽量在提前批投递简历,或通过内推渠道投递,因为很多公司的提前批或内推是没有笔试的,且面试次数会比正式批少,是很有优势的。同时公司如果在提前批招满,正式批可能会减少招聘数量。

以上就是笔者从自身情况介绍了对IC验证岗位的介绍和校招流程及经验,因此与实际存在一定偏差,读者如有不同看法,请以您为主。附录为一些笔者经历的IC验证岗位的笔试面试题,并附上了笔者实际回答情况,可能有错误或不全面,请理性分析。

# 附录-笔面试经验


笔试

现场笔试就是每人发一张试卷,跟考试一样做题就行。线上笔试一般会提前用邮件通知是否参加某个时间段的某岗位笔试,点击确认后等时间就可以。线上笔试为了防止作弊,一般会要求开启摄像头和麦克风,有的公司会有人实时监控,有的则是随机拍照。

每个公司的笔试题内容相差挺多的,除了岗位需求的知识题目外,有的甚至会考其他岗位的知识,比如验证岗笔试会出设计题目,静态时许分析,甚至后端、封装测试的题目都有,如果真的遇到超纲题,会选就选,不会选只能蒙了。所以这里建议多刷笔试题,除了自身岗位需要的,其他方面的题也尽量多刷一刷。

笔试题目一般有单选、多选、编程、论述。

单选题一般比较简单,只要是好好准备过一般都能秒选答案,除非题目超纲(比如你投递设计岗,结果出一个后端的题)。举个例子:

下列语法不可综合的是

A.$display

B.generate

C.for

D.case

很简单的一道原题,学习过Verilog的伙伴肯定知道选A。系统函数$display用于打印消息,用于验证环境的仿真过程中,因此不能被综合(一个实际电路怎么能打印消息呢……),generate用于动态的生成verilog代码,可以综合,for语句只要代码风格正确,也可以被综合;case为选择语句,可以被综合为选择器或锁存器。

多选题错误率比单选高,因为要求每一个选项都要完全搞懂,举例:

如下哪些采用了one-hot状态机编码

A. 8’d16

B. 8’d20

C. 8’h20

D. 8’h16

one-hot独热码就是一串二进制数中只有一位为1,其余为0。选择时需要注意选项里的进制,d是十进制,h是16进制,都转换为2进制就能选出答案了,答案为AC。

编程题就是出一个小场景,让你写需要的代码,比如使用Verilog设计一个同步FIFO,使用C语言找出最大数最小数,都较为简单,对于实际做过项目或者实验的小伙伴应该不难。

论述题一般比较好回答,而笔者在秋招过程中接触到的个别论述题比较难,比如:

现有一个二Master一Slave的AXI接口,请描述在验证过程中需要测试的功能点有哪些?

这种题目我感觉没有做过实际项目的伙伴可能回答不是跟全面,我的答案是:

  1. Master A到Slave和Master B到Slave的数据通路访问,包括数据读写以及所有AXI协议(burst、wrap、outstanding、地址边界等);

  2. Master A到Slave和Master B到Slave的非法地址访问;

  3. Mater A和Master B同时发起读读、读写、写读、写写时,接口的仲裁情况;

  4. 对Slave的同一地址Master A写Master B能否正确读取,Master B写Master A能否正确读取;

  5. 当AXI接口在工作时给出复位,该模块的状态机是否能正常跳回。

  6. 当两个Master和Slave的时钟频率不同时,以上场景能否正常工作,数据是否会丢失。

本人做过实际的验证项目,但是回答完这道题还是感觉写的不够全面。

尽量提前上网找一些笔试题资源刷一刷、如牛客网、IC相关公众号、知乎等。

笔试通过后就要进行面试,面试一般分为三类:专业面试,综合面试,HR面试。

专业面试

专业面试考察专业知识能力,一般会问该岗位相关的一些问题。我在这里将专业面试题目分为三类:

  1. 简历相关问题;

  2. 专业问题;

  3. 开放类问题

简历相关问题就是面试官根据你的个人简历,从里面挑选一些感兴趣的点进行提问,提问较多的问题就是简历上的项目和实习工作经历,比如“讲一下这个项目你都做了哪些事”、“你在XX这个公司做了什么事,学到了什么东西”。更细节的问题就会问“这个项目里你的验证环境是不是自己写的”,然后进一步问“搭建一个验证环境需要写什么component”、“怎么集成到一起”、“说一下这个agent是怎么写的,driver大概结构是什么样子”等等,总的来说像是一个“简历打假”的过程,因此建议不要写一些自己不熟悉的项目经历或者编造实习工作经历。

专业问题就是问该岗位相关的专业知识,比如语言的语法、工具使用、验证流程之类的,难一点的会让你手撕代码。这里举例几个我面试遇到的专业问题。

  1. Interface怎么传递到环境里?答案:通过uvm_config_db的set和get方法。

  2. 覆盖率有哪些类型?答案:功能覆盖率,代码覆盖率,断言覆盖率。

  3. 在验证环境里如何模拟一个FIFO?答案:可以声明一个队列,配合使用push_front和pop_back方法,或者直接声明一个mailbox,配合put和get方法。

  4. 写一个driver的大致结构。这个问题对于熟练掌握UVM并且做过实际项目的同学不难,需要注意定义的driver继承于uvm_driver,传递正确的参数类,使用工厂注册,正确定义各个phase以及get_next_item和item_done方法。

  5. VCS的编译、链接和仿真命令是什么?答案:vlogan、vcs和运行simv文件,如果掌握的熟练可以顺便说一下每个命令的选项,这样可以让面试官眼前一亮,觉得你是“有点东西”的学生。

以上举例的问题都是和SV、UVM代码和EDA工具相关的问题,但是最好掌握一些总线协议、串口协议的知识,例如AMBA、UART、I2C、SPI、OCP等协议,这些都是很好的加分项。

开放类问题是面试官假设一个工作场景,给出几个问题。这类问题范围比较大,不好总结,毕竟你也不知道会遇到一个什么样的面试官,能想出怎样一个带坑的问题。这里举一个本人实际遇到的问题:

  • 有一个DUT按一种编码规则输入32bit数据,输出1bit判断输入是否符合 编码规则,符合输出1,不符合输出0。请搭建一个验证环境,详细描述环境的构成、逻辑、激励、覆盖率等。在回归测试阶段,如何保证该设计100%正确?

我给出的答案大概是:

  • 描述一个标准的UVM验证环境的结构,由于DUT的接口不是标准总线接口,因此需要自定义agent,根据接口协议写一个driver。transaction中定义带rand的32位变量,以及接口协议相关的变量。scoreboard里根据编码规则定义一个参考模型,实时的从monitor拿到DUT接口数据,并判断编码是否符合规则,并与DUT输出的结果进行对比,记录正确和错误的个数,打印消息。发送激励时根据实际情况定义可配置、复用性好的sequence,在继承于virtual_sequence的sequence中创建、随机化并发送seq,在test中将sequence挂载到virtual_sequencer上。覆盖率可以从32位数据的值、接口协议的场景、寄存器配置的值等方面定义,收集覆盖率时需要从monitor或rgm(寄存器模型)获取相应的类或值,并在合适的时刻进行sample。以上基本都是UVM的基础知识,加上根据实际DUT情况作出的回答。回归测试阶段要保证设计100%正确,最大的问题就在于这个32位的数据有很多值,我回答要保证100%正确,就要把每一种值都测试一遍,但面试官说这样太耗时,有没有其他的方法?我回答说多用几个服务器电脑啥的,把32位数据的值平分成多个范围,放到不同服务器并行跑仿真,减少耗时……面试官说嗯可以……

综合面试

综合面试不是HR面试,但也不会问太多专业方面的问题,一般由岗位所在的部门主管面试。

综合面试一般考察的是你在工作中遇到问题会怎么解决,和同事、上下级相处的方式,或者在学校的一些经历等等。比如:

  • 由于公司流程不规范的问题导致部门之间或同事之间存在“中间事”,分析一下怎么解决?

  • 如果领导安排的项目中有自己的知识盲区,你会怎么办?

  • 如果工作过程中突然安排了很紧急的事情,你会怎么办?

这类问题没有准确的正确答案,我感觉完全看自己的真实想法。但是总结一下,提高通过率的办法就是把自己塑造成一个勤恳工作、学习能力强、守规矩的老实人……然后根据这种人设回答问题就可以了。

HR面试

HR面试是所有面试中最轻松的,因为只要你走到这里,就已经离录取不远了。HR面试由该公司的HR进行面试,问的问题和专业知识无关,但和综合面试很像,而且每一家公司的HR问的问题有时候会重复,所以提前上网查一下HR最喜欢问的问题和回答技巧,基本都可以通过。这里举一些很常见的HR面试的问题:

  • 你认为自己有哪些优缺点?

  • 你做过最有成就感的事情是什么?

  • 能接受加班吗?(呵呵呵……)

  • 谈过男/女朋友吗?

其他的就不举例了,这类问题提前准备好就能应对过去。

后记

  • 原文出处已注明,若对相关人员造成影响,望海涵。顺便推荐一篇文章:
  • 我们工作到底为了什么(写得太好了,忍不住转载) :https://www.douban.com/group/topic/27229887/?_i=4540923JKfNVdK

你可能感兴趣的:(ic秋招记录·,fpga开发)