数字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接口,请描述在验证过程中需要测试的功能点有哪些?
这种题目我感觉没有做过实际项目的伙伴可能回答不是跟全面,我的答案是:
-
Master A到Slave和Master B到Slave的数据通路访问,包括数据读写以及所有AXI协议(burst、wrap、outstanding、地址边界等);
-
Master A到Slave和Master B到Slave的非法地址访问;
-
Mater A和Master B同时发起读读、读写、写读、写写时,接口的仲裁情况;
-
对Slave的同一地址Master A写Master B能否正确读取,Master B写Master A能否正确读取;
-
当AXI接口在工作时给出复位,该模块的状态机是否能正常跳回。
-
当两个Master和Slave的时钟频率不同时,以上场景能否正常工作,数据是否会丢失。
我做过实际的验证项目,但是回答完这道题还是感觉写的不够全面。
尽量提前上网找一些笔试题资源刷一刷、如牛客网、IC相关公众号、知乎等。
笔试通过后就要进行面试,面试一般分为三类:专业面试,综合面试,HR面试。
专业面试
专业面试考察专业知识能力,一般会问该岗位相关的一些问题。我在这里将专业面试题目分为三类:
-
简历相关问题;
-
专业问题;
-
开放类问题
简历相关问题就是面试官根据你的个人简历,从里面挑选一些感兴趣的点进行提问,提问较多的问题就是简历上的项目和实习工作经历,比如“讲一下这个项目你都做了哪些事”、“你在XX这个公司做了什么事,学到了什么东西”。更细节的问题就会问“这个项目里你的验证环境是不是自己写的”,然后进一步问“搭建一个验证环境需要写什么component”、“怎么集成到一起”、“说一下这个agent是怎么写的,driver大概结构是什么样子”等等,总的来说像是一个“简历打假”的过程,因此建议不要写一些自己不熟悉的项目经历或者编造实习工作经历。
专业问题就是问该岗位相关的专业知识,比如语言的语法、工具使用、验证流程之类的,难一点的会让你手撕代码。这里举例几个我面试遇到的专业问题。
-
Interface怎么传递到环境里?答案:通过uvm_config_db的set和get方法。
-
覆盖率有哪些类型?答案:功能覆盖率,代码覆盖率,断言覆盖率。
-
在验证环境里如何模拟一个FIFO?答案:可以声明一个队列,配合使用push_front和pop_back方法,或者直接声明一个mailbox,配合put和get方法。
-
写一个driver的大致结构。这个问题对于熟练掌握UVM并且做过实际项目的同学不难,需要注意定义的driver继承于uvm_driver,传递正确的参数类,使用工厂注册,正确定义各个phase以及get_next_item和item_done方法。
-
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面试的问题:
-
自我介绍
-
你认为自己有哪些优缺点?
-
你做过最有成就感的事情是什么?
-
能接受加班吗?(呵呵呵……)
-
谈过男/女朋友吗?
-
有没有其他offer?
-
为什么投递我们公司?
其他的就不举例了,这类问题提前准备好就能应对过去。
个人经验
这里放一份我秋招时的个人简历,一些私密信息我打了码,因为研究生大部分时间在实习,所以没有参加过电赛没有各种奖项,也没发过论文,读者参照这个结构就可以了,注意简历要简约大方,突出重点,不要花里胡哨。
接下来总结一下制作简历的个人经验。
首先制作简历时不要把内容写得太多,1~2页最优,界面不要花里胡哨,照顾一下HR小姐姐/哥哥。项目经历2~3个就够了,最好挑自己熟悉的项目,如果只是给一个项目打下手,就不要写到简历里了。我曾经最开始时在简历上写了5个项目,简历页数有3页半,属实没必要……后来一个同校的师兄在内推时提醒我,我才重新修改了个人简历,将项目经历的数量降到两个。项目经历的内容可以参考我的方法:项目的时间线、你在项目中的职位、公司、地点、项目名称写在一栏,然后介绍项目大致内容,责任描述里写自己需要负责的工作是哪些,项目流程可以写详细一些,尽量体现你的工作量和技术水平。我在制作简历时在最开始增加了一栏“个人简介”,将自己目前的学习状态和比较拿手的方面总结了一下,并且在一些特长技能上加粗了字体,这样能凸显出自己的优点,更快的让面试官看到,例如“研究过形式验证技术”、“有商用VIP使用经验”、“有自研VIP经验”等。像这种比较独特的技能,而且是其他大部分学生没有接触过的技能,最好都写在简历上,让面试官觉得你很特别,提高通过率。
准备笔试一定要多刷题,最好提前几个月就刷,边刷题边记录自己欠缺的知识点,并针对性的补充学习(牛客网里的笔试题资源很多)。如果是线上笔试,尽量找一个安静的房间,不要因为其他人乱入摄像头导致系统认为你作弊,这样就太亏了。
面试环节一般第一个问题是自我介绍,如果是外企还会有英文自我介绍,提前写一份背熟。自我介绍内容一般有姓名、毕业院校、攻读专业、研究生研究方向、掌握的技能、做过的项目、实习经历、奖项,个人性格等。
不管是哪种面试,到最后面试官大概率会让你提问一个问题,提前准备好一两个就好,不要说没有问题。专业面试可以就刚才提问过的问题展开,比如“面试官你刚才问我的XXX问题有没有更好的说法或者需要补充的地方”,也可以就自身提问,比如“面试官你觉得我现在还需要补充哪一方面的知识,我下去好好学一下”。综合面试可以提问公司业务方面的问题,比如“公司目前芯片是用于哪一领域的,有哪些自研芯片等”,HR面试可以针对入职、实习、培训方面提问,比如“入职后试用期多久,有没有入职培训等”。
接着我根据个人经验说一下流程之外增加录用率的办法。
公司一般在7月份左右开启正式秋招(这几年越来越早),而在3到5月份会开启一些实习招聘,录用一些学生在暑假期间到公司实习,我个人建议是能投尽量投,一方面提前感受招聘过程,给秋招攒一些笔试面试经验,另一方面部分公司对于有实习offer的学生会开放绿色通道,比如乐鑫可以免笔试,并且秋招只加一轮HR面试,平头哥在秋招中对于有实习offer的学生只安排一轮面试(技术+HR同时进行)。
公司在秋招前会进行“提前批招聘”,并且有内推名额,建议同学们多打听渠道并尽量在提前批投递简历,或通过内推渠道投递,因为很多公司的提前批或内推是没有笔试的,且面试次数会比正式批少,是很有优势的。同时公司如果在提前批招满,正式批可能会减少招聘数量。
此外,我个人建议在秋招前期进行“海投”,大量投递,不管是什么大小公司都可以试着投一下,增加自己笔试面试的机会,让自己被面试官好好怼一遍,从而在这个过程中认识到自己的不足,并进一步查漏补缺。而到秋招中后期进行“精投”,认准自己想去的公司,因为经历了前期的打磨,你已经做好了充分的准备,习惯了面对来自面试官的压力,这样可以提高被心仪公司录取的概率。
最后说一下我了解的各个公司的校招特点。
华为:线上笔试,芯片岗位基本都是单选和多选,内容不难。面试也是线上(疫情导致),分三轮进行,节奏很快,技术面试大概率会手撕代码,并且大部分都是设计的题目。但题目一般不会太难,考察的都是基本电路,比如同步FIFO、序列检测、上升/下降沿检测、串并转换等,也会有一些找电路中的错误的问题。每轮面试结束后最快一个小时就会通知结果。签约在现场。心理测评会刷人,切记!心里测评在笔试面试前,只有通过了才有参加笔试面试的资格。这里给一个建议:在做心里测试前,在知乎上找一下华为心理测试的优选答案,提前记一下,因为心理测试的题目每年基本不会变,题目和选项都是一样的。
展锐:线上笔试,面试使用一个APP(忘了叫啥名字),offer直接带薪资,好像没有商量的过程。
乐鑫:线上笔试,笔试题较难,牛客网有真题,建议练一练。线上面试,面试官的问题也比较专业,手撕代码概率很高,一次面试可能会撕三次代码,非常考验学生的逻辑思维。
联发科:我没有参与联发科的招聘,所以是听朋友说的。线上笔试,笔试题很偏,会考一些模拟电路、信号与系统、汇编等知识。面试不了解,不做介绍。
大疆:线上笔试,笔试很容易刷人,两轮面试,问题不是很难。但是心理测评会刷人,切记!
澜起:线上笔试,写在纸上拍照上传(好麻烦),会考一些大学专业课的知识,但是不难,现场面试,问题不难。
中兴:线上笔试,线下面试,包了一个酒店,每个房间两个面试官,西装领带,面对面坐着,不要紧张……
哲库:线上笔试,两轮线上面试,其他的忘记了……
以上就是我从自身情况介绍了对IC验证岗位的介绍和校招流程及经验,因此与实际存在一定偏差,读者如有不同看法,请以您为主。
原文链接:数字IC验证校招指南--笔面试经验篇