验证范围

用便携式刺激平滑软件驱动验证的路径金宝博滚球专家

作者:Matthew Ballance,Mentor,西门188bet子公司

设计变得越来越复杂,并且越来越多地包括一个处理器,而且通常包括多个处理器。因为处理器是设计的一个组成部分,所以验证在处理器上运行的软件与其他设计之间的交互非常重要。硬件/软件边界的验证和确认不能合理地推迟到原型在实验室中提出,因为软件对当今系统的运行至关重要。或者,至少核查小组这样做是自担风险的。我相信我们都听到过噩梦般的场景,例如,一个团队在实验室发现处理器的总线以相反的顺序连接到设计,或者处理器无法从低功耗模式再次通电金宝博滚球专家。

硬件/软件逐步细化

当然,一个明显的解决方案是在传统的验证过程中围绕硬件/软件边界进行更多的验证。但是,我们不能从以硬件为中心的验证跳到尝试运行完整的应用程序堆栈。由于尝试执行大金宝博滚球专家量软件所导致的复杂性和大量调试日志,跟踪简单的bug变得非常复杂。

一种有效的方法是在最简单的验证环境中验证我们所能验证的一切,该环境合理地允许我们使用目标功能,具有最大的可见性,并且具有最少的与测试意图无关的活动。在本文中,我们将看一个涉及寄存器访问验证的简单示例。验证IP的寄存器是否能被处理器正确地写入和读取是一项关键的集成验证任务。即使是简单的soc也包含数百个寄存器,创建测试来验证处理器是否可以读取和写入每一个寄存器都非常耗时。

图1显示了一个简单的SoC,它带有flash和DDR内存、一个紧耦合内存、一个UART和DMA引擎,其寄存器通过低速外围总线访问。

图像
图1。简单SoC

虽然我们最终需要验证在处理器上运行的代码是否可以访问IP寄存器,但我们可以从基于UVM的验证开始,将验证任务的重点放在更大的程度上。首先验证UVM中的内存子系统,将使我们在嵌入式处理器上启动软件时更有信心。使用Mentor的Questa®inFact便携式刺激工具,我们可以将相同的测试意图重新定位到UVM和嵌入式软件环境,从而节省测试开发时间。金宝博滚球专家

用图形描述寄存器

Questa®;inFact使用了一种基于声明性图形的输入描述,它提供了约束编程的能力,并增加了以迭代方式指定决策的能力。在指定访问寄存器的约束时,这种迭代决策的能力非常有用。

我们首先捕获内存测试操作的核心属性:地址、访问大小、写入数据和写入掩码。写掩码指定哪些位是读/写的,哪些位在检查时必须忽略。

图像
图2。核心寄存器访问结构

动作是在目标验证环境中执行的行为单元。稍后,我们将看到如何更改body操作的实现,使我们能够轻松地将register access测试意图重定目标到UVM和嵌入式软件环境。金宝博滚球专家

图2中所示的寄存器访问描述符没有包含系统中IP的任何细节。我们下一步需要增加这些限制。我们的DMA引擎(Wishbone DMA核心来自opencores.org网站)有一组核心寄存器,然后是一组通道描述符寄存器。使用基于图形的描述允许我们迭代地描述寄存器地址。

图3中的图形说明显示了选择DMA寄存器地址的过程:

  • 选择一个核心寄存器或通道控制寄存器阵列(dma\ U reg)
  • 如果选择了通道控制寄存器
    • 选择哪个频道(dma\U ch)
    • 选择目标信道寄存器(dma\u ch\u reg)
图像
图3。DMA寄存器地址选择
图像
图4。DMA寄存器地址选择规则

图4显示了这个过程的文本描述。

当然,还有更详细的约束用于指定寄存器地址和写掩码,这些约束在图5所示的约束中进行了编码。请注意,这个约束被标记为“dynamic”,这意味着它只适用于在图中激活的情况—在本例中,是在我们决定访问DMA寄存器之后。虽然这些约束是手工创建的,但也可以从机器可读的寄存器描述(如IP-XACT、SystemRDL等)生成。

图像
图5。DMA寄存器地址选择约束

一旦我们将DMA、UART和TCM部分集成到寄存器访问图中,就可以得到如图6所示的图。我们可以将其视为一个流程图:首先,我们决定要访问哪个IP,然后基于所选IP和特定选择的图分支。例如,最左边的graph分支包含DMA特定的决策。

图像
图6。简单SoC寄存器访问图

映射到UVM环境

