关于IC验证方面的杂谈,涉及验证步骤、主要验证岗位和部分企业验证面试问题(有点真东西)。
IC验证流程主要包括以下几个关键步骤
理解DUT
验证工程师需要深入理解芯片规格,包括架构、数据流向、基本功能、接口、IP、协议和寄存器定义等。这一步是验证工作的基础,只有充分理解规格,后续的验证工作才能充分进行。
制定验证计划
验证计划需要包括验证策略方法、人力资源调配、项目进度评估和风险评估等内容。对于验证工程师来说,主要考虑功能测试点、验证层次、验证方法和验证覆盖率等技术层面的内容。
搭建验证平台
根据验证方案,验证工程师需要编写验证环境,通常会使用UVM平台和Python脚本辅助搭建,并通过冒烟测试确认验证平台的完整性。
提取测试点
验证工程师需要详细分析和提取测试点,这些测试点是验证工作开展的核心依据。测试点的提取需要确保完备性、低耦合性和无歧义。
执行验证
根据提取的测试点,验证工程师需要编写测试用例并在验证平台上执行。这是一个反复迭代的过程,需要不断优化和改进。
完备性分析
在验证过程中和验证结束后,验证工程师需要对功能覆盖率、代码覆盖率和接口完备性进行确认,确保所有需求和接口都已覆盖并且满足要求。
这些步骤构成了一个标准的IC验证流程,每一步都需要仔细规划和执行,以确保验证的质量和完整性。
下面看看市场上招聘IC验证比较多的方向
SOC验证
负责整个芯片系统级的功能验证,包括软硬件协同验证、性能验证和系统集成测试。主要要求:
-
- 完整的SoC架构理解能力软硬件接口协议知识系统性能分析能力FPGA原型验证经验
高速接口验证
专注于各类高速接口IP的功能验证,如PCIe、USB、HDMI等。主要要求:
-
- 深入理解高速接口协议规范信号完整性基础知识协议一致性验证经验高速接口调试能力
处理器验证
负责CPU/GPU/NPU等处理器核心的功能验证。主要要求:
-
- 处理器架构原理深入理解指令集架构知识微架构验证经验性能验证能力
总线协议验证
专注于片上总线和互联网络的验证,如AXI、APB、NoC等。主要要求:
-
- 总线协议规范深入理解带宽和延迟分析能力互联拓扑验证经验死锁检测能力
存储系统验证
多媒体验证
负责视频/音频编解码、图像处理等多媒体IP的验证。主要要求:
-
- 多媒体编解码标准知识图像处理算法理解视频接口协议经验性能和带宽分析能力
下面具体看看各家企业验证岗位面试问题
平头哥(数字IC验证工程师,一面)
-
- 自我介绍验证环境结构完整的验证流程AMBA总线细节:AXI有哪些信号,AHB有哪些信号,resp为error时ready保持几拍Reference model怎么写功能覆盖率怎么定义(手撕代码),采样的信号从哪里来Interface怎么写Sequence怎么挂载到sequencer上,激励怎么发出来(简历)DMA的验证里,功能点有哪些
平头哥(数字IC验证工程师,二面)
-
- 大学学过哪些课程,有什么样的经历。使用PMOS和NMOS实现一个NAND,写出真值表,再用NAND实现一个XOR,只能用NAND。Verilog阻塞和非阻塞赋值。以下两段代码综合出来的电路有什么不同。用verilog实现:一个1bit输入a,一个1bit输出b,当a为x态时,b为1,否则为0。如果a为2bit,a[0]和a[1]只要有一位是x态,b为1,再写一遍verilog。给一个DUT,怎么搭环境,环境里有哪些元素。覆盖率模型里面应该包括哪些?Scoreboard怎么比较数据?如果数据乱序应该怎么比较?黑盒验证有什么缺点?如果采用黑盒验证,测试全部通过,但是设计里的状态机出错(卡在某一状态、没有正确退回初始态等),应该怎么解决。给一个实际案例,有一个DUT按一种编码规则输入32bit数据,输出1bit判断输入是否符合编码规则,符合输出1,不符合输出0。请搭建一个验证环境,详细描述环境的构成、逻辑、激励、覆盖率等。在回归测试阶段,如何保证该设计100%正确?
芯动科技(IC验证,一面)
-
- 项目介绍,验证环境,顶层包含哪些内容?
-
- 分析项目中代码覆盖率,功能覆盖率,断言覆盖率,低或高的原因?
-
- driver sequencer sequence通信机制,代码描述?
-
- 用到了哪些tlm端口,为什么用这个端口,与其他端口区别?怎样配置,使用?如果scoreboard接收数据出错,你怎样处理?怎样理解factory机制?
芯动科技(IC验证,二面)
-
- 在transaction或sequence中定义不是随机类型的变量,在驱动到dut的时候,去指定它的值或者让它随机,应该怎么做?
-
- typedef使用过吗,它的特点,用法?
-
- 覆盖组是怎样写的?覆盖点的约束与事务之间有什么关系?cross ?base ?sequence的理解(询问了下面试官说这是覆盖率相关的说法,根据他的提示,理解后勉强回答了几句)?在对寄存器模型检查中,怎样检查两个寄存器地址是否是真正的对应?
-
- 有哪些变量约束方法?你使用过哪些,在哪些地方使用过?(可添加约束的地方要列举出来)
-
- 知道fifo吗?在验证过程中接触到的fifo有哪些?(我回答队列、信箱、uvm_tlm_anylsis_fifo)
-
- 关联数组,动态数组,队列的区别,关联数组的运行速度怎么样?
- 验证项目中,从自己现在的思维出发提取验证点,你会考虑到哪些,怎样考虑?
进迭时空(IC验证,一面)
-
- 自我介绍
-
- 怎么看待设计和验证
-
- 介绍ip设计
-
- debounce怎么做的?
-
- cdc模块怎么做的?扣cdc细节?为什么打2-4拍不止2拍?
-
- 介绍BT验证项目
-
- 寄存器模型predictor相关功能覆盖率先关。怎么sample的,怎么去掉不需要的采样。
-
- 代码覆盖率相关,分支覆盖率和条件覆盖率的区别。
-
- test plan怎么写的
-
- 印象深刻的bugpython相关,元组与列表,正则匹配,oop反问
字节跳动(IC验证,一面)
一面
自我介绍;
介绍一下mcdf的验证环境
功能覆盖组的定义;具体收集了哪些测试点?千万不要说FIFO掉进坑里面了;
UVM相对于SV的优势?
sequence机制的优点?
virt_seq和virt_sqr的意义;
virt_seq的底层seq如何挂载对应的底层sqr上面;
模块级和系统级验证的区别?
ARM(IC验证)
一面
自我介绍
IIC项目介绍,apb_agt和IIC_agt;
IIC中断功能的验证,举个例子
UVM的factory机制?
UVM的phase机制?
用过哪些仿真工具?
python和shell学过没有?
ASIC设计的流程?
二面
讲讲DUT的功能,验证环境;
cgm的收集了哪些信息?有做cross吗?
sbd如何比较数据?
phase机制的几个核心的phase;
uvm_do的大概执行过程;
fork join三兄弟的区别?
#0的作用
SV除了那三个同步的方法以外还有其他的吗?
进程和线程的区别?
linux下将相应的日志信息输出到某些文件;
#include和#< >的区别?
vlitate关键词开辟空间在哪个阶段?
地平线(IC验证)
自我介绍?
对地平线的了解?
为什么选择IC验证?
实验室项目介绍?
数字IC流程介绍?
中断的概念?中断的应用场景?中断的向量地址?
异步FIFO和同步器的使用场合?
脉冲同步器的介绍,展宽电路的时钟是哪个?
多bit信号为什么不能使用多级DFF?
前仿真和后仿真的概念?
前仿真可以检查亚稳态的问题吗?
综合的输出有SDF文件?
时序约束的概念?
验证无法检查DUT的哪些方面?
$display和$monitor的区别?
知道timeslot吗?
MTK
一面
自我介绍;
写过一些verilog小项目吗;
跨时钟域处理办法;
介绍项目(验证环境、测试点、覆盖率、遇到的问题、接口协议);
断言(a升高,则b连续五个周期保持为高);
一面
介绍IIC项目的验证环境,验证了哪些功能;收集了哪些特性的覆盖率信息。predictor的作用;APB和IIC agent中driver和monitor的作用;scoreboard如何进行数据比对(期望值和实际值),在仿真完成后是否有做检测(面试官说是否测试数据队列里面是否还有数据,如果有错误的数据该如何处理);covergroup和coverpoint和bins的区别;sample是以covergroup还是coverpoint为对象;覆盖组的coverpoint如何定义;
mcdf验证了哪些功能;仲裁器如何验证;将dut内部信号拉出来做验证的时候,需要考虑什么(仲裁器验证为例);
测试点的理解;测试点和测试用例的区别和联系;
手撕代码,枕头检测;当帧头frame_head出现时,检测din是否等于8’h23,如果连续三次出现,则输出一个脉冲信号;
建立时间和保持时间的定义以及违法时解决办法;
阻塞赋值和非阻塞赋值;
跨时钟域同步方法;
IC功耗和哪些参数相关;