异步FIFO模块验证-面试总结

        首先介绍下自己,个人是材料专业转行IC验证,去年秋招也面试了许多场面试,最近临近毕业,想着有空分享一下自己的面试经验。个人面试经验来看面试官基本都会针对异步FIFO进行提问,虽然异步FIFO较为简单,但其实深挖的知识点还是非常多的。

        首先是关于异步FIFO的描述,我的简历以及我给面试官介绍异步FIFO这个项目,基本上都是围绕着以下几点进行介绍。

一、理解异步FIFO设计代码:主要侧重于设计要点(格雷码+俩寄存器同步),代码要看懂

二、制定验证计划、提取验证功能点:(接口方面、功能方面、异常方面)

三、搭建验证平台:主要描述验证平台结构以及数据流方向

四、跑仿真:主要验证了什么

五、收集覆盖率:代码覆盖率和功能覆盖率情况

其中关于第一点(理解异步FIFO设计代码),这块问到的知识点主要有以下: 

(1)什么是异步FIFO?与同步FIFO有何不同?异步FIFO的设计理念和设计要点是什么?同步FIFO和异步FIFO的应用场景分别是什么?

        很多时候面试官的问题是顺着你的答案进行提问,比如你回答了异步FIFO的设计要点是如何得出空满状态位(读写指针采用格雷码编码,并且经过俩级寄存器同步后进行指针对比得出空满状态位),他就会顺着你的答案继续问。 

(2)空满状态位是怎么得出的?为什么要用格雷码编码而不用二进制编码和独热码编码?为什么要经过俩级寄存器的同步再进行指针的对比(涉及到亚稳态)?

(3)亚稳态相关问题:什么是CDC(跨时钟与传输问题)?CDC为什么会产生亚稳态?建立时间和保持时间的概念?如何尽可能降低亚稳态的发生概率?单bit数据怎么进行跨时钟域的传输以及多bit如何进行跨时钟域的传输?

其中关于第二点(验证计划和验证功能点)

        (1)关于这块面试官通常让你介绍一下你的验证功能点  

         验证计划其实就是模块级别的验证,主要用sv语言搭建了验证平台进行验证。验证功能点也相对简单,最最重要的验证点就是功能(异步FIFO的读和写功能),除此之外就是验证接口这块,主要包含时钟和复位,比如验证读写时钟不一致的情况,比如写时钟快,读时钟慢,又或者写时钟慢,读时钟快,以及同时读写,先写再读等情况。异常情况就是FIFO的写满和读空。

其中关于第三点(搭建验证平台)

        关于验证环境这块,大部分面试官只会问验证框架是怎么样的,数据流是怎么样的?极少部分让讲你的某个class具体代码是如何实现的。

        (1)介绍你的验证环境是怎么样的?

        一般来说,从最顶层Top层向下一层一层介绍你的验证环境,比如top里面例化了DUT、interface、env等等。然后env里面又例化了比如driver、monitior等等。

        (2)介绍你的数据流向(读操作和写操作具体怎么进行的)? 

               比如写操作:driver产生数据后通过interface发送给DUT(具体发送到哪个端口?),以及monitior从DUT的哪个端口读取数据(读操作)?

        (3)你的环境中的scoreboard是怎么对比数据的? 不同组件(class)之间是用什么进行通信的(mailbox)?

其中关于第四点(跑仿真验证)

        (1)你是怎么跑仿真的?

        (2)你写了几个case?

        (3)都验证了那些情况?你写scoreboard了吗?scoreboard是怎么实现的?

        (4)采取的定向测试还是随机化测试?你的driver是怎么实现随机化的?

其中关于第五点(覆盖率)

        (1)你是怎么样衡量你的验证完善程度?

                 覆盖率

        (2)代码覆盖率有哪几种?分别讲讲你的代码覆盖率情况?

        (3)功能覆盖率怎么实现?你写了哪些covergroup和coverpoint?最终功能覆盖率的情况如何?

        (4)如果你的代码覆盖率低该怎么改善?功能覆盖率低该怎么改善?

暂时想到这么多,后续想到其他问题继续进行补充。             

        

你可能感兴趣的:(IC验证,面试)