验证的视野

高级合成用户验证流程中的便携式刺激建模

迈克安德鲁斯和迈克Fingeroff导师,188bet西门子的业务

在过去的一两年里,便携式刺激已经成为验证界的热门话题,但是像大多数“新”概念一样,它从一些已经建立的工具和方法学演变而来。例如,多年来,使用诸如Questa∈inFact的基于图的刺激自动化工具,可以在不同设计抽象级别之间建立共同的刺激模型。高级合成(HLS),综合了SystemC/C++到RTL,多年来,大多数用户都使用家庭环境或有针对性的C测试来进行C级功能验证。由于HLS现在能够进行非常大的分层设计,然而,已经有越来越多的需要有一个验证方法,使高性能和生产有价值的约束随机刺激SystemC / C++,以实现覆盖在C级关闭,然后能够再现确切的刺激,测试合成的RTL的信心。本文描述了一种方法,其中,一个刺激模型可以被定义(和细化),以帮助达到100%代码覆盖的C++ HLS DUT,然后与合成的RTL一起在SystemVerilog或UVM测试台中重用。给出一个真正通用的模型,还可以维持两个环境之间的随机稳定性,允许在一个域中发现问题,然后在另一个域进行调试。

介绍

十多年前,ESL(Electronic System-level)方法学风靡一时,并且有许多语言选项承诺将提高设计和验证的抽象级别,与C / c++,SystemC和SystemVerilog主导的。C/SystemC是用于抽象硬件和系统建模的最流行的语言,SystemVerilog已经标准化了高级验证所需的必要特性,如受约束的随机刺激和功能覆盖。

同时,许多用户一直在寻找更有效的方法来描述刺激,具体地寻找方法以扩展可从紧凑描述自动化的验证场景的数目,同时也提高了发电过程的效率。

Questa∈inFact提供了这样的能力,使用基于规则/图的方法,借鉴了软件测试技术,增强了硬金宝博滚球专家件验证。因为这个基于规则的模型是独立于目标语言(它已经被应用于至少7个不同等环境)它一直是一个便携式的刺激方案。

HLS用户经常声明,他们从移动到C++/SystemC的设计的主要好处之一是验证的性能,这使得他们能够运行更多的测试。然而,没有标准的C环境的力量SystemVerilog高级验证功能,除其他事项外,还包括,随机/自动刺激建模。便携式刺激解决方案提供了这种能力和能力,此外还保留了为基于C的仿真环境创建刺激模型的投资,当RTL包装在SystemVerilog中时,将在下游利用该模型,反之亦然。

常用刺激模型

基于规则的刺激模型是:如你所料,创建层级结构主要从顶级规则文件,从默认模板通常变化很小,以及一个或多个模块化规则段文件。顶级规则文件声明main规则图,给图形模型命名,根据所选择的代码架构不需要包含以外的其他语句导入必要的规则部分文件定义的细节刺激应用。

下面的图1中的示例显示了四个独立的文件,其中两个test_data_C..test_data_SV..–两者都定义了一个名为test_data_gen.这两个顶级规则文件对应于特定于语言的包装图形组件实际刺激模式。换句话说,事实上自动生成器将创建一个C++类test_data_C,以及一个名为test_data_SV分别,和每一个将定义一个规则图模型test_data_gen.

图像
图1。分层规则代码体系结构

两个顶级规则文件都导入了实际定义行为的规则段文件的公共层次结构。通过将规则层次结构的所有定义保存在公共文件中,已编译的图模型的行为将相同。

这个test_data_C..文件有一个额外的构造,它是一个属性,用于指定生成的代码的语言特定要求。在这种情况下,它指定将包含语句添加到生成的C++类定义文件中所需的代码。该语言支持可用于定制生成的HVL文件的其他属性,但是这些对底层图形模型没有影响。

这个test_data_gen.rseg文件定义图形可以生成的场景的规则,在本例中是循环test_data的内容对象的随机化,如下面的图2所示。

图像
图2。test_data_gen规则图

注意:场景规则可以包括多个对象,相同对象类型的任一实例,或者多个不同类型的实例,以及其他图拓扑结构,稍后将对此进行简要描述。

