文章目录
- 简介
- 测试点
- testbench框架
- 测试用例
- 寄存器
- 中断
- 问题
简介
针对synopsys的I2c ip,提取测试点,搭建测试框架,分析功能和代码覆盖率,反向完善整个测试功能集。
测试点
- 寄存器
testbench框架
这边使用S家的i2c vip来验证DUT,DUT的设计需要满足行业统一协议,S家的统一VIP是进过验证的满足行业协议的。自己的vip或者直接让DUT交叉对接,回环测试的话,只能证明这个DUT自己和自己能正常工作,但是不能证明和其他外设能通信正常。但如果一段使用DUT,另一端使用VIP验证的话就能很好地检验DUT是否满足行业标准,这也是验证中常用的做法。S家的VIP基本上都是统一的封装一个agt,其中包含drv,mon,sqr,cfg等组件。cfg是用来配置改变vip行为的,这个配置需要仔细研究。
测试用例
寄存器
中断
- 发送空中断
问题
配置apb总线的sequence只能执行第一个transaction就会卡死,剩下的transaction不会执行。
怀疑寄存器模型中adapter中打开了provides_responses = 1,寄存器模型会等待get_response,但是driver中没有put_response或者item_done(rsp),把adapter中response关闭还是会卡死,所以卡死的点并不是等待response。verdi中停止调试,直接看sequence的调用栈,直接看卡死在哪一行,然后去反推。调用栈如下所示:
发现是卡在end_tr函数上,每个transaction执行完之后没有调用end_tr导致。这是因为 vip 中使用了UVM_DISABLE_AUTO_ITEM_RECORDING这个宏,使用这个宏之后item_done不会自动调用end_tr,需要手工调用。slave seq一直卡死,只有开始时间,没有结束时间。
深入调试uvm_do发送slave seq发现一直卡在wait_for_grant,这是由于driver测一直没有get_next_item导致的。观测控制台打印的log发现如下信息:
发现slave测runphase自从打印wait for reset之后再也没打印其他东西,那么很有可能是vip测复位释放有问题。检查代码发现dut复位有效是低电平,而vip复位有效是高电平,所以复位信号传到vip之前需要翻转一下。