本文基于22秋apbtimer模块验证基础,以及大佬的思路点拨完成。如有错误及不足,望指正或补充。
前言
apbtimer模块是一个以APB协议通信的timer减计数器,验证环境搭建时,除了激励的产生组件和监测组件等,还创建了scoreboard(scb)计分板,其主要用于模拟DUT的设计行为以及功能检查。
该scb中设置了counter模拟timer计数器,当monitor监测到总线上有寄存器操作,会将相应的transaction广播给scb,这时scb可以通过get_reg_by_offset(tr.addr)(寄存器模型map的方法)得到操作中寄存器的句柄r,进而通过r.get_name()方法来定位某个具体的寄存器,再trigger对应uvm_event事件,最终通过rgm.REG.get()方法拿到DUT侧寄存器配置,同时模拟dut行为对scb中counter进行配置。
counter减计数时,也模拟DUT只需判断是否计数到0或者计数到1,进而确定是否加载RELOAD寄存器中配置的值至counter中,或者将中断拉高;如果没有计数到0或1,则继续减计数。
对比机制则是在每个时钟上升沿比较timer计数器(DUT侧)和counter计数器(scb中)二者的值,若该值在可接受的误差范围内,则判断达到预期标准,反之未达到标准,打印对应的错误信息。
bug情景重现
bug1
使能当前scb,同时运行各个test,发现多个test有如下相似的错误信息:
尝试在对比scb和dut部分打断点可以得到:
同时观察到extin_as_enable未使能时,dut中的timer仍会减计数:
且extin=0时,scb中计数器仍在减计数:
同时运行extin_as_clock_test,也能得到未使能时scb中计数器仍在计数的情况。
bug2
而运行timer_boundary_and_recount_test时,发现dut中计数器始终与scb中计数器在时序上差一拍:
注:打断点时,当运行到scb中对比机制代码部分,可以在local窗口的this句柄下找到counter变量,从而将scb中counter加入波形图中。
debug思路
bug1
针对bug1,预期使能端是针对计数器计数功能的开关,即未使能时scb和dut中的计数器都不应计数,这点dut中计数器满足功能,而scb中计数器不满足要求,由此判断scb中counter的使能条件不够充分,需加入extin部分作为使能条件:
bug2
针对bug2,由于在时序上scb和dut中的计数器始终差一拍,所以导致在重新加载RELOAD寄存器中的值时,scb和dut中的计数器一个为RELOAD值,一个为0值,当RELOAD值过大时会不满足最小误差的标准,由此可以将dut中计数器延迟一拍发送,同时对比机制中采用对应的last_counter与scb中计数器做差值比较。
思路总结
检查时序逻辑可以在断点调试下结合波形以及打印消息分析,而某些值不符合预期时可以借助local窗口的软件变量来监测对应的变化动态值,从而排查错误来源。总之,都需抽丝剥茧,层层深入查找问题根源。