这个测试数据对象本身,声明为结构在inFact规则语言中,在单独的规则段文件中定义,以允许模块化和重用。这个结构具有额外的层次结构,定义其他结构称为packedArray0packedArray1,在C++测试平台中,哪些镜像C++结构定义并用于DUT激励。

这是该方法的另一个关键因素,即规则图的引用对象具有相同的名称和等级制度,并使用可以映射到相应C++和SV类型的数据类型。因为事实上语言允许一些宽度定义为所有变量,这允许我们以Mentor算法位精确数据类型和SystemC数据类型为目标。

在这个例子中,测试数据对象的形式是从C实现的可配置向量乘法累加的C模型中得到的。因此,实现此方法的第一步是确定哪些DUT输入将被图模型随机化,它们的位宽是多少,并将它们收集到一个测试数据结构或类中。在这种情况下,,packedArray0包含一个8-element 10位值的固定大小的数组,,packedArray1包含一个类似的7位值数组。除了这些之外,还有一个4位的量,称为努姆科尔.用于这些结构的数据类型使用Mentor算法定义,位精确数据类型允许以任意精度对设计建模。

虽然这是从C++测试平台开始的,SystemVerilog域中还需要一个类似的对象。这个对象的System Verilog和C++版本如图3所示。

图像
图3。SV和C++的测试数据类型

SystemVerilog模型,就像inFact模型,可以包含代数约束,如果它曾经使用传统的SystemVerilog...()调用进行随机化,那么它可能应该被随机化。如果inFact图总是进行随机化,这是没有必要的。

注意:这个简单示例中的单个约束限制了努姆科尔至1至8的范围,但是inFact语言支持SystemVerilog中使用的所有公共约束运算符,有一些小的语法差异。作为奖励,对于熟悉SystemVerilog语法的人,可以从SystemVerilog创建或更新inFact图模型。

运行C TESTBENCH

一旦定义测试数据对象,便携式刺激的集成模型转换为C testbench非常简单。如前所述,C++类是由公共规则模型自动创建的,这个类有一个内置的方法,它与界面这是语言中定义的规则。这个test_data_gen.rseg文件声明一个名为填满,对任何类型的实例进行操作测试数据.这种生产方法,任务或函数生成的液力对象调用填充剂,简单前缀IFCI.

这种方法,任务或函数将接受一个参数,该参数是相同名称的相应HVL对象的句柄——即。这个测试数据前面显示的类或结构。

所以,集成机制是构建包含便携式刺激类的实例模型,然后调用填充剂具有测试台句柄的方法测试数据容器。下面的图4显示了来自C++测试平台的代码摘录,创建一个句柄test_data结构- td_h以及包含inFact模型的类的句柄-td_gen_h–与后者的构造函数调用定义的实例名事实上内部使用。这个inFact实例名称很重要,因为它将在后面讨论。

图像
图4。从c++ Testbench代码片段

在C++测试中的for循环中,呼叫填充剂方法可见,然后是TDYH结构实例的局部变量将被应用到DUT的长椅上的C函数。

这种架构与使用SystemVerilog随机类或序列项没有什么不同,并且.randomize(),,或者SystemC/SCV类及其“next”方法。唯一不同的是进行随机化的模型是inFact图模型。

在这个阶段,inFact便携式刺激模型添加的值是随机化几个数值的能力,而服从任何代数约束,可以定义这些值,或者他们的关系。

考虑覆盖率

事实上的额外价值模型是另一种类型的输入,可以覆盖在刺激模型,被称作覆盖策略.这个策略可以认为有点类似于SystemVerilog覆盖组,它定义了感兴趣的变量,这些值的期望箱,以及这些变量的交叉。区别在于,这是对随机化过程的输入,该随机化过程改变随机分布以有效地覆盖策略中的目标。

在这种情况下,正在测量的覆盖度量不是功能覆盖覆盖覆盖覆盖点/交叉,而是代码覆盖,这是更常见的在C / c++环境中(尽管功能覆盖率也可以实现)。所以覆盖策略中定义的目标应该是,顾名思义,期望实现高代码覆盖率的策略(或策略)的编码,或者针对其他战略中没有包括的具体领域。

