验证视野

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

由Mike Andrews和Mike Fingeroff,Mentor,Siemens 188betBusiness

在去年或两者中,便携式刺激已成为验证社区中的嗡嗡声,但与大多数“新的”概念一样,它已经从一些已经建立的工具和方法中发展出来。例如,使用像Questa®Fifact这样的基于图形的刺激自动化工具,可以在不同级别的设计抽象之间具有共同刺激模型。高级合成(HLS),合成SystemC / C ++到RTL的许多年也可用多年,大多数用户使用家庭种植环境的混合或指示C测试在C电平进行功能验证。然而,随着HLS现在能够做出非常大的层次设计,因此越来越需要进行验证方法,这使得能够为SystemC / C ++提供高性能和生产价值的随机刺激,以便在C级别实现覆盖闭合然后能够再现精确的刺激来测试合成的RTL以获得置信度。本文介绍了一种方法,可以定义刺激模型(并改进),以帮助达到C ++ HLS DUT的100%代码覆盖,然后在SystemVerILOG或UVM测试窗中重复使用合成的RTL。给定真正的常见模型,也可以在两个环境之间保持随机稳定性,允许在一个域中找到一些问题,然后在另一个域中调试。

介绍

几十来,ESL(电子系统级)方法都是愤怒,并且有许多语言选项承诺为设计和验证提高抽象级别,用C / C ++,Systemc和SystemVerilog是主导的。虽然C / SystemC是抽象硬件和系统建模最普遍的语言,但SystemVerilog标准化了高级验证所需的必要功能,例如约束随机刺激和功能覆盖。

与此同时,许多用户一直在寻找更有效的方法来描述刺激的方法,特别是寻找可以从紧凑的描述中自动化的验证场景的数量的方法,并提高了生成过程的效率。

Questa®Fifact仅提供了这种功能,具有基于规则/图形的方法,从软件测试技术借用并增强了硬件验证。金宝愽备用网址由于基于规则的模型独立于目标语言(它已应用于至少7个不同的HVL环境),因此它一直是便携式刺激解决方案。

HLS用户经常说明他们从搬到C ++ / Systemc进行设计的主要好处之一是验证的性能,使它们能够大大运行更多的测试。但是,C环境中没有标准,具有SystemVerilog的能力,用于高级验证能力,包括在其他内容中,随机/自动刺激建模。除了在RTL在SystemVerilog包装时,保留对基于C基仿真环境的刺激模型来实现基于C的仿真环境的刺激模型以及反之亦然,提供这种电力和能力。

共同的刺激模型

该rule-based stimulus model is, as you might expect, created hierarchically from a main top-level rule file, which typically varies very little from a default template, and one or more modular rule segment files. The top level rule file declares the mainrule_graph.,给出图形模型一个名称,具体取决于所选择的代码架构不需要包含除语句以外的任何其他内容以导入定义要应用的刺激措施的详细信息的必要规则段文件。

下面图1中的示例显示了四个单独的文件,其中两个 -test_data_c.rules.test_data_sv.。rules- 都定义了一个名为的图形对象test_data_gen。该se two top level rule files correspond to graph components that are language specific wrappers for the actual stimulus model. In other words, the inFact automated generators will create a C++ class calledtest_data_c.和一个名叫的sv课test_data_sv.respectively, and each of these will define a rule graph modeltest_data_gen

图片
图1.分层规则代码架构

两个顶级规则文件都导入实际定义行为的规则段文件的常见层次结构。通过将规则层次的所有定义保持在常见文件中,编译的图形模型将表现相同。

test_data_c.rules.file has an extra construct, which is an attribute that specifies language specific requirements for the code generated. In this case, it specifies the code needed to add an include statement to the generated C++ class definition file. The language supports other attributes that can be used to customize the generated HVL files, but these have no effect on the underlying graph model.

test_data_gen.rseg.文件定义了图形可以生成的方案的规则,在这种情况下,它只是通过下面图2所示的Test_Data对象的内容的随机化来循环。

图片
图2. test_data_gen规则图

注意:该scenario rule could include multiple objects, either instances of the same object type, or instances of multiple different types, as well as other graph topology constructs, and this will be described briefly later.

