过去几年来,为提高设计验证的生产率和结果质量,我们投入了大量精力。其中大部分工作主要以最适合模块级的技术为主。这些技术(如随机约束事务生成、功能覆盖率和 UVM)已大幅提升了验证质量和生产率。然而,虽然这些技术已在模块级取得成功,但在子系统和SoC级上所面临的验证挑战却在不断攀升,因此需要一种新的方法。
为了提高验证的生产率和效率,现已开发了各种商业和内部工具。Mentor的Questa® inFact™就是一款商业工具,其可以提高抽象层次(促进生产率),提升测试生成效率,并且可以应用于各种验证环境。
开发人员越来越重视在面向事务的模块级环境之外的环境中引入自动测试,所以同样也很乐于制定规定这些测试的标准化输入规范语言。为此,Accellera发起了一个工作组,名为便携式激励工作组(PSWG)。该工作组的主要任务是收集需求、获得技术贡献,并制定一种标准化输入语言,用于规定针对各种验证平台的测试意图。Mentor一直在参与和推动PSWG的活动,并为其标准化过程提供技术和专业知识。
便携式激励的目标如图1所示。具体来说,这个概念是对测试意图(便携式激励描述)的单一描述,可以针对 IP级、子系统级和SoC级验证,并且能够以一种适合用于该验证类型的验证引擎的方式来实施该测试意图。
图1:便携式激励的目标。
除了描述便携式激励的目标之外,还需强调一点,即它不会如下运作。便携式激励描述并不强制所有描述都处于单一抽象层次,或强制所有测试意图以单一受限的方式进行。
可以看到,PSWG目前正在开发的便携式激励规范有多个要素,用户可以灵活地以最适合其验证任务的方式描述其测试意图。另外,需要注意的是,PSWG 所寻求的是便携化高效自动测试的创建。便携式激励不仅仅是所有验证引擎中可轻松支持的技术交集。
此外,Accellera便携式激励规范(PSS)并非旨在替代现有的C/C++或SystemVerilog等程序语言。能够复用现有代码是很重要的一个特性,因此Accellera PSS提供了多种机制可以复用这些语言描述的行为模型。
便携式激励旨在提高抽象层次,并使用户能够自动测试子系统和SoC级验证中出现的复杂场景。不过,Accellera PSWG正在开发构建在基于约束的事务级验证基础上的PSS,且现已为人所熟知并获得广泛采用。除了这些基本功能之外,Accellera PSS还使用户能够高效地捕获复杂的SoC级场景并有效地予以实现。
因此,Accellera PSS支持随机和非随机数据字段和结构体、熟悉的SystemVerilog约束、以及类似面向对象语言中的继承特性。
通过混合随机约束生成与程序代码,可以在SystemVerilog中构建场景。这样的话,便会造成限制,如要复用场景并进行自定义,就不能改变原始代码。Accellera PSS提供了一种操作作为行为的原始元素,还提供了一种方法,可以易于复用和自定义的方式封装复杂行为。
在复杂操作中,可以指定子操作的顺序和并行执行以及子操作的重复。操作中的行为以声明方式指定,因此可实现高度自动化和静态分析。
Accellera PSS提供了专用的结构体,可用于操作的资源需求建模以及场景中操作之间的数据交换。如此一来,用户能够描述界定合法场景的规则,并可使用工具来根据这些规则自动创建复杂的合法场景——就像数据约束指定合法事务的范围一样,使约束求解器能够自动生成许多合法事务。
在模块级验证环境中应用便携式激励具有巨大的优势。由于需要有效地生成SoC级环境的测试,便携式激励工具需要非常高效和有针对性的测试生成。
在模块级环境中,高效的测试生成可以更快地实现功能覆盖率目标,并在验证周期中尽早发现错误。例如,Mentor的Questa inFact用户通常会发现,该工具在实现覆盖率目标方面比随机生成的效率要高10-100倍。因此,他们能够更快地发现错误,然后扩展其覆盖率范围,而不会增加仿真资源。
本文中使用的示例是多通道DMA引擎。与此类DMA引擎一样,存储器传输操作的特征在于传输描述符,其可捕获传输大小、源和目标地址、地址增量设置以及详细传输选项。在模块级,我们要全面执行这些传输描述符字段的组合,以全面验证DMA实施情况。
围绕该IP的UVM测试平台简化视图如图2所示。UVM序列可根据DMA描述符类对DMA引擎内的寄存器进行编程,进而测试DMA引擎。
图2:UVM 测试平台简化视图。
DMA描述符类包含定义有效DMA传输的字段和约束。利用便携式激励描述中现有描述的能力很重要,因为工程师为正确捕获约束已投入不少时间,且环境中的其余部分也将由该描述符类驱动。
幸运的是,Accellera PSS的事务级子集可与SystemVerilog约束子集重叠,因此,许多基于SystemVerilog约束的描述可以转换为PSS描述。
Questa inFact为此提供了一个导入工具。上文显示了原始SystemVerilog class和PSS struct的比较。借由在 SystemVerilog中创建序列级描述,再导入SystemVerilog描述并使其在PSS描述内可用,可使PSS更容易上手使用,并确保在 SystemVerilog 端对序列项进行的任何更改都可同步至PSS描述中。
接下来,我们将介绍最基本的 DMA 操作:DMA 传输。在便携式激励描述中,操作的数据和行为封装在 action 中。
如上所示,component中声明了一个操作,且其封装了多个操作共享的资源。在这一基本模块级验证,我们的 wb_dma_c组件并无任何特别之处。我们的do_dma操作只需捕获一个随机的wb_dma_descriptor结构体字段。我们将在后面填写实施细节。
从测试的角度来看,我们可能想做的第一件事就是生成一连串的单 DMA 传输。与原始操作类似,我们可以在操作中描述测试场景。由于我们的测试场景本身由操作组成,我们可以添加一个 Activity Graph(关键字:activity)来指定子操作间的关系。
请注意,我们在一个组件中声明了我们的simple_xfer操作。该组件包含声明do_dma操作的wb_dma_c组件的实例。我们的simple_xfer操作仅会重复运行256次do_dma操作。
我们可能希望稍稍扩展我们的测试,使用不同约束的信道,执行两个背靠背DMA传输。这应该会在DMA控制器中引发更有趣的活动。请注意,在上文示例中,我们约束操作实例的随机字段的方式——使用定向随机序列进行约束极具挑战性。
到目前为止,我们并不担心我们的操作将如何连接到UVM测试平台环境。PSS提供的类型扩展功能可以轻松地在我们与环境的接口中进行分层,而无需更改我们已经描述的任何操作或组件。
在我们的UVM测试平台中,激励由生成wb_dma_descriptor序列项的UVM序列驱动。我们希望在UVM序列中集成我们的PSS描述,并生成wb_dma_descriptor序列项,不过使用的是便携式激励工具选择的字段值,而不是常规的SystemVerilog随机约束。
PSS程序包提供了一种可封装环境细节的绝佳方法,而在本例中,我们使用了一个程序包来包含我们的do_dma 操作与UVM序列集成的细节。具体来说,我们假设序列提供了一个名为do_item的任务,接受并执行一个 wb_dma_descriptor序列项。import语句指定此外部方法的签名。
接下来,我们需要指定do_dma操作要如何使用此导入的方法。PSS提供exec块来指定PSS实体和外部代码之间的关系。exec块的body类型指定执行时行为(与UVM序列体任务类似)。在本例中,我们将do_dma操作的执行时行为指定为将wb_dma_descriptor字段传递给do_item任务。
然后就大功告成了!我们全新的PSS驱动式UVM序列现在可以驱动UVM测试台,其优点是可以更有效地执行 DMA传输模式。
在子系统和SoC级,验证内容和验证方法都有所不同。现在,我们不再专注于验证DMA引擎的实施,而是更加关注DMA引擎如何与子系统或SoC中的其他模块集成。另一个不同之处(特别是在SoC级)就是我们有一个嵌入式处理器,而且我们希望通过在该处理器上运行的代码来至少驱动一些测试活动。
对于子系统级环境,我们可以从类似于图4所示的方框图开始。
图3:方框图。
DMA引擎现在处于一个子系统环境中,该子系统包括一个处理器(使用总线功能模型去除)和其它IP。
将PSS描述转发到这个子系统/SoC环境中,需要执行以下两个步骤:
如上文所述,在这个环境中,我们的目标是验证DMA与子系统中其它IP的集成。为此,我们将运行多个并行 DMA传输。我们首先要做的是扩展我们的dma_c组件以指定可用的资源——在本例中,是31个DMA通道。然后,我们将创建一个新的操作类型,需要一个DMA通道并指定了其数据流要求。
我们更新的DMA组件和操作现在指定:
通过填补一些细节,我们创建了一个aes_c组件,以对AES块进行建模操作。请注意,do_encrypt操作需要一个存储器缓冲区,且我们已将输入数据的地址强制设为AES块的缓冲区地址。membuf_s输入的约束是双向的,因此当do_mem2mem_dma操作将数据发送到do_encrypt操作时,此约束会强制DMA定位到AES设备。我们还在aes_c组件中使用了一个资源库,以此指定在给定时间只能在AES块上发生一次操作。
最后,我们指定了一个组件来表示我们的系统,其中指定了可用资源(DMA和AES块)。另外,我们还指定了一个顶层操作来执行并行DMA传输。
请注意,我们只捕获了要执行四个并行DMA操作这一事实。这是一种不完全规范:我们不指定数据应该从何处传入,或者应该传去何处。PSS处理工具将推断并连接相应的操作,以确保生成合法场景。特别注意:
不完全规范是一种非常强大的技术,用于通过简单明了的规范生成复杂的测试场景。
在我们的子系统级环境中,DMA传输仍然由序列驱动,因此,我们可以复用在模块级环境中构建的与UVM环境集成的相同模式。在SoC级,我们的测试将使用C语言编写的效用函数来对DMA进行编程。
在许多情况下,这些效用函数会出现在驱动程序例程的开头,以便随后在OS驱动程序中使用。集成测试可调用这些相同的实用例程,因此这些实用程序将更具可信度,并可实现硬件IP的集成。
与我们的模块级环境类似,我们也可以将我们的核心PSS描述扩展到环境细节层。本例中,我们描述了将要调用的C API (wb_dma_drv_single_xfer),并定义了do_dma操作的一个exec块,其将会调用此API以及从DMA描述符传递值。
便携式激励工具有助于提高测试描述的层次,并且可对一些场景进行建模,这些场景往往很难使用定向和事务级随机约束测试进行创建。因此,他们可以自动创建更为独特的测试。
通过本文的示例,我们可以了解,Accellera PSS输入规范的功能可使测试意图能够重定向到不同的环境,而描述的核心仍然独立于环境。
另外,我们还发现,可以从现有的SystemVerilog描述中轻松引入随机字段和约束,也可以逐步采用标准的关键组件,极为简单,易于上手。
所以下次遇到超出随机定向或约束测试能力的验证任务时,请考虑应用便携式激励。
Matthew Ballance 是Mentor产品经理和便携式激励技术专家,主要负责Questa inFact便携式激励产品。Matthew毕业于俄勒冈州立大学,在EDA行业中拥有19年的经验。期间,他一直从事 硬件/软件协同验证、事务级建模以及IP封装和复用领域的产品开发、营销和管理工作。Matthew联系方式为 matt_ballance@mentor.com。