apbtimer模块验证学习笔记

前言

本文仅个人学习过程笔记,如有疏漏,望指正或补充。

apbtimer模块简介

apbtimer模块是一个以APB协议通信的timer减计数器。其内部含有多个可配置寄存器(本项目中未使用到的寄存器不做解释):
CTRL:控制寄存器。CTRL[0]:timer使能,CTRL[1]:外部输入作为使能端,CTRL[2]:外部输入作为clock端,CTRL[3]:timer中断使能。
VALUE:timer减计数器的current value,写入时计数器值改变为写入值。
RELOAD:timer减计数器的预加载值,写入时当计数器减计数至0时,才改变为RELOAD值。
INTSTATUS/INTCLEAR:timer减计数器的中断状态,对该寄存器写1时可清除当前中断状态。
外部可以通过对应寄存器的相应配置来改变当前timer的功能。
在这里插入图片描述

apbtimer模块验证结构布局

利用UVM验证方法搭建验证环境如下:
在这里插入图片描述
整个验证环境env中,包含了一个mst_agt,其中drv通过与之连接的TLM端口获取到挂载在sqr上的seq,并将其驱动到apb_if接口上,进而与DUT进行交互,而mon则将接口上监测到的数据通过其item_observed_port发送到其与之连接的端口上,比如scb和cov的anasis_imp上,同时由于验证环境中建立了寄存器模型,与之对应含有predictor和reg_adapter,mon也会将接口上监测到的数据通过其item_observed_port传递给predictor的imp端口bus_in,进而通过reg_adapter传递,更新寄存器模型。
同时,scb中创建了一个counter计数器,用于模拟dut中的timer计数器的行为,其输出作为标准值使用。scb中含有多个uvm_event,如counter_enable_e、counter_reload_e、counter_value_e、counter_interrupt_e等,当mon监测到接口上有操作时,通过analysis_port将监测到的trans传送给scb,而scb会根据trans中的addr来判断当前trans对应操作的是哪个reg(即scb会 根据r = rgm.map.get_reg_by_offset(tr.addr)拿到对应寄存器的句柄,再根据r.get_name()拿到对应寄存器的名字,最后通过判断该寄存器的域是否变化,若变化则会触发相应的uvm_event),若对应的reg中的值满足spec文档中的配置,以CTRL为例,若mon监测到CTRL[0] CTRL[1] CTRL[3]都被设置1,scb会触发counter_enable_e、counter_extin_as_enable_e、counter_interrupt_e事件,分别对scb中counter的timer_enable,timer_intren变量配置为1,配置好后scb中会根据counter的计数规则:counter值为0,则加载reload值;若counter值为1,intren也为1,则scb中的interrupt会拉高,若counter值不是0或1,则会减1。
对比机制则是将DUT中的timer计数器的值和scb中counter计数器的值做差,若差值在可允许的范围内,则判断dut中的timer当前计数功能正常,否则异常并报错。

测试用例

