西门子业务导师Matthew Ballance撰写
在上一篇文章中 验证的要点:用于便携式刺激的重铸SystemVerilog, 我们描述了验证团队如何使用现有的SystemVerilog结构和原理来快速启动便携式刺激测试描述的创建。现在,从类比转换为成语,我们将深入探讨如何重组SystemVerilog以进行重用的“关键”。
具体来说,我们将共享基本的实用概念和编码准则,这些准则和编码准则使SystemVerilog类,约束和覆盖组更适合在“便携式刺激规范(PSS)”描述中自动重用。由于已经在SystemVerilog中创建了如此多的内容,因此,利用您内部已经拥有的基于SystemVerilog的部分描述,可以加快PSS描述的创建速度,并带来即时的生产力收益。
本文中提出的构造SystemVerilog以供重用的准则反映了对完全自动化的流程的偏好,该流程可以重用捕获的信息,并反映出从Mentor Graphics的Questa inFact便携式测试工具用户的经验中演变而来的最佳实践。
专注于构造
SystemVerilog是用于寄存器传输级别(RTL)设计和验证的功能齐全的语言。这样,它包括从Verilog语言继承的用于描述硬件结构的结构。它还包括面向对象的编程结构以及用于自动刺激生成和功能覆盖率收集的结构,这些结构用于验证硬件描述。
PSS语言主要是一种声明性语言,具有一些过程结构。相反,SystemVerilog主要是具有一些声明性构造的过程语言。
由于PSS具有声明性,因此SystemVerilog描述中的声明性构造最容易作为PSS描述的一部分重用:特别是,数据结构和这些数据结构的字段约束以及Covergroup用于建模功能覆盖目标。通常,对SystemVerilog描述的重用产生负面影响的设计模式是那些将过程和声明性描述混合使用,或者影响声明性描述的封装的设计模式。
在大多数情况下,支持重用的最佳实践也仅仅是可以产生良好封装的代码的良好SystemVerilog编码实践。当然,在某些情况下,使用限制重复使用的构造和模式是实用或必要的。即使在这些情况下,稍加预见也可以在可重用的构造和实用的设计模式之间保持合理的平衡。
构建SystemVerilog以供重用的目标是创建可包含自包含元素,这些元素可从SystemVerilog描述中提取并添加到PSS描述中。现在,我们将分别详细研究其中的一些元素,以了解如何做到这一点。
内联随机约束
当对象随机化时,SystemVerilog允许指定内联约束。这是自定义随机事务以创建有向随机测试序列的便捷方法。 图1 显示了有向随机测试,该测试利用现有事务类和内联约束来执行一系列读取和写入操作。

虽然在SystemVerilog测试平台中使用此设计模式可能非常有用,但确实会限制重用。内联约束是在程序块中引入的,通常会包含对该程序块内变量的引用。因此,很难重用这些内联约束,即使不是没有可能。
内联约束当然也可以被滥用。作者在testbench环境中工作,在该环境中仅指定了一百行内联约束来确保类字段之间的有效关系。更糟糕的是,将这些较大的内联约束块复制到多个测试中,从而在需要调整这些基本约束时导致维护麻烦。
通过将内嵌约束块中的常见约束分解为因子,可以提高代码的可维护性和重用性。 图2 显示了如何通过创建读取事务和写入事务类来排除读/写内联约束。这增加了测试的可读性和可维护性,并提供了可以在PSS描述中重用的更多特定元素。

动态启用/禁用约束块
SystemVerilog程序代码与声明性约束之间的另一种交互作用是支持动态启用和禁用约束块。在理想情况下,在非常有限的情况下使用动态禁用约束来执行诸如启用非法交易之类的操作。动态约束块控制的一种非常有问题的用法是必须禁用至少一个块才能成功完成随机化。 图3 显示了一个操作序列项类,该类指定了两个冲突的约束条件–一个设置“正常”操作模式,另一个设置“扩展”操作模式。此类的用户必须知道在将对象随机化之前禁用normal_mode_c或ext_mode_c约束中的至少一个。

