-
2021-08-07 18:12:47
数字IC验证流程,数字IC验证技能
流程:
1.阅读spec
2.根据spec,制定testplan
3.根据testplan,写testcase
4.搭建验证环境
5.跑仿真并debug
6.持续跑 RTL regression
7.持续跑 SDF regression
8.收集代码/功能覆盖率,并完善testplan和增加testcase。技能:
- SV和UVM
数字IC验证工程师的核心技能,越熟练越好。
- EDA工具
一般是VCS+Verdi,越熟练越好。
- 系统
window和linux都要会用,linux一般是小红帽。
- 脚本
一般是perl和shell,还可以学学makefile,python等,会用,主要为了提高工作效率。
- 办公软件
office/vim,会用,提高工作效率,做出好看的ppt和excel
- 知识
了解项目对应的电路背景知识。
更多相关内容 -
IC验证 - uvm验证demo代码
2021-05-10 14:46:35IC验证 - 手把手教你搭建UVM芯片验证环境(含代码) 教学视频里的代码 https://www.bilibili.com/video/BV1yq4y177f6/ -
(IC验证)联发科、华为笔试题.zip
2022-04-07 09:42:52(IC验证)联发科和华为的笔试题,照片拍照留存,可以参考 -
IC验证工作—资料整理v1.pdf
2020-03-27 15:09:02该文档基本涵盖了数字IC验证所需要要的所有知识,涵盖了UVM验证法法学、SystemVerilog基本语法以及数字电路的所有知识,此外还包括了一些常用的验证知识,如Perl、Makefile、shell、TCL等编程语言,实乃居家学习之... -
数字IC验证教程.txt
2021-12-01 09:58:14基础课程 实训项目 ekw -
IC验证简单介绍.docx
2019-05-21 15:54:48这是博主自己根据自己多年的芯片验证经验总结的文档,全面而详实,很经典,非常适合有一些经验但是想要提高的芯片验证工程师学习借鉴。 -
IC验证经验《总结我的思路-如何在验证中发现和定
2019-01-04 16:42:16华为大牛的IC验证经验全总结,非常IC验证工程师适合学习和提高 -
三本关于IC验证的英文书C,SystemVerilog
2019-04-23 16:59:13Hardware Verification with C Hardware Verification with SystemVerilog Verification Methodology Manual for SystemVerilog -
如何成为IC验证工程师?
2021-10-11 16:02:01什么是IC验证工程师?验证是什么意思? 有的同学清楚,有的可能不太清楚。 验证工程师就是根据芯片的需求规格(spec),采用相应的验证语言、验证工具、验证方法,设计并实现验证环境,在芯片生产之前对芯片的功能...首先问个问题?什么是IC验证工程师?验证是什么意思? 有的同学清楚,有的可能不太清楚。
验证工程师就是根据芯片的需求规格(spec),采用相应的验证语言、验证工具、验证方法,设计并实现验证环境,在芯片生产之前对芯片的功能(RTL实现)进行仿真验证,确定设计的功能是否实现了spec中描述的功能,设计的功能是否正确,是否已经完全释放了风险。
“验证”简而言之就是根据芯片的需求规格对设计的芯片“找茬”。
对于芯片设计全流程不清楚的同学,可以先了解下芯片设计流程。
大家都知道芯片设计中流片是非常昂贵的,我们不能等着流片完了再发现问题,那钱就打了水漂,有一些小公司可能就是因为一次流片失败而破产,所以我们要在流片前把各种BUG问题都排除了,这就是验证的价值,因此验证工程师也是IC设计企业中最多的岗位。
一般验证和前端设计的比例是 3:1.验证工程师也是招聘需求最大的岗位,需求量非常大。
IC验证岗位相对于IC设计前端设计、后端设计而言,相对门槛还是低一些的,本科生经过系统的培训和学习,也是可以找到名企工作的,对于转行的同学来说,验证是非常好的选择。而且验证工程师的薪资也是非常高的。
通过几个招聘信息来看一下验证岗位都会干什么?需要什么技能?薪资待遇如何?
我们现在打开BOSS直聘,看一下关于IC验证的招聘信息,我们来看一下,大部分的薪酬都是20~40万,还是非常吸引人的。
当然,这是北京的,在不同的城市,不同的公司区别还是挺大的,一般上海北京深圳广州等一线城市基本25万到40万左右,西安南京等二线城市一般15万~30万之间,具体还要看大家的学历和项目经验,还有自己面试的如何。以前大部分企业都是招聘研究生,现在由于招不到人,有一些公司也开始尝试招聘本科生。这种情况后面会更加的普遍,因为这个行业非常缺人。
另外IC设计企业的员工福利都是非常的好,双休、六险一金,年假、旅游、运动休闲这些都是标配,还有的企业自己有运动场馆,自己的食堂,总之你能想到的福利基本上IC设计企业都有。
我们打开几个具体看一下他们的招聘需求以及岗位职责。
据行业某人才培训公司透露:今年毕业学员一般都是20K以上,有一些优秀的能达到30多万,有去华为海思的的,有去OPPO。就业基本都没困难,且薪资待遇很不错,有985/211的,也有普通本科的,只要大家愿意花时间,付出努力认真学,一定没有问题。
职业发展:
讲了这么多,我想大家对于验证工程师一定有了一些了解,我再给大家讲讲验证工程师的职业发展。
刚开始进入公司的我们作为“小白”,都是从最基础的助理工程师或者初级工程师做起,经过两到三年的历练在成为高级工程师之后,一般会领导会根据大家在项目中的表现以及个人的意愿确定每个人的发展方向,主要分为技术方向和管理方向,在不同的发展方向也会逐级的晋升,达到各领域的专家,最终进入管理层或者合伙创业。
当然随着大家沿着各自发展方向的进步,薪资水平也会相应的增加。但所有的一切都取决于大家在项目中的表现以及贡献。
芯片设计是如何验证的?
在芯片的研制过程大致分为两部分,一部分是前段(也叫逻辑设计),一部分是后端(物理实现),而验证环节贯穿需求定义到最后的物理实现,以及到芯片流片后的测试都有需要验证人员的参与,也就是说验证贯穿了整个芯片研制的全过程。
而在这个过程中,验证主要进行两方面的工作,一部分是前仿真(基于RTL代码的仿真)和后仿真(基于门级网表的仿真)。并且大部分的设计问题都会在前仿真阶段暴露出来,所以在前仿真阶段需要尽可能的覆盖所有功能点,毕竟越到研制流程的后续阶段发现问题,将会导致针对问题的修改成本会越来越高。
因此,一款没有经过验证或者验证不完备的芯片,其本身的功能是不能得到保证的,一旦芯片带着问题流片,带来的损失将是不可估量的。目前芯片研制流片费用相当高昂,基本上都在百万元以上,在芯片的设计过程中存在于设计中的bug,在没有解决的情况下流片后,流片出的芯片很有可能就是“石头”一块,从而会导致产片需要重新设计,而对于更新速度非常快的芯片市场来说,由于芯片的延期而错过最佳投放市场的时间,那么这就是一个“烧钱”的故事。
例如,芯片巨头英特尔是世界上最大且最具影响力的处理器芯片制造商,在20世纪90年代,英特尔也曾因为浮点故障而损失数十亿美元,而本可避免的“烧钱”对于以盈利为目的公司所带来的损失是不可接受的。
因此,面对高昂的芯片设计成本,在流片之前通过验证活动发现所有的bug是非常重要的,验证工程师的核心工作就是对芯片进行充分验证,并且不断迭代的给设计提出验证过程中发现的各种可能存在的问题。
IC验证的流程:
具体的验证过程中,验证工程师一般需要进行两方面的工作,一部分是前仿真(基于RTL代码)和后仿真(基于门级网表)。
进行前仿真时,一般步骤如下:
1.需要熟悉设计规格要求,明确设计要求和待测试的功能
2.制定验证方法和方案,明确怎么验
3.提取测试点,明确验什么
4.验证环境的搭建
5.用例执行,随机测试、定向测试,发现问题
6.验证效果评估,对覆盖率进行统计分析,查漏补缺
进行后仿真,一般是基于后端提供的网表和SDF文件进行时序仿真,仿真的测试用例一般需要覆盖到时序的关键路径,并且在后仿真过程中发现的问题需要反馈给设计人员和后端工程师进行确认。
验证是一件非常有技术含量的事情,我们当然希望把所有的功能,性能,可能发生的问题,都做验证,测试有没有问题,但是时间和成本是有限的,我们必须有方法有策略的来进行验证工作,所以就有了验证方法学。
一般验证方法学通常具有以下原则:
1、受约束随机激励,定向测试
2、功能覆盖
3、事务级分层测试平台
4、可重用测试平台
验证过程中,一般采用的激励策略为受约束的随机测试和定向测试,受约束的随机激励对于设计验证至关重要,可以通过随机测试发现设计中一些验证人员未预料到的一些问题,而定向测试可以找到设计中预期的一些bug。采用不同的激励策略对待测设计进行验证过程中,使用功能覆盖率和代码覆盖率来衡量验证进度。
为了进一步提高验证环境的复用性,目前基于主流的验证方法学构建的验证平台都是分层验证平台,分层测试平台可以将问题分解为更小更易管理的部分,从而帮助控制验证平台的复杂性,通过适当的规划,可以构建一个可以由所有测试用例重用的测试平台架构,而不需要对测试平台进行频繁的修改。
但是构建构建这种测试平台比传统的定向测试平台花费更长的时间,特别是验证环境开发阶段。虽然验证环境开发会花费很长时间,但回报却很高。所有的测试用例都可以重用这个通用的测试平台。 当随机测试的bug发现率开始下降时,可以创建新的随机测试探索设计的新领域。最后几个bug可能只能通过定向测试找到,但绝大多数的bug都可以在随机测试中找到。
目前业界主要用的验证方法学是UVM,相较于其他验证方法学的发展过程如下图:
可见UVM是集百家之长的结晶。UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架。UVM自定义的框架构建类和测试类能够帮助验证工程师减轻环境构建的负担,将更多的精力集中于制定验证计划和创建测试场景。
验证工作当然离不开工具的支持,我们看一下验证工程师常用的EDA工具:
验证工程师常用的EDA工具:
验证工程师是什么,干什么?已经给大家讲清楚了!
如何成为一名验证工程师?
1.首先是本科以上学历,最好是研究生,理工科,最好是有电子信息、计算机类背景;
2.需要有较好的逻辑思维能力,这个能力一般理工科背景的工程师们都不差;
3.验证意识,对任何东西都要有质疑的态度,对问题要刨根问底;
4.具有积极主动的自主学习能力;
5.具有良好的团队沟通能力;
学习的方式:
学习入行的方式有2种,一种是自学,另一种是选择一个培训机构。如果想成为一名验证工程师,那么需要掌握下面必须的技能:
1.常用的EDA工具,一般这些工具对于硬件资源要求较高;
2.设计验证语言,Verilog、SystemVerilog、SVA等;
3.验证方法学,UVM等;
4.常用的脚本语言,pythonn、perl等;
5.常用的标准协议;
6.工程化标准化的验证流程,能够制定验证计划搭建验证平台等;
对于验证工程师需要具备的以上技能,如果采用自学的方式,时间成本将是非常高的,并且缺少实践,对于知识本身的掌握也是不牢固的,为此可以推荐选择专业的、有项目实践的培训班,即可系统学习,还有工程化的工作环境以及大量的实践项目,巩固所学,有效的提升验证技能。
IC设计这个行业是非常重视项目经验的,很多IC设计企业在招聘时很看重这些,所以我们想要找到好的工作,就必须积累一定的项目经验,这是非常重要的。
书本和互联网上的资料很多,但是工程类的工作,如果不上手操作基本上很难留下深刻的印象。可能有人认为可以做一些习题,但是习题往往不具有工程实践。就像大家学书本的英语,如果不去开口跟老外交流,这样的英语是不会被记住的。因此,工程类的技术一定要在具体的项目实践中应用。
求职就业技巧:
最后再给大家分享一些关于求职就业的一些技巧。
一般企业都会进行多轮面试,不过技术面是必不可少的,并且在技术面试对于项目经验会问的比较详细,会涉及到如何完成项目、遇到的问题等等。
一般的面试流程如下:
1.自我介绍
2.验证项目情况,怎么实现的,遇到了什么问题,如何解决等等
3.Verilog、SystemVerilog、UVM经常用到的内容
4.笔试(一般大公司都会有笔试)会涉及专业知识
5.问什么说什么,没有问的不要抢答,任何问题三思而后答
6.情绪保持平淡,沉着理智,不要表现的很亢奋或者很紧张
好了,本次就分享就到这里,最后给大家一点建议,这个行业真的是一次人生机会,如果你觉得自己努力一下就可以抓住,那就不要犹豫,很多时候选择大于努力。祝愿大家能成功进入到这个行业,有一个美好的前程。
-
数字IC验证知识总结
2020-10-07 10:06:23SystemVerilog与功能验证 SystemVerilog硬件设计及建模 SystemVerilog验证方法学 System Verilog Assertions应用指南 Linux命令行与shell脚本编程大全 FPGA之FIFO经验 FPGA面试试题集锦 UVM等... -
IC验证面试常问88道
2021-11-18 01:04:59IC验证面试常问题88道Q1. 定宽数组、动态数组、关联数组、队列各自特点和使用队列:队列结合了链表和数组的优点,可以在一个队列的任何位置进行增加或者删除元素;定宽数组:属于静态数组,编译...IC验证面试常问题88道
Q1. 定宽数组、动态数组、关联数组、队列各自特点和使用
队列:队列结合了链表和数组的优点,可以在一个队列的任何位置进行增加或者删除元素;
定宽数组:属于静态数组,编译时便已经确定大小。其可以分为压缩定宽数组和非压缩定宽数组:压缩数组是定义在类型后面,名字前面;非压缩数组定义在名字后面。Bit [7:0][3:0] name; bit[7:0] name [3:0];
动态数组:其内存空间在运行时才能够确定,使用前需要用new[]进行空间分配。
关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时候使用,类似于
hash
,通过一个索引值和一个数据组成,索引值必须是唯一的。
Q2.多线程fork join/fork join_any/fork join_none的用法差异
Fork join
:内部begin end
块并行运行,直到所有线程运行完毕才会进入下一个阶段。Fork join_any
:内部begin end
块并行运行,任意一个begin end
块运行结束就可以进入下一个阶段。Fork join_none
:内部begin end
块并行运行,无需等待可以直接进入下一个阶段。wait fork
:会引起调用进程阻塞,直到它的所有子进程结束,一般用来确保所有子进程(调用进程产生的进程,也即一级子进程)执行都已经结束。disable fork
:用来终止调用进程 的所有活跃进程, 以及进程的所有子进程。
Q3. 多线程的同步调度方法
多线程之间同步主要由
mailbox、event、 semaphore
三种进行一个通信交互。mailbox邮箱
:主要用于两个线程之间的数据通信,通过put函数和 get 函数还有peek函数进行数据的发送和获取。Event
:事件主要用于两个线程之间的一个同步运行,通过事件触发和事件等待进行两个线程间的运行同步。使用@(event)或者 wait(event.trigger)进行等待,->进行触发。Semaphore
:旗语主要是用于对资源访问的一个交互,通过key的获取和返回实现一个线程对资源的一个访问。使用put和 get函数获取返回key。一次可以多个。
Q4. Task和function的区别
函数能调用另一个函数,但不能调用任务,任务能调用另一个任务,也能调用另一个函数
函数总是在仿真时刻0就开始执行,任务可以在非零时刻执行
函数一定不能包含任何延迟、事件或者时序控制声明语句,任务可以包含延迟、事件或者时序控制声明语句
函数至少有一个输入变量,可以有多个输入变量,任务可以没有或者多个输入(input)、输出(output)和双向(inout)变量
函数只能返回一个值,函数不能有输出(output)或者双向(inout)变量,任务不返回任何值,任务可以通过输出(output)或者双向(inout)变量传递多个值
Q5.简述在TB中使用interface和clocking blocking的好处
Interface
是一组接口,用于对信号进行一个封装,捆扎起来。如果像verilog
中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用interface
接口进行连接,不仅可以简化代码,而且提高可重用性,除此之外,interface
内部提供了其他一些功能,用于测试平台与DUT之间的同步和避免竞争。Clocking block
:在interface
内部我们可以定义clocking
块,可以使得信号保持同步,对于接口的采样vrbg和驱动有详细的设置操作,从而避免TB
与DUT
的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。
Q6. OPP(面向对象)的特性?
封装、继承和多态
封装:通过将一些数据和使用这些数据的方法封装在一个集合里,成为一个类。
继承:允许通过现有类去得到一个新的类,且其可以共享现有类的属性和方法。现有类叫做基类,新类叫做派生类或扩展类。
多态:得到扩展类后,有时我们会使用基类句柄去调用扩展类对象,这时候调用的方法如何准确去判断是想要调用的方法呢?通过对类中方法进行
virtual
声明,这样当调用基类句柄指向扩展类时,方法会根据对象去识别,调用扩展类的方法,而不是基类中的。而基类和扩展类中方法有着同样的名字,但能够准确调用,叫做多态。
Q7. 简述UVM的工厂机制
Factory
机制也叫工厂机制,其存在的意义就是为了能够方便的替换TB中的实例或者已注册的类型。一般而言,在搭建完TB后,我们如果需要对TB进行更改配置或者相关的类信息,我们可以通过使用factory
机制进行覆盖,达到替换的效果,从而大大提高TB的可重用性和灵活性。要使用factory机制先要进行:
将类注册到factory表中
创建对象,使用对应的语句 (type_id::create)
编写相应的类对基类进行覆盖。
Q8. SV中的interface的clock blocking的功能
Interface
是一组接口,用于对信号进行一个封装,捆扎起来。如果像verilog
中对各个信号进行连接,每一层我们都需要对接口信号进行定义,若信号过多,很容易出现人为错误,而且后期的可重用性不高。因此使用interface
接口进行连接,不仅可以简化代码,而且提高可重用性,除此之外,interface
内部提供了其他一些功能,用于测试平台与DUT
之间的同步和避免竞争。Clocking block
:在interface
内部我们可以定义clocking
块,可以使得信号保持同步,对于接口的采样和驱动有详细的设置操作,从而避免TB
与DUT
的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。
Q9. 动态数组和联合数组的区别?
动态数组:其内存空间在运行时才能够确定,使用前需要用new[]进行空间分配。
关联数组:其主要针对需要超大空间但又不是全部需要所有数据的时候使用,类似于hash,通过一个索引值和一个数据组成: bit [63:0] name[bit[63:0]];索引值必须是唯一的。
【关联数组】可以用来保存稀疏矩阵的元素。当你对一个非常大的地址空间寻址时,该数组只为实际写入的元素分配空间,这种实现方法所需要的空间要小得多。
此外,关联数组有其它灵活的应用,在其它软件语言也有类似的数据存储结构,被称为哈希(Hash)或者词典(Dictionary),可以灵活赋予键值(key)和数值(value) 。
Q10. UVM从哪里启动,接口怎么传递到环境中
UVM的启动 总结:
在导入uvm_pkg文件时,会自动创建UVM_root所例化的对象UVM_top,UVM顶层的类会提供run_test()方法充当UVM世界的核心角色,通过UVM_top调用run_test()方法.
在环境中输入run_test来启动UVM验证平台,run_test语句会创建一个my_case0的实例,得到正确的test_name
依次执行uvm_test容器中的各个component组件中的phase机制,按照顺序:
build-phase(自顶向下构建UVM 树)
connet_phase(自低向上连接各个组件)
end_of_elaboration_phase
start_of_simulation_phase
run_phase() objection机制仿真挂起,通过start启动sequence(每个sequence都有一个body任务。当一个sequence启动后,会自动执行sequence的body任务),等到sequence发送完毕则关闭objection,结束run_phase()(UVM_objection提供component和sequence共享的计数器,当所有参与到objection机制中的组件都落下objection时,计数器counter才会清零,才满足run_phase()退出的条件)
执行后面的phase
Q11. 接口怎么传递到验证环境中(uvm_config_db)
传递virtual interface到环境中;
配置单一变量值,例如int、string、enum等;
传递配置对象(config_object)到环境;
传递virtual interface到环境中;
a) 虽然SV可以通过层次化的interface的索引完成传递,但是这种传递方式不利于软件环境的封装和复用。通过使用uvm_config_db配置机制来传递接口,可以将接口的传递与获取彻底分离开。
b) 接口传递从硬件世界到UVM环境可以通过uvm_config_db来实现,在实现过程中应当注意:
c) 接口传递应发生在run_test()之前。这保证了在进入build_phase之前,virtual interface已经被传递到uvm_config_db中。
d) 用户应当把interface与virtual interface区分开来,在传递过程中的类型应当为virtual interface,即实际接口的句柄。
配置单一变量值,例如int、string、enum等;在各个test中,可以在build_phase阶段对底层组件的各个变量加以配置,进而在环境例化之前完成配置,使得环境可以按照预期运行。
传递配置对象(config_object)到环境;
在test配置中,需要配置的参数不只是数量多,可能还分属于不同的组件。对这么多层次的变量做出类似上边的单一变量传递,需要更多的代码,容易出错且不易复用。
如果整合各个组件中的变量,将其放置在一个uvm_object中,再对中心化的配置对象进行传递,将有利于整体环境的修改维护,提升代码的复用性。
Q12. UVM的优势,为什么要用UVM
UVM
其实就是SV
的一个封装,将我们在搭建测试平台过程中的一些重复性和重要的工作进行封装,从而使我们能够快速的搭建一个需要的测试平台,并且可重用性还高。但是UVM
又不仅仅是封装。Q13. 说一下ref类型,你用到过嘛
Ref参数类型是引用
向子程序传递数组时应尽量使用
ref
获取最佳性能,如果不希望子程序改变数组的值,可以使用const ref
类型在任务里可以修改变量而且修改结果对调用它的函数随时可见。
Q14.说一下component和object的区别,item是component还是object
UVM中
component
也是由object
派生出来的,不过相比于object
,component
有很多其没有的属性,例如phase
机制和树形结构等。在UVM
中,不仅仅需要component
这种较为复杂的类,进行TB
的层次化搭建,也需要object
这种基础类进行TB的事务搭建和一些环境配置等。Item是objectQ15. UVM的树形结构
Q16. UVM验证环境的组成
Sequencer
:负责将数据转给driver
driver
负责数据的发送;driver
有时钟/时序的概念。Agent
:其实只是简单的把driver
,monitor
和sequencer
封装在一起。Agent
:对应的是物理接口协议,不同的接口协议对应不同的agent
,一个平台通常会有多个agent
。Env
:则相当于是一个特大的容器,将所有成员包含进去。
Q17. Virtual sequencer 和sequencer的区别
Virtual sequencer
主要用于对不同的agent
进行协调时,需要有一定顶层的sequencer
对内部各个agent
中的sequencer
进行协调virtual sequencer
是面向多个sequencer
的多个sequence
群,而sequencer
是面向一个sequencer
的sequence
群。Virtual sequencer
桥接着所有底层的sequencer
的句柄,其本身也不需要传递item
,不需要和driver
连接。只需要将其内部的底层sequencer
句柄和sequencer
实体对象连接。
Q18.平台往里边输入数据的话怎么输入sequence, sequence,sequencer,driver之间的通信
在多个
sequence
同时向sequencer
发送item
时,需要有ID信息表明该item
从哪个sequence
来,ID信息在sequence
创建item
时就赋值了。Q19. 代码覆盖率、功能覆盖率和断言覆盖率的区别
代码覆盖率——是针对RTL设计代码的运行完备度的体现,包括行覆盖率、条件覆盖率、FSM覆盖率、跳转覆盖率、分支覆盖率,只要仿真就可以收集,可以看DUT的哪部分代码没有动,如果有一部分代码一直没动看一下是不是case没有写到。
功能覆盖率---与
spec
比较来发现,design
是否行为正确,需要按verification plan
来比较进度。用来衡量哪些设计特征已经被测试程序测试过的一个指标
首要的选择是使用更多的种子来运行现有的测试程序;
其次是建立新的约束,只有在确实需要的时候才会求助于定向测试,改进功能覆盖率最简单的方法是仅仅增加仿真时间或者尝试新的随机种子。
验证的目的就是确保设计在实际环境中的行为正确。设计规范里详细说明了设备应该如何运行,而验证计划里则列出了相应的功能应该如何激励、验证和测量
断言覆盖率:用于检查几个信号之间的关系,常用在查找错误,主要是检查时序上的错误,测量断言被触发的频繁程度。
Q20. 为什么选验证?
这个问题很重要,建议好好准备,面试的时候经常会问~
Q21. IC设计流程也即ASIC设计流程
芯片架构-RTL设计-功能仿真-综合&扫描链的插入(DFT)-等价性检查-形式验证-静态时序分析(STA)-布局规划-布局布线-布线图和原理图比较-设计规则检查-GDII
Q22. Find 队列和find index队列
find的队列应该是返回队列的值,一般的话是和with配合使用,find index应该是返回索引值
Q23. 用过断言嘛?写一个断言,a为高的时候,b为高,还有a为高的时候,下一个周期b为高
Q24. 立即断言和并行断言
Q25. 形式验证
形式验证指从数学上完备地证明或验证电路的实现方案是否确实实现了电路设计所描述的功能。形式验证方法分为等价性验证、模型检验和定理证明等。
形式验证主要验证数字IC设计流程中的各个阶段的代码功能是否一致,包括综合前RTL代码和综合后网表的验证,因为如今IC设计的规模越来越大,如果对门级网表进行动态仿真,会花费较长的时间,而形式验证只用几个小时即可完成一个大型的验证。另外,因为版图后做了时钟树综合,时钟树的插入意味着进入布图工具的原来的网表已经被修改了,所以有必要验证与原来的网表是逻辑等价的
Q26. 如何保证验证的完备性?
首先不可能百分百完全完备,即遍历所有信号的组合,这既不经济也不现实。
所以只能通过多种验证方法一起验证尽可能减少潜在风险,一般有这些验证流程:ip级验证、子系统级验证、soc级验证,除这些以外,还有upf验证、fpga原型验证等多种手段。
前端每走完一个阶段都需要跟设计以及系统一起
review
验证功能点,测试用例,以及特殊情况下的波形等。芯片后端也会做一些检查,像sta、formality、DFM、DRC检查等,也会插入一些DFT逻辑供流片回来测试用。流片归来进行测试,有些bug可以软件规避,有些不能规避,只能重新投片
Q27. 启动Sequence的方法
严格意义上有2种:
通过sequence.start的方式显示启动
通过default sequence来隐式启动也可以通过‘uvm_do系列宏启动
Q28. 面向对象编程的优势
易维护:采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
质量高:在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
效率高:在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
易扩展:由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
Q29. 事件的触发
用来触发事件时,使用->;用来等待事件使用@或者wait。
Q30. 约束的几种形式
权重约束 dist:有两种操作符::=n :/n 第一种表示每一个取值权重都是n,第二种表示每一个取值权重为n/num。
条件约束 if else 和->(case):if else 就是和正常使用一样;->通过前面条件满足后可以触发后面事件的发生。
范围约束inside:inside{[min:max]};范围操作符,也可以直接使用大于小于符号进行,但是不可以连续使用,如 min<wxm<max 这是错误的
Q31. 哪些继承于component,哪些继承于object
除了driver、monitor、agent、model、scoreboard、env、test之外全部用uvm_object。
Q32. get_next_item()和try_next_item()有什么区别
get_next_item()
是一个阻塞调用,直到存在可供驱动的sequence item
为止,并返回指向sequence item
的指针。try_next_item()
是非阻塞调用,如果没有可供驱动的sequence item
,则返回空指针。
Q33. 断言 and 和 和 intersect 区别
And
指的是两个序列具有相同的起始点,终点可以不同。Intersect
指的是两个序列具有相同的起始点和终点。Or
指的是两个序列只要满足一个就可以Throughout
指的是满足前面要求才能执行后面的序列
Q34. Break;continue;return的含义,return之后,function里剩下的语句会执行吗
break
语句结束整个循环。continue
立即结束本次循环,继续执行下一次循环。return
语句会终止函数的执行并返回函数的值(如果有返回值的话)。return
之后,function
里剩下的语句不能执行,其是终止函数的执行,并返回函数的值。
Q35. 触发器和锁存器的区别
触发器:时钟触发,受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。
锁存器由电平触发,非同步控制。在使能信号有效时锁存器相当于通路,在使能信号无效时锁存器保持输出状态。触发器由时钟沿触发,同步控制。
锁存器对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;触发器则不易产生毛刺
Q36. 一个简单的UVM验证平台
Q37. 怎么编写测试用例?
主要是编写
sequence
,然后在body
里面根据测试功能要求写相应的激励,然后再通过ref_model
和checker
判断功能是否实现?Q38. 如果有很多测试用例,如何让它们自动执行?
可以写脚本让它们自动执行,例如makefile...
Q39.断言$past的用法
例如让你写abcd四个信号在时钟沿处监测,当cd同时为1时,在时钟的前两个周期要ab同时为1的断言
Q40. 如何关闭约束
通过
constraint_mode(0)
关闭默认范围的约束块constraint_mode(1)
是打开约束可以用
soft
关键字修饰特定的约束语句,这样既可以让变量在一般的情况下取默认值,也可以直接给变量赋默认值范围外的取值。
Q41. 队列的使用方法,以及push back和pop front的区别
队列的使用方法:
insert,delete,push_back和pop_front
Push
插入,pop
取出Front
前边,back
后边Q42. Rand 和randc的区别
rand
修饰符:rand
修饰的变量,每次随机时,都在取值范围内随机取一个值,每个值被随机到的概率是一样的,就想掷骰子一样。randc
修饰符:randc
表示周期性随机,即所有可能的值都取到过后,才会重复取值
Q43. 组件之间的通信机制,analysis port和其它的区别
通信分为,单向通信,双向通信和多向通信
单向通信:指的是从
initiator
到target
之间的数据流向是单一方向的双向通信:双向通信的两端也分为
initiator
和target
,但是数据流向在端对端之间是双向的多向通信:仍然是两个组件之间的通信,是指
initiator
与target
之间的相同TLM端口数目超过一个时的处理解决办法。
blocking阻塞传输的方法包含:
Put():
initiator
先生成数据Tt
,同时将该数据传送至target
。Get():
initiator
从target
获取数据Tt
,而target
中的该数据Tt
则应消耗。Peek():
initiator
从target
获取数据Tt
,而target
中的该数据Tt
还应保留。
通信管道:
TLM FIFO
:可以进行数据缓存,功能类似于mailbox
,不同的地方在于uvm_tlm_fifo
提供了各种端口(put、get、peek)
供用户使用analysis port
:一端对多端,用于多个组件同时对一个数据进行处理,如果这个数据是从同一个源的TLM
端口发出到达不同组件,则要求该端口能够满足一端到多端,如果数据源端发生变化需要通知跟它关联的多个组件时,我们可以利用软件的设计模式之一观察者模式实现,即广播模式analysis TLM FIFO
a. 由于
analysis
端口提出实现了一端到多端的TLM
数据传输,而一个新的数据缓存组件类uvm_tlm_analysis_fifo
为用户们提供了可以搭配uvm_analysis_port
端口uvm_analysis_imp
端口和write()
函数。b.
uvm_tlm_analysis_fifo
类继承于uvm_tlm_fifo
,这表明它本身具有面向单一TLM
端口的数据缓存特性,而同时该类又有一个uvm_analysis_imp
端口analysis_export
并且实现了write()
函数:request & response通信管道 双向通信端口
transport
,即通过在target
端实现transport()
方法可以在一次传输中既发送request
又可以接收response
。
Q44. 简述深拷贝和浅拷贝
浅拷贝可以使用列表自带的
copy()
函数(如list.copy()
),或者使用copy
模块的copy()
函数。深拷贝只能使用copy
模块的deepcopy()
,所以使用前要导入:from copy import deepcopy
如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。
如果拷贝的对象里的元素包含引用(像一个列表里储存着另一个列表,存的就是另一个列表的引用),那浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开。
Q45. 类的public、protected和local的区别
如果没有指明访问类型,那么成员的默认类型是public,子类和外部均可以访问成员。
如果指明了访问类型是
protected
,那么只有该类或者子类可以访问成员,而外部无法访问。如果指明了访问类型是
local
,那么只有该类可以访问成员,子类和外部均无法访问。
Q46. 对UVM验证方法学的理解
刚开始接触的时候,我认为
UVM
其实就是SV
的一个封装,将我们在搭建测试平台过程中的一些重复性和重要的工作进行封装,从而使我们能够快速的搭建一个需要的测试平台,并且可重用性还高。因此我当时觉得它就是一个库。不过,随着学习的不断深入,当我深入理解
UVM
中各种机制和模型的构造和相互之间关系之后,我觉得其实UVM
方法学对于使用何种语言其实并不重要,重要的是他的思想,比如:在UVM
中有sequence
机制,以往如果我们使用SV
进行TB
搭建时,我们一般会采用driver
一个类进行数据的产生,转换,发送,或者使用generator
和driver
两个进行,这种方式可重用性很低,而且代码臃肿;但是在UVM中我们通过将sequence、sequencer、driver、sequence_item
拆开,相互独立而又有联系,因此我们只需关注每一个类需要做的工作就可以,可重用性高。我在学习sequence
时,我经常把sequence
比作蓄水池,sequence_item
就是水,sequencer
就是一个调度站,driver
就是总工厂,通过这种方式进行处理,我们的总工厂不需要管其他,只需处理运送过来的水资源就可以,而sequencer
只需要调度水资源,sequence
只需要产生不同的水资源。而这种处理方式和现实世界中的生产模式又是基本吻合的。除此之外,还有好多好多,其实UVM
方法学中很多思想就是来源于经验,来源于现实生活,而不在乎是何种语言。
Q47. 请谈一下UVM的验证环境结构,各个组件间的关系
画出
UVM
的验证环境结构,如图所示首先,
UVM
测试平台基本是由object
和component
组成的,其中component
搭建了TB
的一个树形结构,其基本包含了driver、monitor、sequencer、agent、scoreboard、model、env、test、top
;然后object
一般包含sequence_item、config
和一些其他需要的类。各个组件相互独立,又通过TLM
事务级传输进行通信,除此之外,DUT
与driver
和monitor
又通过interface
进行连接,实现驱动和采集,最后在top
层进行例化调用test
进行测试。Q48. 举例说明UVM组件中常用的方法,各种phase关系,phase机制作用
UVM
中有很多非常有趣的机制,例如factory
机制,field_automation
机制,phase
机制,打印机制,sequence
机制,config_db
机制等,这些机制使得我们搭建的UVM
能够有很好的可重用性和使得我们平台运行有秩序稳定。例如
phase
机制,phase
机制主要是使得UVM
的运行仿真层次化,使得各种例化先后次序正确。UVM
的phase
机制主要有9个,外加12个小phase
。主要的phase
有build phase、connect phase、run phase、report phase、final phase
等,其中除了run phase
是** task**
,其余都是function
,然后build phase
和final phase
都是自顶向下运行,其余都是自底向上运行。Run phase
和12个小phase
(reset phase、configure phase、main phase、shutdown phase
)是并行运行的,有这12个小phase
主要是进一步将run phase
中的事务划分到不同的phase
进行,简化代码。注意,run phase
和 12个小phase
最好不要同时使用。从运行上来看,9个phase
顺序执行,不同组件中的同一个phase
执行有顺序,build phase
为自顶向下,只有同一个phase
全部执行完毕才会执行下一个phase
。所有的
phase
按照以下顺序自上而下自动执行:(九大phase,其中run phase又分为12个小phase)build_paseconnect_phase
end_of_elaboration_phase
start_of_simulation_phase
run_pase
extract_phase
check_phase
report_phase
final_phase
其中,run_phase按照以下顺序自上而下执行:
pre_reset_phase
reset_phase
post_reset_phase
pre_configure_phase
configure_phase
post_configure_phase
pre_main_phase
main_phase
post_main_phase
pre_shutdown_phase
shutdown_phase
post_shutdown_phase
Q49. phase中的domain概念
Domain
是用来组织不同组件,实现独立运行的概率。默认情况下,UVM
的9个phase
属于common_domain
,12个小phase
属于uvm_domain
。例如,如果我们有两个dirver
类,默认情况下,两个driver
类中的复位phase
和main phase
必须同时执行,但是我们可以设置两个driver
属于不同的domain
,这样两个dirver
就是独立运行的了,相当于处于不同的时钟域(只针对12个小phase
有效)。Q50. run_phase和main_phase之间的关系;
run_phase
和main phase
(动态运行)都是task phase
,且是并行运行的,后者称为动态运行(run-time
)的phase
。如果想执行一些耗费时间的代码,那么要在此
phase
下任意一个component
中至少提起一次objection
,这个结论只适用于12个run-time
的phase
。对于run_phase
则不适用,由于run_phase
与动态运行的phase
是并行运行的,如果12个动态运行的phase
有objection
被提起,那么run_phase
根本不需要raise_objection
就可以自动执行。
Q51. main_phase要如何跳转到reset_phase;
在
main_phase
执行过程中,突然遇到reset
信号被置起,可以用jump()
实现从mian_phase
到reset_phase
的跳转:Q52. UVM组件的通信方式TLM的接口分类和用法,peek和get的差异
UVM
中采用事务级传输机制进行组件间的通信,可以大大提高仿真的速度和使得我们简化组件间的数据传输,简化工作,TLM
独立于组件之外,降低组件间的依赖关系。UVM
接口主要由port、export、imp
;驱动这些接口方式有put、get、peek、transport、analysis
等。其中
peek
是查看端口内部的数据事务但是不删除,get
是获取后立即删除。我们一般会先使用peek
进行获取数据,但不删除(保证put
端不会立马又发送一个数据),处理完毕后再用get
删除。lmp只能作为终点接口,transport表示双向通信,analysis可以连接多个imp(类似于广播)。
Q53. Analysis port是否可以不连或者连多个impport
都可以。
Analysis port
类似于广播,其可以同时对多个imp
进行事务通信,只需要在每一个对应的imp
端口申明write()
函数即可。对比put,get,peek port,
他们都只能进行一对一传输,且也必须申明对应的函数如put()、get()、peek()、can_put()/do_put()
等。Fifo
是可以不用申明操作函数的,其内部封装了很多的通信端口,如analysis_export
等,我们只需要将端口与其连接即可实现通信。Q54. Sequence和item(uvm_sequece,uvm_sequence_item)以及sequence的分类
item
是基于uvm_object
类,这表明了它具备UVM
核心基类所必要的数据操作方法,例如copy、 clone、compare、record
等。item
对象的生命应该开始于sequence
的body()
方法,而后经历了随机化并穿越sequencer
最终到达driver
,直到被driver
消化之后,它的生命一般来讲才会结束。item与sequence的关系 一个
sequence
可以包含一些有序组织起来的item
实例,考虑到item
在创建后需要被随机化,sequence
在声明时也需要预留一些可供外部随机化的变量,这些随机变量一部分是用来通过层级传递约束来最终控制item
对象的随机变量,一部分是用来对item
对象之间加以组织和时序控制的。Sequence的分类:
扁平类
(flat sequence)
:这一类往往只用来组织更细小的粒度,即item实例构成的组织。层次类
( hierarchical sequence)
:这一类是由更高层的sequence用来组织底层的sequence
,进而让这些sequence
或者按照顺序方式,或者按照并行方式,挂载到同一个sequencer
上。虚拟类
(virtual sequence)
:这一类则是最终控制整个测试场景的方式,鉴于整个环境中往往存在不同种类的sequencer
和其对应的sequence
,我们需要一个虚拟的sequence
来协调顶层的测试场景。之所以称这个方式为virtual sequence
,是因为该序列本身并不会固定挂载于某一种sequencer
类型上,而是将其内部不同类型sequence
最终挂载到不同的目标sequencer
上面。这也是virtual sequence
不同于hierarchical sequence
的最大一点。
Q55. Sequence和sequencer的关系
sequence
机制用于产生激励,它是UVM
中最重要的机制之一。sequence
机制有两大组成部分:sequence
和sequencer
。在整个验证平台中
sequence
处于一个比较特殊的位置。sequence
不属于验证平台的任何一部分,但是它与sequencer
之间有着密切的关系。只有在
sequencer
的帮助下,sequence
产生的transaction
才能最终送给driver
;同样,sequencer
只有在sequence
出现的情况下才能体现出其价值,如果没有sequence
,sequencer
几乎没有任何作用。除此之外,
sequence
与sequencer
还有显著的区别。从本质上说,sequencer
是一个uvm_component
,而sequence
是一个uvm_object
。与my_transaction
一样,sequence
也有其生命周期。它的生命周期比my_transaction
要更长一点,其内部的transaction
全部发送完毕后,它的生命周期也就结束了。
Q56. Sequencer的仲裁特性(set_arbitration)及锁定机制(lock和grab)
仲裁特性
锁定机制
Q57. Virtual sequence和virtual sequencer中virtual含义
Virtual
含义就是其sequencer
并不需要传递item
,也不会与driver
连接,其只是一个去协调各个sequencer
的中央路由器。通过virtual sequencer
我们可以实现多个agent
的多个sequencer
他们的sequence
的调度和可重用。Virtual sequence
可以组织不同sequencer
的sequence
群落。Q58. 为什么会有sequence、sequencer以及driver,为什么要分开实现,这样做的好处是什么?
在
UVM
中有sequence
机制,以往如果我们使用SV
进行TB
搭建时,我们一般会采用driver
一个类进行数据的参数,转换,发送,或者使用genetor
和driver
两个进行,这种方式可重用性很低,而且代码臃肿;但是在UVM中我们通过将
sequence、sequencer、driver、sequence_item
拆开,相互独立而又有联系,因此我们只需关注每一个类需要做的工作就可以,可重用性高。我在学习sequence
时,我经常把sequence
比作蓄水池,sequence_item
就是水,sequencer
就是一个调度站,driver
就是总工厂,通过这种方式进行处理,我们的总工厂不需要管其他,只需处理运送过来的水资源就可以,而sequencer
只需要调度水资源,sequence
只需要产生不同的水资源。
Q59. 如何在driver中使用interface,为什么
Interface
如果不进行virtual
声明的话是不能直接使用在dirver
中的,会报错,因为interface
声明的是一个实际的物理接口。一般在dirver
中使用virtual interface
进行申明接口,然后通过config_db
进行接口参数传递,这样我们可以从上层组件获得虚拟的interface
接口进行处理。Config_db
传递时只能传递virtual
接口,即interface
的句柄,否则传递的是一个实际的物理接口,这在driver
中是不能实现的,且这样的话不同组件中的接口一一对应一个物理接口,那么操作就没有意义了。
Q60. 你了解uvm的factory机制和callback机制嘛
Factory
机制也叫工厂机制,其存在的意义就是为了能够方便的替换TB
中的实例或者已注册的类型。一般而言,在搭建完TB
后,我们如果需要对TB
进行更改配置或者相关的类信息,我们可以通过使用factory
机制进行覆盖,达到替换的效果,从而大大提高TB
的可重用性和灵活性。要使用factory
机制先要进行:将类注册到
factory
表中创建对象,使用对应的语句
(type_id::create)
编写相应的类对基类进行覆盖。
Callback
机制其作用是提高TB
的可重用性,其还可进行特殊激励的产生等,与factory
类似,两者可以有机结合使用。与factory
不同之处在于callback
的类还是原先的类,只是内部的callback
函数变了,而factory
是产生一个新的扩展类进行替换。UVM
组件中内嵌callback
函数或者任务定义一个常见的
uvm_callbacks class
从
UVM callback
空壳类扩展uvm_callback
类在验证环境中创建并登记
uvm_callback
Q61. field_automation机制和objection机制
field_automation
机制:可以自动实现copy、compare、print
等三个函数。当使用uvm_field
系列相关宏注册之后,可以直接调用以上三个函数,而无需自己定义。这极大的简化了验证平台的搭建,尤其是简化了driver
和monitor
,提高了效率。UVM
中通过objection
机制来控制验证平台的关闭,需要在drop_objection
之前先raise_objection
。验证在进入到某一phase
时,UVM
会收集此phase
提出的所有objection
,并且实时监测所有objection
是否已经被撤销了,当发现所有都已经撤销后,那么就会关闭此phase
,开始进入下一个phase
。当所有的phase
都执行完毕后,就会调用$finish
来将整个验证平台关掉。如果UVM
发现此phase
没有提起任何objection
,那么将会直接跳转到 下一个phase
中。UVM
的设计哲学就是全部由sequence
来控制激励生成,因此一般情况下只在sequence
中控制objection
。另外还需注意的是,raise_objection
语句必须在main_phase
中第一个消耗仿真时间的语句之前。
Q62. Config_db的作用,以及传递其使用时的参数含义
Config_db
机制主要作用就是传递参数使得TB
的可配置性高,更加灵活。Config_db
机制主要传递的有三种类型:
一种是
interface
虚拟接口,通过传递virtual interface
使得dirver
和monitor
能够与DUT
连接,并驱动接口和采集接口信号。第二种是单一变量参数,如
int,string,enum
等,这些主要就是为了配置某些循环次数,id
号是多少等等。第三种是
object
类,这种主要是当配置参数较多时,我们可以将其封装成一个object
类,去包含这些属性和相关的处理方法,这样传递起来就比较简单明朗,不易出错。
Config_db
的参数主要由四个参数组成,如下所示,第一个参数为父的根parent
,第二个参数为接下来的路径,对应的组件,第三个是传递时的名字(必须保持一致),第四个是变量名。uvm_config_db #(virtual interface) :: set(uvm_root:.get(),"uvm_test_top.c1",'vif",vif); uvm_config_db #(virtual interface) :: get(this,"”,"vif",vif);
Q63. UVM中各个component之间是如何组织运行的,串行还是并行,通过什么机制进行调度的
Component
之间通过在new
函数创建时指定parent
参数指定子关系,通过这种方法来将TB
形成一个树形结构。UVM
中运行是通过Phase
机制进行层次化仿真的。从组件来看各个组件并行运行,从phase
上看是串行运行,有层次化的。Phase
机制的9个phase
是串行运行的,不同组件中的同一个phase
都运行完毕后才能进入下一个phase
运行,同一个phase
在不同组件中的运行也是由一定顺序的,build
和final
是自顶向下。Q64. UVM如何启动一个sequence
启动
sequence
有很多的方法:常用的方法有使用default sequence
进行调用,其会将对应的sequence
与sequencer
绑定,当dirver
请求获得req
时,sequencer
就会调用对应的sequence
去运行body
函数,从而产生req
。除此之外,还可以使用
start
函数进行,其参数主要就是对应的需要绑定的sequencer
和该类的上层sequence
。如此,就可以实现启动sequence
的功能。注意:一般仿真开始结束会在
sequence
中raise objection
和drop objection
Q65. 你所搭建的验证平台为什么要用RAL(寄存器)
首先,我们要了解寄存器对于设计的重要性,其是模块间交互的窗口,我们可以通过读寄存器值去观察模块的运行状态,通过写寄存器去控制模块的配置和功能改变。
然后,为什么我们需要RAL呢?由于前面寄存器的重要性,我们可以知道,如果我们不能先保证我们寄存器的读写正确,那么就不用谈后续 DUT是否正确了,因此,寄存器的验证是排在首要位置的。
那么我们应该用什么方法去读写和验证寄存器呢?采用RAL寄存器模型去测试验证,是目前最成功的方法吧,寄存器模型独立于
TB
之外,我们可以搭建一个测试寄存器的agent
,去通过前门或者后门访问去控制DUT
的寄存器,使得DUT
按照我们的要求去运行。除此之外,
UVM
中内建了很多RAL
的sequence
,用于帮助我们去检测寄存器,除此之外,还有一些其他的类和变量去帮助我们搭建,以提高RAL
的可重用性和便捷性还有更全的覆盖率。
Q66. 前门访问和后门访问的区别
前门访问和后门访问的比较
前门访问,顾名思义指的是在寄存器模型上做的读写操作,最终会通过总线UVC来实现总线上的物理时序访问,因此是真实的物理操作。
后门访问,指的是利用
UVM DPI (uvm_hdl_read()、uvm_hdl_deposit())
,将寄存器的操作直接作用到DUT内的寄存器变量,而不通过物理总线访问。前门访问在使用时需要将
path
设置为UVM_FRONTDOOR
在进行后门访问时,用户首先需要确保寄存器模型在建立时,是否将各个寄存器映射到了
DUT
一侧的HDL
路径:使用add_hdl_path
5. 从上面的差别可以看出,后门访问较前门访问更便捷更快一些,但如果单纯依赖后门访问也不能称之为“正道”。6. 实际上,利用寄存器模型的前门访问和后门访问混合方式,对寄存器验证的完备性更有帮助。
Q67. 后门访问的路径怎么配置
Q68. 如果寄存器的地址不匹配的错误怎么测试出来
在通过前门配置寄存器A之后,再通过后门访问来判断HDL地址映射的寄存器A变量值是否改变,最后通过前门访问来读取寄存器A的值。
Q69. 寄存器模型的常规方法(期望值、镜像值、真实值)
mirror、desired、actual value()
我们在应用寄存器模型的时候,除了利用它的寄存器信息,也会利用它来跟踪寄存器的值。寄存器有很多域,每一个域都有两个值。
寄存器模型中的每一个寄存器,都应该有两个值,一个是镜像值(
mirrored value
) , 一个是期望值(desired value
) 。期望值是先利用寄存器模型修改软件对象值,而后利用该值更新硬件值;镜像值是表示当前硬件的已知状态值。
镜像值往往由模型预测给出,即在前门访问时通过观察总线或者在后门访问时通过自动预测等方式来给出镜像值
镜像值有可能与硬件实际值不一致
Q70. Prediction的分类(自动预测和显式预测)
UVM提供了两种用来跟踪寄存器值的方式,我们将其分为自动预测(
auto prediction
)和显式预测(explicit
)。如果用户想使用自动预测的方式,还需要调用函数
uvm_reg_map::set_auto predict()
两种预测方式的显著差别在于,显式预测对寄存器数值预测更为准确,我们可以通过下面对两种模式的分析得出具体原因。自动预测
如果用户没有在环境中集成独立的
predictor
,而是利用寄存器的操作来自动记录每一次寄存器的读写数值,并在后台自动调用predict()
方法的话,这种方式被称之为自动预测。这种方式简单有效,然而需要注意,如果出现了其它一些
sequence
直接在总线层面上对寄存器进行操作(跳过寄存器级别的write/read
操作,或者通过其它总线来访问寄存器等这些额外的情况,都无法自动得到寄存器的镜像值和预期值。显式预测更为可靠的一种方式是在物理总线上通过监视器来捕捉总线事务,并将捕捉到的事务传递给外部例化的
predictor
,该predictor
由UVM
参数化类uvm_reg_predictor
例化并集成在顶层环境中。在集成的过程中需要将
adapter
与map
的句柄也一并传递给predictor
,同时将monitor
采集的事务通过analysis port
接入到predictor
一侧。这种集成关系可以使得,
monitor
一旦捕捉到有效事务,会发送给predictor
,再由其利用adapter
的桥接方法,实现事务信息转换,并将转化后的寄存器模型有关信息更新到map
中。默认情况下,系统将采用显式预测的方式,这就要求集成到环境中的总线
UVC monitor
需要具备捕捉事务的功能和对应的analysis port
,以便于同predictor
连接。
Q71. 寄存器怎么配置,adapter怎么集成
Q72. AMBA总线中AHB/APB/AXI协议的区别
AHB(Advanced High-performance Bus)
高级高性能总线。APB(Advanced Peripheral Bus)
高级外围总线AXI (Advanced eXtensible Interface)
高级可拓展接口AHB
主要是针对高效率、高频宽及快速系统模块所设计的总线,它可以连接如微处理器、芯片上或芯片外的内存模块和DMA
等高效率模块。APB
主要用在低速且低功率的外围,可针对外围设备作功率消耗及复杂接口的最佳化。APB
在AHB
和低带宽的外围设备之间提供了通信的桥梁,所以APB
是AHB
的二级拓展总线。AXI
高速度、高带宽,管道化互联,单向通道,只需要首地址,读写并行,支持乱序,支持非对齐操作,有效支持初始延迟较高的外设,连线非常多。AHB协议
1. AHB的组成
Master:
能够发起读写操作,提供地址和控制信号,同一时间只有1个Master
会被激活。Slave:
在给定的地址范围内对读写操作作响应,并对Master
返回成功、失败或者等待状态。Arbiter:
负责保证总线上一次只有1个Master
在工作。仲裁协议是规定的,但是仲裁算法可以根据应用决定。Decoder:
负责对地址进行解码,并提供片选信号到各Slave
。每个AHB
都需要1个仲裁器和1个中央解码器。
2. AHB基本信号(经常会问Htrans和Hburst,以及AHB的边界地址怎么确定)
HADDR:32位系统地址总线。
HTRANS:M指示传输状态,NONSEQ、SEQ、IDLE、BUSY。
HWRITE:传输方向1-写,0-读。
HSIZE:传输单位。
HBURST:传输的burst类型,SINGLE、INCR、WRAP4、INCR4等。
HWDATA:写数据总线,从M写到S。
HREADY:S应答M是否读写操作传输完成,1-传输完成,0-需延长传输周期。
HRESP:S应答当前传输状态,OKAY、ERROR、RETRY、SPLIT。
HRDATA:读数据总线,从S读到M。
APB协议及读写操作
1. APB的状态转移
2. APB写操作
3. APB读操作
Q73. 你写过assertion嘛,assertion分几种?简述一下assertion的用法
Assertion
可以分为立即断言和并发断言。立即断言的话就是和时序无关,比如我们在对激励随机化时,我们会使用立即断言,如果随机化出错我们就会触发断言报错。
并发断言的话主要是用来检测时序关系的,由于在很多模块或者总线中,单纯使用覆盖率或者事务
check
并不能完全检测多个时序信号之间的关系,但是并发断言却可以使用简洁的语言去监测,除此之外,还可以进行覆盖率检测。并发断言的用法的话,主要是有三个层次:
序列
sequence
编写,将多个信号的关系用断言中特定的操作符进行表示;属性
property
的编写,它可以将多个sequence
和多个property
进行嵌套,外加上触发事件;assert
的编写,调用property
就可以。编写完断言后我们可以将它用在很多地方,比如DUT
内部,或者在top
层嵌入DUT
中,还可以在interface
处进行编写,基本能够检测到信号的地方都可以进行断言检测。
Q74. a[*3]、a[->3]和a[=3]区别
a[*3]指的是:重复3次a,且其与前后其他序列不能有间隔,a中间也不可有间隔。
a[->3]指的是:重复3次,其 a中间可以有间隔,但是其后面的序列与a之间不可以有间隔。
a[=3]指的是:只要重复3次,中间可随意间隔。
Q75. 项目中会考虑哪些coverage
主要会考虑三个方面吧,代码覆盖率,功能覆盖率,断言覆盖率。
代码覆盖率,主要由行覆盖率、条件覆盖率、
fsm
覆盖率、跳转覆盖率、分支覆盖率,他们是否都是运行到的,比如fsm
,是否各个状态都运行到了,然后不同状态之间的跳转是否也都运行到了。功能覆盖率的话主要是自己编写
covergroup
和coverpoint
去覆盖我们想要覆盖的数据和地址或者其他控制信号。断言覆盖率主要检测我们的时序关系是否都运行到了,比如总线的地址数据读写时序关系是否都有实现。
Q76. Coverage一般不会直接达到100%,当你发现condition未cover到的时候,你该怎么做?
Condition
又称为条件覆盖率,当条件覆盖率未被覆盖时,我们需要通过查看覆盖率报告去定位哪些条件没有被覆盖到,是因为没有满足该条件的前提条件还是因为根本就遗漏了这些情况,根据这个我们去编写相应的case
,进而将其覆盖到。Q77. Function coverage和 code coverage的区别,以及他们分别对项目的含义
功能覆盖率主要是针对
spec
文档中功能点的覆盖检测 -code
覆盖率主要是针对RTL
设计代码的运行完备度的体现,其包括行覆盖率、条件覆盖率、FSM
覆盖率、跳转覆盖率、分支覆盖率(只要仿真就可以,看看DUT
的哪些代码没有动,如果有一部分代码一直没动,看一下是不是case
没写到)。功能覆盖率和代码覆盖率两者缺一不可,功能覆盖率表示着代设计是否具备这些功能,代码覆盖率表示我们的测试是否完备,代码是否冗余。当功能覆盖率高而代码覆盖率低时,表示
covergroup
是不是写少了,case
写少了;或者代码冗余。当功能覆盖率很低而代码覆盖率高时,表示代码设计是不是全面,功能点遗漏;covergroup
写的是不是冗余了。只有当两者覆盖率都高的时候才表明我们验证的大部分是可靠的。代码覆盖率很难达到100%,一般情况下达到90%多已经非常不错了,如果有一部分代码没有被触动到,需要有经验的验证工程师去分析,如果确实没啥问题,就可以签字通过了
Q78. 你在做验证时的流程是怎么样的,你是怎么做的。
对于流程的话
首先第一步我会先去查看
spec
文档,将模块的功能和接口总线时序搞明白,尤其是工作的时序,这对于后续写TB
非常重要;第二步我会根据功能点去划分我的
TB
应该怎么搭建,我的case
大致会有哪些,这些功能点我应该如何去覆盖,时序应该如何去检查,总结列出这样的一个清单;第三步开始去搭建我们的
TB
,包括各种组件,和一些基础的sequence
还有test
,暂时先就写一两个基础的sequence
,然后还有一些环境配置参数的确定等,最后能够将TB
正常运行,保证无误;第四步就是根据清单去编写
sequence
和case
,然后去仿真,保证仿真正确性,收集覆盖率;第五步就是分析收集的覆盖率,然后查看覆盖率报告去分析还有哪些没有被覆盖,去写一些定向
case
,和更换不同的seed
去仿真;第六步就是回归测试
regression
,通过不同的seed
去跑,收集覆盖率和检测是否有其它bug
;第七步就是总结
79.你在进行验证的过程中,碰到过什么难点,重点是什么呢?
刚开始的难点还是TB的搭建,想要搭建出一个可重用性很高的TB,配置灵活的TB还是有一定困难,对于哪些参数应该放在配置类,哪些参数应该放在事务类的抉择,哪些单独配置。
除此之外,还有就是时序的理解,这对于
driver
和monitor
还有sequence
和assertion
的编写至关重要,只有正确理解时序才能编写出正确的TB
。最后就是实现覆盖率的尽可能高,这也是比较困难的,刚开始的
case
好写,也比较快就可以达到较高的覆盖率,但是那些边边角角的case
需要自己去琢磨,去分析还需要写什么case
。这些难点就是重点,还要能够自动化监测判断是否正确。
Q80. 你发现过哪些验证过程中的 bug,如何发现的,怎么解决的?
这个问题面试的时候经常问,建议面试之前考虑一下,再做决定
Q81. 你的验证环境是什么?目录结构是什么样的
我是使用
UVM
验证方法学搭建的TB
,然后在VCS
平台进行仿真的。目录结构的话:主要由RTL
文件、doc
文件、tb
文件、sim
文件、script
文件这几部分。Q82. UVM有什么优缺点:
UVM的优点:UVM有各个机制、促进验证平台的标准化,UVM中
test sequence
和验证平台是隔离独立的,可以更好的控制激励而不需要重新设计agent
. 改变测试sequence
可以简单高效提高代码覆盖率。UVM
支持工业标准,这会促进验证平台标准化。此外,UVM
通过OOP
(面向对象编程)的特点(例如继承)以及使用覆盖组件提高了重复使用率。因此UVM环境方便移植,架构清晰,组件连接方便,有利于进行大规模的验证。UVM的缺点:代码冗余,工作量大,运行速度有缺失
Q83. 通过工厂进行覆盖有什么要求?
无论是重载的类(
parrot
)还是被重载的类(bird
),都要在定义时注册到factory
机制中。被重载的类(
bird
)在实例化时,要使用factory
机制式的实例化方式,而不能使用传统的new
方式。最重要的是,重载的类(
parrot
)要与被重载的类(bird
)有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类。
Q84. 如果环境中有两个config_db set,哪个有效?
UVM
更高的层次更接近用户,为了让用户少和底层组件打交道,所以层次越高优先级越高,高层次的set
会覆盖底层次的set
,如果是层次相同再看时间先后顺序,谁发生的晚谁有效,时间靠后的会覆盖之前的。Q85. VIP怎么写?
阶段1(定义)。
功能特性提取
特性覆盖率创建及映射
VIP的架构
阶段2(VIP基本搭建)
driver,sequencer,monitor (少量特性实现)。
实现基本的端到端的sequence
阶段3(完成monitor与scoreboard)
完成monitor -100%实现(checkers,assertions)
完成scoreboard -100%实现(数据完整性检查)
在monitor中,完成监测到的transaction与function coverage实现映射。
为映射更多的基本功能覆盖率,创建其它sequences。
阶段4(扩充test和sequence阶段)
实现更多sequences,从而获得80%的功能覆盖率
阶段5(完成标准)
Sequence最终可以实现100%的功能覆盖率。
回归测试结果和最终的总结报告。
Q86. 验证流程,验证环境怎么搭
验证流程:
看
spec
文档和协议,将DUT
的功能和接口总线时序搞明白制定验证计划和测试点分解
写
VIP
或者是用别人给的VIP
,搭建验证环境和TB
,包括各种组件,各个模块的pkg
,基础的sequence
还有test
,暂时先就写一两个基础的sequence
,然后还有一些环境配置参数的确定等,最后能够将TB
正常运行,保证无误;根据测试点编写
sequence
和case
,然后去仿真,保证仿真正确性,收集覆盖率;分析收集的覆盖率,然后查看覆盖率报告去分析还有哪些没有被覆盖,去写一些定向
case
,和更换不同的seed
去仿真;回归测试
regression
,通过不同的seed
去跑,收集覆盖率和检测是否有其它bug
;总结
验证环境的搭建:
driver
给DUT
发送激励,montior
监测DUT
输出的数据,参考模型(reference model
)能实现与DUT
相同的功能,scoreboard
把monitor
接受到的数据和reference model
的输出数据进行比对,如果比对成功就表示DUT
能完成设计的功能,Q87. Uvm_component_utils有什么作用
factory
机制的实现被集成在了一个宏中:uvm_component_utils
。这个宏最主要的任务是,将字符串登记在
UVM
内部的一张表中,这张表是factory
功能实现的基础。只要在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。这样,factory
机制可以实现:根据一个字符串自动创建一个类的实例,并且调用其中的函数(function
)和任务(task
),这个类的main_phase
就会被自动调用。
Q88. TLM怎么用
TLM
通信的步骤:
分辨出
initiator
和target,producer
和consumer
。在
target
中实现tlm
通信方法。在俩个对象中创建
tlm
端口。在更高层次中将俩个对象进行连接。
端口类型有三种:
port
,一般是initiator
的发起端。export
,作为initiator
和target
的中间端口。imp
,只能作为target
接受request
的末端。多个
port
可以连接同一个export
或imp
,但是单个port
或export
不能连接多个imp
。
端口的连接:通过
connect
函数进行连接,例如A(initiator)
与B
进行连接,可以使用A.port.connect(B.export)
uvm_*_imp#(T,IMP);IMP定义中第一个参数T是这个IMP传输的数据类型,第二个参数IMP是实现这个接口所在的
component
。
你好,我是酒酒,毕业于成电,自学算法leetcode刷题,双修IC验证,斩获互联网 BAT offer 以及一些IC大厂offer:zeku、展锐、华为、寒武纪、地平线的程序媛 and IC媛一枚~。
日常分享高质量资料,输出面试、工作经验,欢迎围观。
(别问,图片就是本人啦~)
-
一位IC验证工程师工作多年后的感悟
2021-11-14 16:42:57在学校时就对IC有着浓烈的兴趣,毕业后也如愿做了IC验证工作。经过2年的学习和实践,对验证的理解零零散散也有不少,但总没法形成一个比较完整全面的经验谈。这里把我对验证的一些想法记录归纳,由于理解有限,下面...(本文摘自追梦人_小山的新浪博客)
在学校时就对IC有着浓烈的兴趣,毕业后也如愿做了IC验证工作。经过2年的学习和实践,对验证的理解零零散散也有不少,但总没法形成一个比较完整全面的经验谈。这里把我对验证的一些想法记录归纳,由于理解有限,下面的篇幅也许会比较零散。01 验证对于IC的重要性
IC是集成电路的缩写,也就是我们常说的芯片;IC行业的技术门槛高、投入资金大、回报周期长、失败风险高,做一款中等规模的芯片大致需要10多人做1年半,开模的费用一般都在几百万,设计过程的笔误或者设计bug至少都会有上千个,由于设计缺陷或者工艺缺陷很容易造成芯片完全变成所谓的石头,而如果要重新头片不但需要投入额外的费用,更会将芯片上市时间延后至少半年,这些风险对于商业公司来说都是不可接受的。
正因为芯片的高风险,才凸显了验证的重要性。在流片之前,通过验证人员的验证活动发现所有的设计bug,这就显得特别重要。
02 验证的一目标
做验证首先要明确我们做IC验证的目标是什么。上面我们已经提到,由于芯片的高风险、高代价,才更突出了验证的重要性,尤其是芯片规模越来越大,逻辑越来越复杂。
为了保证芯片的成功,验证唯一的目标就是发现所有的bug,做到无漏验、零漏测。
03 验证的两问题
作为验证人员,首先要搞清楚两个问题:
1)我们要验证什么?
2)我们该怎么验?
这两个问题是验证的根本,就如同哲学里的“我是谁、我来自哪儿、我要去哪儿”一样,“我们要验什么?”是给我们指明目标,”我们该怎么验?“则是告诉我们该采用什么样的手段去达到这个目标。
如果这2个问题都没搞清楚,那么没人对你负责验证的模块有信心,毕竟你自己都不知道你的目标是什么,不知道该怎么做才能达到那个目标。这两个问题是验证的核心所在,如果想做好验证,这是前提。
04 验证的三板斧
要想做好验证,保证无漏验、零漏测,以下三个要素是必须要具备的:验证工具的掌握、算法/协议的理解、验证的意识。
1)验证工具的掌握
验证工具包括vmm/uvm等验证方法学、sv/sc等验证语言、vcs等验证仿真工具、perl/python等脚本语言,这些东西是做验证要掌握的基本技能,不论你做什么样的芯片都需要这些东西来支撑你的验证工作。
这些验证工具可以帮助你解决“我们该怎么验”这个问题,当你很好的掌握这些验证工具后,你可以有很多种方法途径去达成你的验证目标。
说实在话,验证工具的东西很多,要想在短时间内全部掌握也不可能,而且很多工具可能在你的验证过程中不会用到。
个人对验证工具的一点感悟是:不要贪求全部掌握,你可以先看书学习实践,把这些东西都学习一遍;在学习的过程中你肯定会发现一些好东西(原来还有这种方法可以让我的xx做的更好);对于那些暂时不知道怎么应用到实践中的东西,你也不要认为它们是没用的,其实只是你不知道用在哪儿而已,在你以后的验证中也许就会发现它的应用场景,当你需要它的时候也许你已经忘记怎么用了,这个没关系,你可以再回去查阅资料,这个相信很快就能解决的,这样有个好处是当你碰到可以用xx的时候你至少能想起曾经看到某个东西可以来实现它,如果你从未学习过,那么你根本就不会想起有这么个方法可以解决它,这才是可怕的,我都不知道这个问题是可以被解决的。
2)算法/协议的理解
芯片要实现什么,不外乎是xx算法、某某协议,算法/协议才是芯片的魂。验证其实也就是验的算法/协议实现是否正确。就跟批改作文一样,只有批改者有一定的文学功底,才能更好的评判作文水平。
因此,验证人员对算法/协议理解越深刻越好,要理解算法的原理以及算法的实现结构,只有这样才能找出其中的corner点。
3)验证的意识
验证的意识究竟是什么,其实我也说不清楚,只能按照我自己的理解写写一些。
· 对任何东西都要有质疑的态度
· 手要伸长,延伸到上下游
· 对问题要刨根问底
05 验证的流程
做任何事情都需要按照一定的流程来走,否则很容易陷入混乱之中,尤其是对于刚入门的新手来说更是如此。我目前接触的通用流程大致如下:
1)提取测试点,明确验什么
· 分析FS/浮点平台,提取芯片的规格及测试点;
· 分析AS/定点平台,提取测试点;
· 分析DS,提取测试点并识别asic与算法的不一致点;
2)制定验证方案,明确怎么验
· 刷新测试点列表,明确测试点的覆盖方式:功能覆盖率、代码覆盖率、直接用例;
· 验证环境的搭建策略,这个步骤是可以做成自动化工具的;
· 验证的重点难点,提前识别重难点,并制定相应的对策;
· 刷新用例列表,明确测试用例的方法及步骤;
3)用例执行,随机测试,发现bug
· 执行直接用例,发现大部分的bug;
· 带随机的大量测试,试图撞出bug;
4)完备性分析,确保无漏验
· FA/AS完备性确认,确认FS/AS中的所有点都已纳入测试点,并确保已被覆盖,包括应用场景;
· 接口完备性确认,保证所有的接口时序都已覆盖,包括正常时序及异常时序;
· 覆盖率确认,分析所有的代码覆盖率、功能覆盖率,保证全部覆盖;
· 代码分析,熟练掌握电路的实现逻辑,保证所有的电路corner都已覆盖;
上述这几个步骤是一个比较规范的流程,只要每个步骤都做好,基本就能做到无漏测、零漏验。
06 验证的后话
1)验证的空间
作为验证人员最希望的情况是:把所有的激励空间都覆盖到,这样就绝对能保证无漏测、零漏验。但实际情况是:芯片规模越来越大,其激励空间近乎无限,同时EDA仿真的速度奇慢,根本无法实现全覆盖,即使是FPGA、EMU等仿真加速器对此也是无能为力。
因此,合理划分激励等价类是相当重要的,但这也一直是验证的难点所在,很多情况下根本就没法分析清楚等价类。
2)CDV验证
CDV就是覆盖率驱动验证的意思,就是写一大堆覆盖率(断言覆盖率、功能覆盖率、代码覆盖率),只要这些覆盖率全都达到的话则表示验证已经完备。
这是我们的目标,其前提是分析清楚我们的测试点覆盖空间,这个分析也是让人头痛的事,没有谁敢拍着胸脯说这个测试点空间是完备的。
3)formal验证
传统的仿真都是动态验证,由于其仿真效率低下无法遍历所有空间,formal这种静态的验证手段则可以遍历所有空间。不过在目前这个阶段,formal还只能适用于百万门级的模块验证,同时目前市面上的formal工具大多要么只对控制逻辑支持较好,要么只对算法逻辑支持较好,几乎没有一款formal工具能完美支持所有的电路逻辑。
4)环境自动化
在验证过程中,搭建验证环境是一个机械性的劳动,但有时候又比较耗费时间而且容易出错,因此把验证环境做成自动化工具,还是能提高不少验证效率的。
5)全部使用直接用例
从验证流程中可以看到,用例执行过程中大部分bug在直接用例过程中被发现,但还有一部分隐藏比较深的bug只有通过随机激励来发现。
这里存在一个问题,随机测试是不可靠的,有很大的概率发现不了隐藏的bug,对此可以有两种方法:
一是采用带约束的随机,这样可以更好的达到边界点,这同样存在概率性问题;
二是所有的corner点全部用直接用例覆盖,这些直接用例执行一次即可发现所有的bug,根本不需要进行长期的随机测试,这要求我们能识别出所有的corner点;
方法二是我们追求的目标,全部用直接用例覆盖,取代长期随机测试,可惜愿望是美好的。
6)复用的东西都BB化
在芯片设计中经常回重用以前的模块,这样不仅加快进度,而且能降低出错风险;但是对于验证人员来说,复用并不一定是好事情,经常会出现这样的事情:由于是复用之前的模块,所以在验证的时候会掉以轻心,结果埋下bug。如果把复用模块当做全新模块来验证,这又要花费大量的时间,可能就会延后芯片的投片时间。
对于复用的模块,验证人员也可以把验证的相关东西做成BB化,后续芯片复用该模块时,也可以复用该验证BB。(本文摘自追梦人_小山的新浪博客)
-
IC验证学习.docx
2021-07-23 07:26:54IC验证学习.docx -
【数字IC验证快速入门】1、浅谈数字IC验证,了解专栏内容,明确学习目标
2021-04-24 11:09:32数字IC验证专栏整体介绍 -
IC验证面试之数电
2021-07-16 15:33:56文章目录1....更多精彩请看IC验证面试之UVM、IC验证面试之断言 1.原码、反码和补码? 原码:在二进数前面增加一位符号位,0表示正数,1表示复数,这种形式的数称为原码。 反码:符号位保留,其他未 -
IC验证,SV语法思维导图(systemverilog语法)七
2022-04-06 21:26:04IC验证,SV语法思维导图(systemverilog语法)七,用《亿图脑图》打开文件,关于IC验证工程师systemverilog语法的学习笔记,学习思维导图,有助于大家在SV的学习上能有所帮助。总共有7部分 -
IC验证,SV语法思维导图(systemverilog语法)六
2022-04-06 21:25:15IC验证,SV语法思维导图(systemverilog语法)六,用《亿图脑图》打开文件,关于IC验证工程师systemverilog语法的学习笔记,学习思维导图,有助于大家在SV的学习上能有所帮助。总共有7部分 -
IC验证,SV语法思维导图(systemverilog语法)五
2022-04-06 21:24:06IC验证,SV语法思维导图(systemverilog语法)五,用《亿图脑图》打开文件,关于IC验证工程师systemverilog语法的学习笔记,学习思维导图,有助于大家在SV的学习上能有所帮助。总共有7部分 -
IC验证流程
2021-06-09 17:50:39#验证流程 ##1、搞清楚要验证的东西 对设计spec进行阅读和理解。spec的理解不是一两天的事,可能要花一两个月的时间去理解。自己应整体一个阅读流程,便于在进行其它项目时可以快速理解spec。 ##2、编写验证计划,... -
IC验证面试常问88道题
2022-05-21 21:21:24转载至公众号“酒酒聊IC编程”总结了面试常问的88个问题 -
IC验证,SV语法思维导图(systemverilog语法)四,
2022-04-06 21:23:08IC验证,SV语法思维导图(systemverilog语法)四,用《亿图脑图》打开文件,关于IC验证工程师systemverilog语法的学习笔记,学习思维导图,有助于大家在SV的学习上能有所帮助。总共有7部分 -
IC验证,SV语法思维导图(systemverilog语法)二
2022-04-06 21:19:16IC验证,SV语法思维导图(systemverilog语法)二,关于IC验证工程师systemverilog语法的学习笔记,学习思维导图,有助于大家在SV的学习上能有所帮助。总共有7部分 -
IC验证——SystemVerilog学习
2020-05-25 15:56:30一般来说,在数字IC验证中,编写testbench文件会采用verilog,但随着设计越来越复杂,为了更方便例化模块,面向对象编程的SystemVerilog(以下简称SV)越来越流行。 下文部分图片和观点摘自《芯片验证漫游指南》刘斌... -
IC验证 MODELSIM仿真教程 新手入门
2021-11-15 18:13:12适合IC验证fpga验证 MODELSIM仿真教程 新手入门 -
IC验证概述
2020-03-20 23:25:18IC验证概述 验证是确保设计和预定的设计期望一致的过程,设计期望通常是通过设计规范来定义的。对于芯片设计,在不同的阶段可以分为:寄存器传输级(RTL)的功能验证、门级的仿真验证、形式验证以及时序验证。我们... -
IC验证学习-从小白到放弃
2020-11-26 10:55:14塔门说,我读研在实验室搞材料,秋招找不到工作了,马老师能不能用混子功法帮我治疗一下,找一份IC验证的工作。 我说可以。 我说,你们在实验室搞材料,不好用,他不服气。 我说小朋友:你两篇SCI来找我一个IC验证... -
IC验证学习笔记总结.rar
2021-09-10 10:10:34IC验证学习笔记总结.rar -
IC验证-SDHOST项目1
2022-04-17 18:30:03现在越来越多的人转行做IC验证,以至于校招中仅有一个项目明显处于劣势,一般来说比较好入手的项目有SRAMC、SPI、MCDF、SDHOST等。 要了解SDHOST项目首先要了解它的结构以及功能和特性 1. 控制器AHB总线接口数据... -
IC验证方法基础
2019-10-29 11:12:39形式验证(Formal Verification)是一种IC设计的验证方法,它的主要思想是通过使用数学证明的方式来验证一个设计的功能是否正确。 形式验证可以分为三大类: 等价性检查(Equivalence Checking)、 形式模型检查... -
IC验证学习路线
2020-11-26 09:32:261、linux:IC开发绝大部分是在linux OS下,梳洗linux是必备技能2、shell:linux下常用的命令未shell,可终端可脚本,必不可少3、EDA工具:工欲善其事必先利其器,公司会把器我们弄好,我们要会使用,常见的百度了、...