在这里插入图片描述
(1)timer_base_test
主要创建了寄存器模型rgm、timer_config和timer_env,同时通过config_db::set()将rgm、timer_config传递到下一层次的timer_env中,同时设置了延迟drain_time()
(2)timer_base_virt_seq
主要通过config_db::get()拿到了虚接口vif和rgm的句柄,同时完成接口有复位时复位rgm以及接口中断的监测。
(3)rkv_timer_reload_and_interrupt_test
将timer的RELOAD寄存器功能和中断结合起来验证的,由于RELOAD寄存器的值需要等到计数器减到0时加载,利用这个特点,在timer未使能和使能的情况下对RELOAD寄存器写入随机值,待数据稳定后对VALUE寄存器做读操作,判断两种情况下计数器是否开始减计数,由此确定RELOAD寄存器功能正常;同时结合timer中断拉高条件(即计数到1,同时中断功能开启),当中断拉高时,对INTSTATUS寄存器写1清除中断一次后,再次等中断,根据等到下一次中断时,判断中断拉高的次数,由此确定中断功能是否正常。
(4)rkv_timer_integration_test
通过两种不同的方式访问寄存器,即利用`uvm_do方法和寄存器模型rgm句柄访问寄存器,由此确定寄存器模型及验证环境的正确性。
(5)rkv_timer_counter_boundary_and_recount_test
由于timer是减计数器,即其减计数至0后会继续从最大值减计数,本测试是首先向timer分别写入与VALUE对应比特位的全F和仅最高位为1两种典型情况下的数值,再通过wait_counter_reach_val(value - 100)判断timer是否从给定值开始计数,由此来试探timer的计数边界。
此外,当给RELAOD寄存器一个值,结合timer中断逻辑(计数至1且中断使能),当监测到接口上有中断拉高时,则对INTSTAT写1清中断,此过程重复循环reload_times次,最后通过比较中断拉高次数与循环reload_times次是否一致,由此判断timer中断清除后会再次从RELOAD值开始减计数,且只要中断使能,会继续拉高中断信号。
(6)rkv_timer_external_source_as_clock_test
当在外部信号EXTIN给一时钟信号(通常时钟频率比apb时钟频率低),可以作为timer时钟,让timer以此时钟开始计数,此功能的前提是CTRL[2]=1、CTRL[0]=1,且EXTIN有时钟信号输入。
本测试利用变量extin_as_clock作为使能外部EXTIN的时钟信号,分别在未使能和使能情况下,对RELOAD写入reload_value值,对EXTIN给外部时钟后,等待reload_value个外部时钟后,判断接口上中断是否拉高,由此判断外部信号端作为时钟输入端时,timer是否按照外部时钟计数。
(7)rkv_timer_external_source_as_enable_test
当在外部信号EXTIN给一单比特信号,可以作为timer的使能端,此功能的前提时CTRL[1]=1、CTRL[0]=1。
本测试利用变量extin作为外部使能端信号,分别在extin=0和extin=1情况下,对RELOAD写入reload_value值后,等待reload_value个外部时钟后,判断接口上中断是否拉高,由此判断外部信号端作为使能端时,timer是否按照给定使能情况计数。

覆盖率收集

定义如下覆盖组:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据对应event事件对每个覆盖组采样:
在这里插入图片描述
使用固定种子seed_1和随机种子分别跑以上测试,可以得到合并后的代码覆盖率和功能覆盖率情况如下:
在这里插入图片描述
在这里插入图片描述

分析覆盖率收集情况

代码覆盖率中的行覆盖率和翻转覆盖率较低,有多个变量0/1或1/0跳变未覆盖到:
在这里插入图片描述
同时行覆盖率中有部分default语句未覆盖到:
在这里插入图片描述
断言覆盖率中,有部分断言未覆盖到:
在这里插入图片描述
功能覆盖率中很多覆盖组只覆盖到一部分bins或者未覆盖到:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加新的测试用例

根据未覆盖到的coverpoint及代码覆盖率,编写如下测试用例:
在这里插入图片描述
在这里插入图片描述

同时由于case语句中前面的情况已经将所有情况进行了条件判断赋值,所以default部分不可能覆盖到,对default做exclude后,得到代码覆盖率和功能覆盖率的情况如下:
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
WIFI模块转换学习笔记 WIFI模块转换是一种将串口信号转换为WIFI信号的技术,可以实现无线通信和远程控制。WIFI模块通常包括芯片和天线两部分,芯片负责信号处理和转换,天线负责信号发射和接收。在学习WIFI模块转换之前,需要了解WIFI技术的基础知识和串口通信的基本原理。 1. WIFI技术的基础知识 WIFI技术是一种无线局域网技术,可以实现电子设备之间的无线通信。WIFI技术使用了IEEE 802.11协议,包括多种不同的标准,如IEEE 802.11a、IEEE 802.11b、IEEE 802.11g、IEEE 802.11n和IEEE 802.11ac等。这些标准都支持不同的频率、速率和传输距离,可以根据具体需求进行选择。 2. 串口通信的基本原理 串口通信是一种通过串行通信协议将数据传输到计算机的方法,其中数据位、停止位和奇偶校验位等参数会影响通信成功率。串口通信通常使用RS-232或RS-485标准通信协议。在Arduino开发板中,可以使用串口库函数来实现串口通信。 3. WIFI模块转换的基本原理 WIFI模块转换是一种将串口信号转换为WIFI信号的技术,可以实现无线通信和远程控制。常见的WIFI模块包括ESP8266和ESP32等。这些WIFI模块可以通过简单的AT指令控制,实现WIFI信号的连接和传输。在Arduino开发板中,可以使用ESP8266库或ESP32库函数来控制WIFI模块。 4. WIFI模块转换的实验 为了学习WIFI模块转换,我们可以进行一个简单的实验。首先,我们需要准备一个WIFI模块,如ESP8266或ESP32。接着,我们需要将WIFI模块连接到Arduino开发板中,可以使用杜邦线将WIFI模块的串口引脚(TX、RX)分别连接到Arduino开发板的数字引脚(D1、D2)上。然后,我们需要编写一个Arduino程序,调用ESP8266库或ESP32库函数,实现WIFI信号的连接和传输。在程序中,我们需要设置WIFI的SSID和密码,以及WIFI模块的AT指令。最后,我们可以使用串口调试助手来监控WIFI信号的传输情况,以确保程序的正确性。 总的来说,学习WIFI模块转换需要了解WIFI技术的基础知识和串口通信的基本原理,以及掌握WIFI模块的使用方法和编程技巧。通过实验的实践,可以更好地理解和应用WIFI模块转换技术,实现无线通信和远程控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值