APP下载

基于UVM 的Wishbone-SPI 验证平台设计

2022-07-22刘森态庞宇

电子技术应用 2022年6期
关键词:测试用例寄存器总线

刘森态,庞宇,魏 东

(重庆邮电大学 光电工程学院,重庆 400065)

0 引言

基于TestBench 的传统芯片验证方法,对人员的验证经验要求高,且平台可移植性差,难达到预期覆盖率,不适于快速迭代芯片设计市场[1]。目前,UVM 已是IC 验证领域主流的方式,它由SystemVerilog 语言编写,具有面向对象(Object Oriented Programming,OOP)的特点,拥有丰富的组件和基类,完善的通信机制,继承并克服开源验证方法(Open Verifcation Methodology,OVM)没有寄存器的解决方案,可以根据验证需求,快速地搭建工程[2-3]。

串行外设接口SPI(Serial Peripheral Interface) 是由Motorola 公司定义一种单主机多从机全双工的模式通信,协议标准下由主入从出数据线(Master Input Slave Output,MISO)、主出从输入数据线(Master Output Slave Input,MOSI)、串行时钟信号线(Serial Clock,SCK)和从机选择信号线(Slave Select,SS)共4 种引脚组成。该接口可与模数转换器DAC、数模转换器DAC 和外部存储器等芯片通信,是SoC(System on Chip)最主要的外设接口之一。

Wishbone 总线是由Silicore 提出的,现由OpenCore 组织维护管理,是SoC 三大总线标准之一[4]。Wishbone 总线是一种IP 核(Intellectual Property Core)互联体系结构,它定义IP 核之间公共接口,减轻系统组件集成难度,提高系统组件可重用性、可靠性和可移植性,兼容所有综合工具,可用多种硬件描述语言实现[5]。Wishbone 总线为IP 核提供点到点、数据流、共享总线和交叉开关这四种互联方式满足不同模块的通信需求。

本文验证的模块是由Wishbone-SPI 搭建的一个子系统,并着重阐述模块设计、验证环境搭建、寄存器模型生成、验证流程、激励用例开发以及功能覆盖率统计,最终对仿真结果进行统计和分析。

1 Wishbone-SPI 模块设计

SPI 作为MCU 芯片重要外设,在芯片内完成串行数据流转换与并行数据流的转换[6]。该模块有多种传输模式,其最大输出时钟为系统输入时钟的一半。不同SPI模块的最大时钟需求不同,需要用时钟控制模块来调节通信频率。

1.1 Wishbone 总线接口

Wishbone 总线信号接口分为公共信号、数据信号和总线周期信号。

公共信号包括复位信号rst 和时钟信号clk,它们对于主设备和从设备都是公共的。

总线控制信号有错误信号err,重试信号rty,响应信号ack,读写使能信号we,中断请求信号int,选通信号stb,总线周期信号cyc,位宽信号sel。

数据信号包括地址信号addr,数据发送信号dat_o,数据接收信号dat_i。

Wishbone 支持多种单周期读/写,块读、读修改写。以单周期写为例,如图1 所示,在clk 上升沿a 时刻,主设备设置位宽sel 信号将地址信号addr 和待写入数据dat发送到总线上,拉高we,同时将cyc 和stb 置高,开始一次总线的写操作。在时钟上升沿a 到达前,从机设备检测到主设备的写操作,锁存总线上的数据,同时拉高ack作为对主设备的响应。从设备可以在ack 有效之间插入任意周期的等待状态。在clk 上升沿b 时刻,主设备发现ack 为高,将stb 和cyc 置低表示操作完成。从设备发现stb 为低后将主设备ack 也置低。一次Wishbone 写操作便完成。

图1 Wishbone 单次写操作

1.2 SPI 模块

考虑到SPI 协议接口信号具有不同通信模式的特点,SPI 模块设计采用基于状态机的方法,SPI 模块基本设计框架如图2 所示。控制寄存器是SPI 模块的核心,用于控制SPI 通信方式,主要监视Wishbone 总线上的读写命令,根据读写命令调用控制状态机,进而控制数据的发送与接收。分频器寄存器将模块的输入时钟分频后用于时钟产生输出SCK,从而灵活地选择外设频率。状态寄存器反映模块内的运行状态,如发送完成标志,读写完成标志。数据寄存器存放待发送到芯片或接收来自于外部模块的数据。循环冗余校验(Cyclic Redundancy Check,CRC)校验器判断传输数据是否正确,当发送数据时将产生CRC 校验码并附加到数据后面,接收数据时则自动计算CRC 校验码并与总线数据上的校验码进行比较得出结果并反映到状态寄存器中。

