赞
踩
本篇博客依旧针对UART模块的验证项目进行面试总结,也是笔者面试过众多公司所总结整理的
关于UART深挖的可问的知识点还是非常多,本篇博文可以说基本上涵盖大部分可问到的点
关于下列有一些问题我并没有列出答案,是因为这些问题的答案基本上都比较简单或者可以搜到,
读者可自行总结整理下
具体内容如下:
关于UART项目的描述如下,基本分4部分内容
(1)理解Spec并指定验证计划
(2)搭建验证环境
(3)写case进行功能验证
(4)覆盖率的收集并基于覆盖率进行验证的完善
讲一下你做的uart这个项目?
答:关于该问题基本就如上简历分为4部分进行介绍,在你介绍过程中或者介绍结束,面试官会针对其中的细节进行进一步深入提问。
以下为面试官进一步深入提问的相关问题。
1.什么是uart?uart是用来做什么的?它的应用场景是怎么样的?它是挂在哪个总线上面?uart的协议是怎么样的能介绍下吗,它是怎么收发数据的?
2.你简历中写了理解APB协议,那你能简单介绍下APB协议吗?APB协议有哪些接口信号,分别是哪些功能?APB的协议是怎么样的,是如何写数据如何读数据的?
3.关于APB协议,你刚刚说到在第一个clk,控制信号先使能(PSEL,PADDR、PWRITE),在第二个clk,使能信号(PENABLE)拉高,读写数据(DATA)才有效,你认为APB协议为什么要这样做?不能在一拍中做完所有这些事情吗?
4.APB协议支持流水线吗?它与其他的AMBA总线有什么区别或不同,比如AHB总线?
5.你说你读了并理解了UART协议,那你说说你看了哪些部分,给我讲讲uart有哪些寄存器?
6.你在验证uart的时候,是怎么验的?case是咋写的?(基于SPEC配置相关寄存器使能DUT,去验证相关功能之类的。)
7.讲一下你的验证计划和验证功能点吧,看看都验了什么?
8.你的验证环境是怎么样的,请详细讲一下。
答:我一般从顶层向下讲,具体如下:
(1)首先最顶层就是tb_top层,tb_top层就是例化了DUT,例化了interface并且通过config_db进行interface的传递,传递到下面env所需要使用的interface的component(面试官可能会问为什么class要用virtual interface?),并且产生时钟和复位,然后会有个run_test()(UVM启动的入口),以上就是tb_top层做的工作。
(2)tb_top层下面就是base_test,base_test里面有什么?他是做什么的?
base_test里面例化了一个大的env以及virtual_sequencer(为什么需要virtual_sequencer),reg_model、adapter等,base_test也是整个UVM验证平台的树根,即UVM_TEST_TOP。
(3)base_test下面有个大的env,里面有什么?
里面有apb_env(apb总线这边发并行数据激励给DUT),
uart_env(发串行数据激励给DUT)和以及进行数据的check的scoreboard
(3)apb_env和uart_env里面分别包含有master_agent(发激励,里面例化了sqr,drv,mon),slave_agent(只例化mon,只监控不发激励)。
9.你的数据流是怎么样的?
答:数据流主要分2个方向,
(1)APB_env这边发并行数据到interface经过DUT(UART)后输出为串行数据,由UART_env中的slave_agent的monitor抓到
(2)UART_env中的master_agent发送串行数据到interface经过DUT后由APB总线这边读出(prdata),读出的为经过DUT后由串行数据转化成为并行的数据。
10.你的环境中有reg_model,是自己写的还是脚本生成的?你对reg_model有多少了解,他有什么好处呢?如果没有reg_model我们还能配置寄存器吗?
11.寄存器模型中前门、后门访问都有什么区别,什么时候适合用前门访问?什么时候适合用后门访问?
12.你的scoreboard是怎么写的?具体的check部分是怎么实现的?(简单讲一下具体的代码),你的scoreboard是怎么连接的?(TLM)使用了那些port?使用的是FIFO的方式还是直连的方式?
13.关于这个项目你写了多少个case?分别都是针对哪些功能写的?
答:最基本的就是2个功能
(1)发送功能:并行数据 ----- 串行数据:我的第一条case是apb2uart,就是apb_env里面的master_agent中的driver发的并行数据通过DUT串行输出,然后由uart_env里面的slave_agent里面的monitor监控,最终送到scoreboard做check。
具体我是怎么写的,也就是写个sequence,首先要去验证UART的这个发送功能,肯定要做一些配置,因此我基于SPEC去配置了相关的寄存器,比如先把波特率(什么是波特率?2个uart通信波特率要保持一致?)配置起来,然后配置了UART使能的相关寄存器。需要重点关注的寄存器如下。
(2)接受功能:串行数据 ----- 并行数据:第二条case就是UART_env中的master_agent中的driver发送串行数据给DUT,然后由APB总线并行读出。注意:第二条case是uart2apb,意味着uart_env发送串行数据给DUT,也就是2个uart通信(涉及到波特率一致的问题了)。面试官可能会问到你是如何保持波特率一致的?(DUT的波特率通过配置DUT的寄存器实现,UART_ENV的波特率通过config_db去配置UART_ENV的相关参数,使得发送的激励的波特率与DUT保持一致)。
(3)中断等特殊情况:通过配置寄存器实现超时中断、校验位错误中断以及FIFO溢出等情况。
14.最后你是怎么评估你的项目的完善程度的?(覆盖率)
15.你的覆盖率部分讲一讲,代码覆盖率和功能覆盖率的情况如何?
16.代码覆盖率由哪几个部分组成,你的代码覆盖率哪部分内容覆盖的不足?以及你是如何基于覆盖率报告进行验证的完善的?
17.关于功能覆盖率,能讲讲你都定义了哪些covergroup和coverpoint吗?你是基于什么去写的功能覆盖率,你认为关于这个UART的重要功能你是否都cov到了?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。