test_data对象本身,声明为一个塑造in the inFact rule language, is defined in a separate rule segment file, to allow for modularity and re-use. This struct has additional hierarchy, defining other structs calledPackedarray0.packedarray1.,哪些镜像C ++结构定义并用于C ++ Testbench中的DUT刺激。

这是方法的另一个关键元素,即规则图表引用具有相同名称和层次结构的对象,以及使用可以映射到相应的C ++和SV类型的数据类型。由于infoct语言允许为所有变量定义位宽,这允许我们针对导师算法比特准确的数据类型和系统数据类型。

在该示例中,测试数据对象的形式围绕实现可配置向量乘积的C模型围绕C ++ Testbench导出。因此,实现该方法的第一步是确定图形模型中哪个DUT输入,它们的位宽是什么,并将其收集到测试数据结构或类中。在这种情况下,Packedarray0.包含一个8元件固定尺寸的10位值阵列,packedarray1.包含类似的7位值阵列。添加到这些是一个名为4位数量num_col.。用于这些结构的数据类型是使用导师算法,比特准确的数据类型定义,允许设计以任意精度建模。

虽然这始于C ++ TestBench,但还需要在SystemVeriLog域中存在类似的对象。此对象的SystemVerilog和C ++版本如图3所示。

图片
图3. SV和C ++的测试数据类型

SystemVerilog模型,如Infact Model,可以包含代数约束,并且可能应该使用传统的SystemVerilog .randomize()呼叫随机化。如果InfAct图表始终会执行随机化,则这不是必需的。

注意:这个简单示例中的单个约束限制了值num_col.to the range 1 up to 8, but the inFact language supports all the common constraint operators that are used in SystemVerilog, with some minor syntax differences. As a bonus, for those familiar with SystemVerilog syntax, a utility is available to create or update the inFact graph model from the SystemVerilog one.

在测试禁止中运行c

Once the test data object is defined, the integration of the portable stimulus model into the C testbench is quite simple. As mentioned previously, a C++ class is created automatically from the common rule model, and this class has a method built-in that corresponds to aninterfacethat is defined in the rules language. Thetest_data_gen.rseg.文件声明一个调用的界面,它在类型的任何实例上运行test_data。这在名为的生成的HVL对象中生成了一种方法,任务或函数IFC_FILL.,简单的预先完成IFC_

此方法,任务或函数将采用与相同名称的相应HVL对象的句柄 - 即test_data之前显示的类或结构。

因此,集成机制简单地构建包含便携式刺激模型的类的实例,然后调用其IFC_FILL.用手柄到测试台的方法test_datacontainer. Figure 4 below shows a code excerpt from the C++ testbench, with the creation of a handle to thetest_data struct - td_h -和a handle to the class containing the inFact model- td_gen_h -使用后者的构造函数调用定义内部Infart的实例名称。此InfAct实例名称很重要,因为它将稍后讨论。

图片
图4. C ++ Testbench的代码片段

在C ++测试中的循环内部,呼叫到IFC_FILL.可以看到方法,然后分配内容的分配td_hSTRACT实例到将应用于该工作台中DUT的C函数的本地变量。

此架构与使用SystemVerilog随机类或序列项以及序列项并不不同.randomize(),or a SystemC/SCV class with its ‘next’ method. The only difference is that the model doing the randomizing is an inFact graph model.

在此阶段,INFACT便携式刺激模型正在添加的值是能够随机化多个数值,同时遵循可以在这些值或其关系中定义的任何代数约束。

CONSIDERING COVERAGE

Infact模型的额外值是还有另一种类型的输入,可以覆盖在刺激模型上,这些输入被称为a覆盖策略。该策略可以稍微类似于SystemVerilog覆盖群,因为它定义了感兴趣的变量,这些值的所需频率,以及这些变量的十字架。不同之处在于这是对随机化过程的输入,其改变了随机分布,以有效地涵盖策略中的目标。

在这种情况下正在衡量的覆盖度量不是正常的覆盖封印点/交叉,而是代码覆盖,在C / C ++环境中更常见(尽管也可以实现功能覆盖率)。因此,覆盖范围策略中定义的目标应该是,据称暗示,预期的策略(或策略)的编码,以实现高码覆盖,或者目标不包括在其他策略中的特定区域。

