验证的视野

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

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

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

介绍

十多年前,ESL(电子系统级)方法都是语言的愤怒和有很多选项,承诺提高抽象层次的设计和验证,与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..文件有一个额外的构造,它是一个属性,用于指定生成的代码的语言特定要求。在这种情况下,它指定的代码需要添加include语句生成的c++类定义文件。该语言支持可用于定制生成的HVL文件的其他属性,但是这些没有影响底层的图模型。

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

图像
图2。test_data_gen规则图

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

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

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

在这个例子中,测试数据对象的形式来源于周围的c++ testbench multiply-accumulate C模型,实现了一个可配置的向量。因此在实施这种方法的第一步是确定哪些DUT的输入是随机图模型,它们的位宽是多少,并将它们收集到一个测试数据结构或类中。在这种情况下,,packedArray0包含一个8-element 10位值的固定大小的数组,,packedArray1包含一个类似的7位值数组。添加到这些是叫一个4比特数量num_col.使用的数据类型定义这些结构使用导师算法,位精确数据类型允许以任意精度对设计建模。

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

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

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

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

运行C TESTBENCH

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

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

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

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

在一个for循环在c++测试中,呼叫ifc_fill方法可以看出,紧随其后的内容的分配td_h结构实例的局部变量将被应用到DUT的长椅上的C函数。

这个架构并不是任何不同于使用SystemVerilog随机类或项目和序列.randomize(),,或SystemC / SCV类以其“next”方法。唯一的区别是,模型做随机化是一种事实上的图模型。

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

考虑覆盖率

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

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

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

希望,在运行自动化策略到完成之后,代码覆盖率结果很好——请参见下面的图5——达到100%(结果从最初的纯随机测试方法约低20%)。

图像
图5。代码覆盖结果

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

图像
图6。SystemVerilog Testbench代码摘录

便携式刺激与随机稳定

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

可以将模型的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 -并使用它们在相同的填充接口系列规则。这允许创建覆盖策略,以实现测试数据,例如的num_col变量。图8显示了这个新规则图形的选择num_col变量TD1td2作为交叉覆盖的目标字段。

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

总结

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

闲聊| 接触