ROHD验证框架
ROHD验证框架 (ROHD-VF) 是一个构建在 Rapid Open Hardware Development (ROHD) 框架之上的验证框架。它能够以类似于 UVM 的方式组织测试平台。其背后的一个关键动机是,硬件测试平台本质上就是软件,而验证工程师应该有能力编写出优秀的软件。ROHD验证框架支持使用一种*现代*的编程语言来开发测试平台,并利用了软件行业的最新创新。
借助ROHD和ROHD-VF,您的测试平台和硬件可以在一个完全可调试的进程中以Dart原生运行。无需与供应商的黑盒模拟器进行交互,只需执行您的软件即可。您可以利用ROHD的协同仿真功能,为包含(或完全由)其他语言(例如SystemVerilog)编写的设计构建ROHD-VF测试平台。
ROHD验证框架*不*完全实现与UVM相同的API。相反,它采用了一些对测试平台设计有用的关键概念,并省略了那些很少使用、为规避SystemVerilog的语言限制而存在、鼓励过时或过于固执己见的设计模式,或者其他不具有显著价值的功能。ROHD验证框架消除了与UVM相关的宏和样板代码。
ROHD验证框架提供了一种简单、清晰且可扩展的方法,用于开发中等到复杂程度的测试平台。对于非常小而简单的设计,使用直接作用于DUT接口的Logic.value和Logic.inject的“窥探与探测”方法可能更容易。然而,“窥探与探测”方法对于更大、更复杂的设计通常不是一种可扩展的方法。与过去使用UVM的经验相比,使用ROHD验证框架构建完整测试平台的“启动成本”会大大降低。
测试平台
测试平台是用于与被测设备(DUT)交互和测试的软件。ROHD验证框架的测试平台使用具有特定角色的简单基类,以一种模块化和可扩展的方式进行组织。下图展示了一个典型的测试平台可能的样子。下面将详细介绍测试平台中每个对象的更多信息。如果您使用过UVM,这应该会看起来非常熟悉。
示例
立即上手一个完整的 计数器示例测试平台。该示例包含Monitor、Driver、Sequencer、Agent、Env、Test,与ROHD计数器示例相同的DUT,一个包含SequenceItem的Sequence,一个记分板,以及一个启动所有内容的main函数,所有这些都在一个注释文件里。
构造对象
ROHD验证框架没有像UVM那样内置用于构造测试平台中Component的“工厂”。相反,对象可以像其他任何对象一样被构造。将模块化和可配置性纳入测试平台的设计是一个好主意,这样可以根据所需测试轻松更改行为。如果您觉得工厂设计模式适合特定情况,使用它来构建测试平台并没有限制。您可能还有兴趣使用其他方法,例如依赖注入。ROHD-VF在这方面没有强加严格的意见。
Phase(阶段)
测试平台的许多设置可以在对象的构造函数中完成。ROHD-VF提供了一些阶段(类似于UVM),以帮助以协调的步骤配置、连接和运行测试平台。每个Component都会经历这些阶段。
- 构造函数
- 在构造函数参数中清晰地列出构建组件所需的内容。
- 构造任何子组件。
void build()- 测试开始时,但在
Simulator运行之前调用的函数。
- 测试开始时,但在
Future<void> run(Phase phase)- 一个耗时函数,在测试和
Simulator运行时开始执行。 - 使用
phase来创建Objection。
- 一个耗时函数,在测试和
void check()- 在模拟结束时调用的函数,用于检查最终状态的正确性。
Component(组件)
Component是一个在测试平台中拥有固定层次位置的对象。层次结构是在构造时确定的,方法是传递关于每个Component父级的信息(如果没有父级/顶层,则为null)。下面所有类都扩展了Component。您可以构建扩展Component这些子类的测试平台,或直接扩展Component。
Monitor(监视器)
Monitor负责监视接口并将有趣的事件报告到输出流。它将硬件世界桥接到一个可以在测试平台中操作的对象。许多东西都可以监听Monitor,通常是日志记录或检查逻辑。
Driver(驱动器)
Driver负责将SequenceItem转换为硬件接口上的信号转换。驱动器接收来自Sequencer的传入项。
Sequencer(序列器)
Sequencer从刺激源(例如Sequence)接收SequenceItem,并决定如何将它们传递给适当的Driver(s)。Sequencer的默认行为是立即将它们直接传递给Driver,但它们也可以更复杂。
Agent(代理)
Agent是相关组件的包装器,通常它们都关注单个接口或一组接口。通常,Agent会构造一些Monitor、Driver和Sequencer,然后将它们彼此以及接口适当地连接起来。
Env(环境)
Env是相关组件集合的包装器,通常每个组件都有自己的层次结构。Env通常由Agent、记分板、配置和协调逻辑、其他较小的Env等组成。
Test(测试)
Test类似于一个顶层测试实体,它包含顶层测试平台Env并启动Sequence。一次只能运行一个Test。Test还包含一个中央Random对象,用于以可重现的方式进行随机化。
刺激
通过测试平台将刺激发送到被测设备,是通过将SequenceItem通过Sequencer传递给Driver来完成的。
SequenceItem(序列项)
SequenceItem代表一组要通过接口传输的信息。典型用例是表示要通过标准化硬件接口驱动的事务的对象。
Sequence(序列)
Sequence是一个模块化对象,它包含如何将SequenceItem发送到Sequencer的指令。典型用例是按特定顺序发送一组SequenceItem。
虚拟序列器与序列
可以创建一个“虚拟”Sequencer,其作用是将Sequence或SequenceItem分发给其他子序列器。“虚拟”Sequencer上运行的Sequence称为“虚拟”Sequence。ROHD-VF对此没有特殊支持,但标准的Sequencer和Sequence对象可以轻松用于此目的。
日志记录
ROHD-VF使用Dart的 logging 包进行所有日志记录。它提供了多种详细程度和出色的可定制性。
Test对象包含killLevel和failLevel的设置,这些设置将在模拟运行完成后分别立即结束测试或导致测试失败。这些级别与logging包中的级别相关联。
要从任何ROHD-VF对象或组件记录消息,只需使用继承的logger对象即可。
2021年11月9日
作者:Max Korbel <[email protected]>
版权所有 (C) 2021 Intel Corporation
SPDX-License-Identifier: BSD-3-Clause