到目前为止,我们创建的寄存器访问测试的描述独立于任何验证环境。我们现在需要提供一个小的粘合逻辑来将测试图连接到子系统级验证环境中。

在我们的UVM子系统级环境中,我们已经用总线功能模型(BFM)替换了处理器的RTL模型,以便跨互连访问寄存器。我们的寄存器测试图封装在一个UVM虚拟序列中,该序列将通过BFM访问寄存器。

图像
图8。子系统级验证环境

我们的基本“CPU”虚拟序列通过支持各种大小的读写的类API提供对BFM的访问。我们添加了一个特定的“memcheck”序列,在“do\u memcheck”任务中执行写、读和检查,如图9所示。

图像
图9。UVM do\u memcheck任务

将寄存器测试图连接到虚拟序列中的do_memcheck任务所需的映射信息收集在一个文件中-目标.rseg在这种情况下。映射信息如图10所示。

映射信息指定:

  • 我们的图应该封装在一个从或1K内存检查
  • 我们应该使用或1K内存检查类来表示或1K\ U soc\ U regacc结构在UVM环境中
  • 那就是你要检查吗当“body”操作在或1千美元soc\U regacc执行
图像
图10。UVM序列目标映射

只需这几行代码,我们就可以在UVM环境中运行寄存器测试图了。这使我们能够验证寄存器连接的基础,并使用我们的标准UVM和SystemVerilog调试工具调试任何问题。

映射到嵌入式软件

但是,当然,验证我们的BFM是否可以访问寄存器内存并不能确定我们的处理器是否能够访问。因此,在处理器上作为嵌入式软件运行寄存器访问测试仍然很重要。在最简单的形式中,这个完整的SoC验证环境可能如图11所示。金宝博滚球专家

图像
图11。软件驱动验证环金宝博滚球专家境

在本例中,我们将创建一系列用“C”编写的测试,这些测试使用处理器写回和读回寄存器。我们的测试将使用domemcheck函数来执行实际的写、读和检查。此函数如图12所示。

图像
图12。嵌入式软件do\u memche金宝博滚球专家ck功能

与UVM环境一样,我们需要指定图形如何映射到嵌入式软件环境。映射信息如图13所示。金宝博滚球专家

图像
图13。嵌入式软件映射金宝博滚球专家

映射信息指定以下内容:

  • 头文件或1k\u memcheck.h必须包括在内。此文件声明你要检查吗功能
  • 这就是功能你要检查吗必须在每次执行body操作时调用,并传递addr,size,wr\ U数据,wr\ U掩码领域

生成C-测试

因为我们已经描述了要执行的寄存器测试的基于图的模型,所以我们现在在如何生成特定的测试集方面有了很大的灵活性。图14显示了生成的测试的一个示例。在本例中,我们允许inFact以所有三个ip为目标,但将测试限制为通过图的五次迭代。

图像
图14。寄存器测试示例

如您所见,生成的测试是一个定向测试,在生成过程中由inFact填充随机值。虽然这个特定的测试每次运行时都会执行相同的操作,但是我们可以通过在每次回归运行时使用不同的种子重新生成测试,从而在回归运行期间实现更多的随机性。

为了实现我们前面描述的寄存器访问目标的覆盖范围,我们需要生成更具体的测试。因为所有这些测试都是从一个声明性模型生成的,所以很容易简单地更改测试生成程序的选项,以便在运行多个测试之间切换,每个测试都对这些测试进行一些调用你要检查吗每个测试运行几个测试,每个测试都对你要检查吗每次测试。调整目标覆盖目标也很容易,例如,生成一系列只关注DMA寄存器测试的测试。

摘要

在剩下的设计中,采用分步方法验证嵌入式处理器和IP之间的交互,可以在验证过程的早期发现最容易调试和纠正的错误,从而节省时间。便携式刺激允许从一次描述的测试意图生成高质量的测试,并将其重新定位到多个环境。这解决了采用分步方法的主要挑战,即在多个地方执行测试意图的重复工作量,以及使用低生产率定向测试创建嵌入式软件测试的需要。在这篇文章中,我们已经看到了测试访问SoC寄存器的测试意图的单一描述,作为SoC集成测试的一部分,可以很容易地针对UVM和嵌入式软件环境。我们已经看到了如何使用Mentor的Questa®inFact便携式刺激工具描述和针对特定环境的测试意图。金宝博滚球专家

下次开始规划SoC集成测试时,请考虑便携式刺激和分步测试方法如何有利于您的验证过程!

聊天| 联系人