图2 Wishbone-SPI 框图

2 UVM 验证平台

2.1 主要通用验证组件

基本的UVM 平台包括以下部分:Test 是最顶层的类,首要负责验证平台的配置,创建下一级别的验证组件,可以用来启动Sequence 开始仿真。Environment 是一个容器,包含较高级别验证组件,包括Agent、Scoreboard、Config以便更高层次的复用。Agent 是一个将Driver、Monitor、Sequencer 三个组件进行封装的容器组件,方便相同功能的组件多次例化和复用。Driver 是将sequence 中的数据包发送到DUT 引脚上的组件,会根据特定的协议转化为时序激励。Monitor 用来观察接口上的数据或信号,可以通过事务极传输模型(Transaction-Level Modeling,TLM)将信号发送到其他组件上。Sequencer 管理不同类型的Sequence,并带有仲裁的功能。Sequence 定义了需要发送或接收驱动器Driver 的数据类型,需要挂载到相应的Sequencer,是验证平台中流动的血液。Scoreboard 接收来自Monitor 的数据值并且与期望值进行比较。接口Interface包含了连接、同步和两个或者多个模块之间的通信。

如图3 所示,本次设计中验证环境Wishbone2spi_env中包含Scoreboard、Coverage、Predictor、Agent 和Transaction。Agent 内Driver、Monitor 和Sequencer 通过TLM 通信。在Sequencer 帮助下,顶层仿真序列Sequence 产生的数据类型送给Driver。总线上的读写操作激励将广播到Predictor上。Predictor 根据DUT 配置和Wishbone 总线上的输入来传输SPI 的激励。Predictor 输出发送到Scoreboard上,并与DUT 的输出结果进行比对。Coverage 记录SPI 操作的功能覆盖率。Virtual_sequencer 控制不同的Sequencer,起统一调度的作用[7]。平台中有3 个Sequencer,一个是寄存器模型的数据传输,一个是控制Wishbone 到SPI 的数据,还有一个则是控制SPI 到Wishbone 的数据产生。

图3 SPI 验证环境

通常DUT 的接口数量不定,为满足芯片验证需求,加快验证的准备速度,通常相同功能验证组件封装在Agent 容器内。如图4 所示,通过在Env 组件内的config配置不同Agent 的config 属性,实现验证环境集成多路接口驱动,并同时使用,满足验证的不同需求。

图4 多驱动验证平台

2.2 RAL 模型

寄存器抽象层(Register Abstraction Layer,RAL)是一种中心化管理寄存器配置的模型[8],其核心思想是把需要验证的所有寄存器封装在一个统一模型内,通过映射完成对寄存器的验证工作。RAL 模型一般包括不同寄存器的地址和不同位宽的功能段域,其中段域是控制模块功能的最小单位,多个段域组成一个功能寄存器。使用RAL 模型一般使用脚本语言进行管理,可以在大规模芯片设计中减少手动检查寄存器的时间,避免寄存器配置错误,实现平台复用性。

UVM 中对寄存器的访问方式包括前门访问和后门访问。前门访问是在总线上模拟时序,进而在寄存器模型上进行读写操作,是真实的物理操作。而后门访问是利用UVM 中的内置方法,将寄存器的操作直接作用到DUT 内的寄存器变量,比起前门访问速度更快,段域值修改更便捷。前门访问方式使用转换器(adapter)类来充当不同抽象层转化媒介。该类将寄存器激励信息转化后发送到总线上,最后由总线上的driver 完成转化。控制寄存器结构如表1 所示。

表1 控制寄存器

RES(Reserved)域为功能保留,只能读;BIDIMODE(Bidirectional data mode enable)为双向通信方向,写1 时表示双向传输,为0 时是单向传输。BIDIOE(Output enable in bidirectional mode)域用于双向通信模式下的传输方向;CRCNEXT(CRC transfer next)表示下一次传输为CRC。CRCEN(Hardware CRC calculation enable)开启硬件CRC。MSTR(Master selection)为主、从模式选择。IE(Interrupt enable)域表示中断使能;LSB(Least Significant Bit)域表示最低有效位收/发比特位置顺序;SPE(SPI Enable)域表示SPI 使能。CPOL 与CPHA 组合控制着SPI 传输的四种模式。下面以SPI 的控制寄存器SPCR 为例,验证平台的寄存器缩略代码如图5 所示。