由于本例中的DUT——乘法器——非常简单,一个相当简单的策略就足够了。inFact工具集包括可以从各种输入创建覆盖策略的实用程序,包括预定义类型的自动策略,使用CSV文件或电子表格定义的自定义策略,还有一个图形编辑器。在这个例子中,可以使用自动化策略,在隔离目标每个刺激变量,即没有十字架。对于测试数据层次结构(包括每个数组元素),实用程序将确定所有的法律价值,利用对约束的分析,然后把它们分成一定数量的箱子。对于这个示例,总共指定了128个bins,因为这意味着所有科夫该数组中每个7位元素的值都被覆盖。如果需要,可以添加不同的边框(范围顶部和底部的单个值),在这种情况下,较大的数量(10位数据值)在两个极端中的每个极端都创建了两个单值箱。

正如所希望的那样,在运行自动化策略到完成之后,代码覆盖率结果非常好(参见下面的图5),达到了100%(初始纯随机测试方法的结果降低了大约20%)。

图像
图5。代码覆盖结果

注意:能够实现100%代码覆盖在C++源上是非常重要的是能够容易地关闭覆盖在合成的RTL从HLS使用相同的刺激。这是因为调试c++覆盖问题远比调试更容易从HLS RTL的输出。

图像
图6。SystemVerilog Testbench代码摘录

具有随机稳定性的便携式刺激器

虽然代码覆盖率很高,本文的重点是描述一个刺激模型是如何实现的,和一个或多个相关报道策略,188beat可以为一个域开发,然后在另一个域中重新运行。用户可以定义inFact刺激模型的种子,或者简单地从原始运行输出到文件。

可以将模型的SystemVerilog包装版本放入SV测试台中,以与C版本相同的方式驱动RTL DUT,即简单地实例化包含它的SV类对象,然后使用它的内置任务–ifc_.–随机SystemVerilog的内容测试数据类,如图6所示,上面。

在这种情况下,在测试数据类需要重新格式化以适应作为DUT输入的宽reg对象,但这很简单,使用连接运算符.{arrEl[0],…,arrEl[N]}——实现这个目标。在这个例子中,可以通过策略的另一个可用的内置函数查询覆盖策略的状态–allCoverageGoalsHaveBeenMet()–并且用作用于生成新输入或定义用于测试的循环退出条件的限定符。

在运行SystemVerilog测试台时,为RTL DUT生成的代码覆盖率也很高——在这种情况下,为97.11%,当运行直到范围战略完成后,如图7所示。

图像
图7。RTL代码覆盖结果

虽然这个例子很简单,但它确实说明了Questa∈inFact工具套件提供的通用便携式刺激模型的可重用性。当然,DUT的RTL版本总是可能需要额外的测试来处理添加到合成的RTL中的附加行为。这是因为HLS处理增加了额外的结构中不存在不计时的c++源描述如stall-able接口协议,控制FSM,以及时钟和重置逻辑。然而,通过使用事实上的便携式刺激模型来关闭100%的C++覆盖,我们保证在运行RTL验证时获得相同的设计功能覆盖。那么简单的添加额外的测试覆盖其余结构由HLS补充道。

创建更复杂的场景

可以以这种方式创建任意数量的规则图场景模型,并将其应用于任意领域。例如,可以通过添加创建测试数据对象的两个实例的新规则段来创建新场景——td1td2 -并使用它们在相同的填充接口系列规则。这允许创建覆盖策略,以实现测试数据,例如这个努姆科尔变量。图8显示了这个新的规则图以及努姆科尔变量TD1TD2作为交叉覆盖的目标字段。

图像
图8。具有两个测试数据实例的场景

总结

便携式刺激方案的存在可以帮助将先进的验证能力带入基于C的高级验证环境,并且还允许在刺激模型和其他抽象级别的覆盖信息中重用投资。高级合成用户可以特别受益于此,特别是如果创建的刺激可以通过seed-based反映在两种环境中随机稳定性,因为他们更熟悉的C源设计,会更容易开发一组全面的刺激模式在这一水平。HLS用户,便携式刺激给他们提供了基于标准的方法,以可预测和快速地关闭从C到RTL的覆盖范围。

闲聊γ 接触