apb_uart_uvm_env

项目来源

https://github.com/Lampro-Mellon/apb-uart-uvm-env

DUT

接口


接口部分,框选为APB,负责寄存器读写,其余为uart。

寄存器

这些是DUT内部的寄存地址:

功能

配置地址为32'd16的寄存器,可启动一次串口数据发送,发送的数据内容与配置值一致;当DUT通过RX口接收到串口数据后,通过读32'd20寄存器,可获得接收的数据。

测试平台结构梳理

寄存器配置

由于整个DUT功能比较简单,未使用寄存器模型。寄存器配置动作封装在sequence内部:

该seq中用到的参数是来自cfg的addr,这些addr在cfg中都是固定值(可见“接口-寄存器”处的图片)。至于wdata,则不通过seq传递,如下图:

而这些wdata在base_test中被赋值:

sequence设计

本项目采用vseq进行sequence设计:

vseq中需要定义两个agent对应的sequence句柄。


然后单独看一个seq的body函数(其他的seq都是同样的结构):

该body函数中又会调用一个uart_sequence,以下为uart seq的定义:

除了body外没啥可看的,所以这里只放一张body的图。
在driver收到seq后,除了依赖seq中的信息外,还依赖于从cfg中传递过来的参数:

至此,联想到一个问题,哪些参数适合放在cfg中,哪些适合放在sequence中?

agent cfg参数传递

测试平台中未使用env_cfg的设计,仅使用了各个agent的cfg进行参数传递。

通路构造

在base_test中定义并实例化各个agent cfg,然后以config set的方式传递给agent:

agent cfg参数修改

在用例中,调用如下函数,会对agent cfg进行修改:

uart cfg同理:

scoreboard设计

该项目未使用refm参考模型,而是把参考模型的工作放在scoreboard中去完成:因此未使用常规的通用化scoreboard设计,而是对scb进行了自定义。scb中有三个接口:

  • 第一个接口用来对寄存器的读写通路进行比对,写入一个寄存器后,scb中会存储这个寄存器的值,当对它进行读取时,会将从dut中读到的值与刚才存储的值做比对;
  • 第二个接口得到的数据来源于DUT TX口数据的采样,采样到的数据与配置值进行比对即可;
  • 第三个接口得到的数据来源于DUT RX口所接收的数据,接收的数据与从32’d20寄存器读到的值进行比对。
posted @ 2025-04-06 11:41  MKYC  阅读(69)  评论(0)    收藏  举报