图5 控制寄存器验证代码

依据模块功能手册,寄存器每个域配置主要包括位域所属的寄存器、段域的位宽大小、该段域最低位在寄存器中的位置、访问方式、段域是否易变、复位后的默认值、能否复位以及能否单独访问。其中访问方式主要指读 写RW(Read Write)、只 读RO(Read Only)、只 写WO(Write Only)等。

本次设计包含了12 个SPI 寄存器,如表2 所示,除了控制寄存器,还有状态寄存器和数据寄存器等。每个寄存器位宽均是32位,偏移地址依次以4 递增。发送数据寄存器和接收数据寄存器共享地址,通过控制寄存器中的读写标志区分。在传输启动前,写数据寄存器,则发送数据;在完成传输后接收MISO 上的数据,读数据寄存器。Wishbone 总线上以前门访问的方式来配置SPI 的功能。通过后门访问方式读取寄存器里的值,最后比较写入值和期望值是否一致。

表2 SPI 寄存器堆

寄存器模型验证流程如图6 所示,首先寄存器序列spi_reg_sequence 携带寄存器信息放到uvm_reg_item 实例中,并送到adapter。然后adapter 抽取出信息,生成总线所需的Wishbone_seq_item 类型,通过总线上Agent 实例发送到DUT内,完成寄存器的配置。

图6 寄存器模型验证

2.3 平台测试用例

为了对SPI 特性全面测试,编写如测试用例。测试用例列表及父子类关系如表3 所示。1 号测试用例是为了测试Wishbone 是否按照总线协议进行读写。2 号测试用例继承于1 号测试用例,它对总线地址进行约束,限定访问地址在SPI 寄存器地址范围内,且检测寄存器的读写方式,如状态寄存器只能读不能写。3~7 号测试用例均继承于2号,其中3 号是测试SPI 开启和关闭的激励,是发送或接收SPI 数据的基础。4 号用来测试通信故障,如数据溢出、CRC 错误。5 号检测NSS 信号片选引脚在主机模式下是否拉低指定的从机设备引脚。6 号测试用例检测复位时SPI 各个寄存器是否是设定值。7 号关注SPI 在不同传输模式下MISO 和MOSI 引脚的时序是否与协议一致。

表3 测试用例列表及父子类关系

2.4 功能覆盖率组

设计自动统计功能覆盖率的模型来评估验证结果是否满足预期要求,通过覆盖组实现覆盖率的统计模型,如表4 包含验证平台不同覆盖组,以着重验证SPI 各个基本功能。

表4 SPI 测试覆盖组和描述

3 功能覆盖率统计及分析

使用Questasim 工具运行验证平台,激活测试用例,实例Wishbone 和SPI 接口并对接口信号分别进行采集。运行时,先通过受约束的随机测试,然后对未覆盖的地方进行定向测试,遍历访问空间,使功能覆盖率达到100%。图7 显示了DUT 的功能覆盖率结果,每一个覆盖组的Coverage=100.0%,这说明验证中每一种情况都已经覆盖,平台已达到验证目标。

图7 功能覆盖率仿真结果

4 结论

本平台支持Wishbone-SPI 验证,使用UVM 减少验证平台搭建时间,且功能覆盖率达到100%,编写高效率的测试用例配合脚本工具实现可移植复用的激励。实际项目中,可依据项目实际情况改变接口代码或配置代码,而复用的代码结构对于其他验证工作起着积极的作用。后期在该验证平台上可以加上处理器外壳[9],运行C 的测试用例[10],做出访问寄存器、处理中断等行为,还可进一步实现验证平台的垂直复用,能大大缩短SoC 开发时间。

猜你喜欢

测试用例寄存器总线
基于SmartUnit的安全通信系统单元测试用例自动生成
Lite寄存器模型的设计与实现
基于PCI Express总线的xHC与FPGA的直接通信
机载飞控1553B总线转以太网总线设计
基于混合遗传算法的回归测试用例集最小化研究
分簇结构向量寄存器分配策略研究*
基于依赖结构的测试用例优先级技术
多通道ARINC429总线检查仪
基于EtherCAT总线的ROV控制系统设计
高速数模转换器AD9779/AD9788的应用