由于这个例子中的DUT - 乘数 - 非常简单,一个相当简单的策略可能就足够了。Infact工具集包括可以从各种输入中创建覆盖策略的实用程序,包括使用CSV文件或电子表格定义的预定义类型的自动策略,以及图形编辑器。在该示例中,可以使用自动策略,其在隔离中瞄准每个刺激变量,即没有交叉。对于每个变量test_data层次结构(包括每个数组元素),该实用程序将确定采用限制分析的所有法律值,并将它们分成已定数量的箱子。对于这个例子,指定了总共128个垃圾箱,因为这将意味着所有的COEFF.该数组中的每个7位元素覆盖值。如果需要,可以添加明显的边缘箱(范围顶部和底部的单个值),在这种情况下,较大的数量 - 10位数据值 - 在两个中的每一个中创建了两个单值箱极端。

如希望在运行自动策略完成后,代码覆盖结果非常好 - 见下文 - 击中100%(初始纯随机测试方法的结果约为20%)。

图片
图5.代码覆盖结果

注意:能够在C ++源上实现100%的代码覆盖对于能够在使用相同的刺激的HLS中容易地在合成的RTL上轻松覆盖。这是因为调试C ++覆盖问题比调试HLS的RTL输出更容易。

图片
图6. SystemVerilog Testbench Code摘录

PORTABLE STIMULUS WITH RANDOM STABILITY

虽然获得高电平覆盖率很好,但本文的重点是描述刺激模型和一个或多个伴随的覆盖策略,可以为一个域开发,然后在另一个领域重新运行。188bet手机官网Infact刺激模型的种子可以由用户定义,或者只是从原始运行输出到文件。

该模型的SystemVerilog包装版本可以丢弃到SV TestBench中以与C版本相同的方式驱动RTL DUT,即只需实例化包含它的SV类对象,然后使用其内置任务- IFC_FILL -随机化SystemVerilog的内容test_data课程,如图6所示,上面。

在这种情况下,该packed arrays used in thetest_data类需要重新格式化以适合在这种情况下的DUT输入的宽reg对象,但是非常简单,使用级联运算符 - {relel [0],...,relel [n]} - 到实现这一目标。在此示例中,可以通过策略的另一个可用内置功能查询覆盖策略的状态- AllCoverageGoalsHaveBeenmet() -和used as a qualifier for generating new inputs or to define a loop exit condition for the test.

When the SystemVerilog testbench is run, the code coverage produced for the RTL DUT is also high – 97.11% in this case, when running until the coverage strategy was completed, as shown below in figure 7.

图片
图7. RTL代码覆盖结果

While this example is simple it does illustrate the re-usability of the common portable stimulus model that the Questa® inFact tool suite provides. Of course additional tests are always likely to be needed for the RTL version of the DUT to handle the additional behavior added to the synthesized RTL. This is because the HLS process adds additional structures that do not exist in the untimed C++ source description such as stall-able interface protocols, control FSMs, and clock and reset logic. However, by closing 100% coverage on the C++ using an inFact portable stimulus model we are guaranteed to get the same coverage of the design functionality when running RTL verification. Then it is simply a matter of adding additional tests to cover the remaining structures added by HLS.

创建更复杂的方案

Any number of rule graph scenario models can be created in this way and applied in either domain. For example, a new scenario can be created by adding a new rule segment that creates two instances of the test data object- TD1.TD2 -和uses them in the same fill interface in series in the rule. This allows the creation of a coverage strategy that would achieve transition coverage of one of the fields intest_data,例如,该num_col.变量。图8显示了新规则图表和选择num_col.变量in.TD1.TD2.作为跨覆盖范围的字段。

图片
图8.具有两个测试数据实例的场景

概要

便携式刺激解决方案的存在可以帮助为C的高级验证环境带来先进的验证功能,并还允许在刺激模型中重用投资,并以其他级别的抽象覆盖信息。高级综合用户可以特别受益于此,特别是如果可以通过基于种子的随机稳定性在这两个环境中镜像的刺激,因为它们更熟悉了C的设计来源,并且会发现更容易开发全面这一级别的刺激模型集。对于HLS用户来说,便携式刺激使其基于标准的方法,以预测和快速地将C到RT覆盖。

| 联系