从重用的角度来看,使用动态控制的约束提出了两个挑战。当前的PSS语言没有提供用于动态控制约束的工具。因此,至少要对PSS描述进行其他更改才能适应从SystemVerilog导入的描述。此外,冲突约束的使用在SystemVerilog和PSS描述中都提出了可用性挑战。必须在某处记录有效/无效约束块的有效组合。充其量,有效的启用/禁用约束块将作为注释捕获,可能不会传播到PSS描述。最糟糕的是,启用/禁用约束块的有效组合是在工作测试序列中捕获的“部落知识”。
使用类层次结构和约束重载而不是动态约束可以启用/禁用更易于使用的SystemVerilog序列项中的结果,以及易于重用为PSS一部分的SystemVerilog描述。有两种等效的方法来构造类层次结构,以处理通常使用动态约束启用/禁用来实现的案例。第一种方法是加性约束重构,如图所示。 图4。使用这种方法,派生类仅添加实现其预期目的所需的约束。因此,normal_op_item类添加了约束以确保仅生成“正常”模式,而ext_op_item类添加了约束以确保仅生成“扩展”模式。这种方法是一种很好的通用方法。

第二种方法,减性约束重构,通常用于创建异常的用例,例如错误注入。以目前为止使用的示例为例,假设“正常”模式是大多数情况下使用的模式。
图5 显示了normal_op_item类的定义,其中包含强制执行“ normal”操作的约束。为了创建可以通过禁用“ normal_mode_c”约束而创建的“例外”条件,ext_op_item类使用空约束覆盖了normal_mode_c约束-以声明方式有效地禁用了该约束。

使用类层次结构和约束重构会在SystemVerilog环境中产生可重用的类。通过将控件从过程描述移到描述的声明部分,它还会生成可在PSS描述中重用的SystemVerilog描述。
引用全球数据
在SystemVerilog和PSS描述中,在类之外引用全局数据项都面临重用的挑战。 图6 显示了这种情况,其中transform_item类中的系数字段由global_data_pkg包中的全局最小值和最大值字段界定。

当然,这具有其便利的方面,即允许每个测试平台环境设置一次系数范围。不利之处在于,这使重用更具挑战性。也许系数界限在原始测试平台环境中是全局的,但事实并非总是如此。也许在下一个测试平台环境中,将有两个使用transform_item类的UVM代理。这些代理中的每一个都可能需要对系数使用不同的界限。
图7 显示了一种通过在类内部创建字段来删除全局数据引用的方法。随机化重构的transform_item类的过程SystemVerilog代码将需要在随机化该类之前设置coeff_min和coeff_max。但是,重构后的代码会生成一个自包含的类,并且易于重用。自包含类在PSS中也更可重用,因为没有引用外部实体。

可重复使用的功能范围
SystemVerilog封面组为监视和汇总测试平台数据提供了异常灵活的结构。但是,构造的出色灵活性会影响其可重用性。
图8显示了SystemVerilog封面组,其结构非常适合PSS描述中的重用。所有coverpoint和cross-coverpoints都引用config_item类字段项,该字段项指定为covergroup的参数。这样可以确保封面组是独立的。另外,covergroup监视的类别与用于产生刺激的类别相同。这允许生成有效满足覆盖率目标的配置,而无需用户提供其他指令以将刺激生成类与用于捕获覆盖率数据的类相关联。

结论
PSS标准允许在描述中捕获测试激励,预期结果和覆盖目标的单一表示,该描述可在从UVM到软件驱动的测试环境的整个测试环境中重用。
使用上述用于模块化和重用的最佳实践有助于在SystemVerilog环境和PSS描述中重用。总而言之,这些最佳做法是:
- 避免使用内联约束。
- 避免启用和禁用过程代码中的约束。
- 避免从约束中引用类外部变量
- 结构化功能覆盖范围描述以显式引用单个类,理想情况下是激励生成类
重复使用大量现有的SystemVerilog描述(例如事务和设备配置类),使用户可以更快速地利用Portable Stimulus工具的优势,例如有效关闭测试目标和自动创建C测试。
Questa inFact便携式刺激工具的许多用户已经通过使用该工具的SystemVerilog导入功能来导入现有配置类并快速创建便携式刺激模型,从而利用了这种重用路径。
这结束了我们的四部分系列文章,涉及如何使用现有的UVM和SystemVerilog描述来加速便携式刺激模型的创建。如果您还没有的话,请参阅以前的EE World文章,以了解更多有关如何将验证工作提升到更高效率和重用性的信息。
Matthew Ballance是Mentor Graphics的产品工程师和便携式刺激技术人员,与Questa inFact便携式刺激产品一起工作。在EDA行业的过去20年中,他曾在硬件/软件协同验证,事务级别建模以及IP封装和重用领域从事产品开发,营销和管理职务。 Matthew毕业于俄勒冈州立大学。
发表评论