众所周知的事实是,验证消耗了大约 70% 的产品周期时间,根据 2018 年进行的一项调查,验证工程师花费大约 44% 的时间进行调试。 SoC 复杂性的增加导致验证环境中使用的组件数量增加,这导致日志文件庞大,因为从这些组件中打印了一些信息。改进这些日志变得势在必行,因为它们是最常用的调试手段之一。这就需要开发一种定制打印机,它可以有效地打印有用的信息以进行调试。自定义事务打印机,称为 xaction_custom_printer,是一种自定义打印机,有助于提高调试效率,减少日志大小,提高可读性,从而提高整体生产力。
随着片上系统(SoC)设计面积和复杂性的增加,验证的责任和工作量巨大,成为整个SoC设计流程的瓶颈。因为验证就是检查设计的正确性,所以任何验证环境中最关键的部分之一就是预期输出计算。此类 SoC 的每个模块之上都有许多验证组件,每个设计验证组件通常由一个监视器组成。这些预期和实际输出由监视器观察,监视器直接/间接在日志中打印此信息。
如果实际输出与预期输出之间存在任何差异,则设计验证工程师会花费大量时间进行调试。尽管有冗长的机制,但验证工程师需要最少的消息进行调试,因为通常会有非常长的日志包含详尽的事务数据包。为了解决这个问题,开发了 xaction_custom_printer。
第 2 节解释了定制转换打印机如何解决验证工程师面临的问题以及对这个组件的需求。第 3 节展示了如何开发组件的基本思想。第 4 节显示了可以使用此自定义事务打印机的两种方式以及一些代码,以便更好地理解。第 5 节强调了自定义事务打印机相对于使用通用事务数据包的行、树和表格打印机的优势。
为什么我们需要自定义事务打印机?
在验证过程中,尤其是在初始阶段,当 RTL 设计不成熟时,在测试过程中可能会出现很多故障。工程师可以通过日志文件识别故障原因。通常情况下,工程师需要查看交易数据包以查看特定变量在特定时间戳的状态。理想情况下,日志文件中会打印数百个此类数据包以进行测试。
以任何协议的数据包为例,它包含很多信息,如地址、读地址、写数据、读数据、操作(读/写)和模式(单次/突发)。数据包中的这些变量中的至少一个可以具有数组。对于数组大小从几十到几百不等的情况,日志文件会变得非常庞大,这些数据包会打印多次。除此之外,调试过程还需要花费大量时间查看这些日志。在这些日志中,来自组件的转换数据包被非常频繁地打印出来,并在每次从组件调用它们时以不同的时间戳显示存储在其中的数据。为了调试,当使用 uvm_default_table_printer 时日志的数组大小很大时,用户需要在日志中来回切换。
SystemVerilog UVM包含一个 uvm_printer 类,它为打印各种格式的 uvm_objects 提供了一个接口。uvm_printer 的子类型实现不同的打印格式或策略。这些子类型包括 uvm_printer、uvm_line_printer、uvm_tree_printer、uvm_table_printer。我们已经开发了一个用户定义的打印机,它将致力于消除 uvm_table_printer 的缺点。
xaction_custom_printer 是从 uvm_printer 扩展而来的,打印机的输出格式看起来像是 uvm_table_printer 和 uvm_line_printer 的混合体,因此结合了两者的优点。xaction_custom_printer 简洁地显示数据包,以像表格打印机一样分区良好的方式显示变量的名称和值,并且在某种程度上类似于行式打印机的多行。
这台打印机的输出可以在一行中使用,直到某个预定义的字符,之后它会在不同的行中继续。这种类型的输出在数组很大的地方很容易阅读。如果在 uvm_table_printer 中打印了相同的数组,工程师将需要多次上下滚动日志。由于是单行,所以不需要上下多次。打印机的格式允许清楚地看到变量的名称和值,这是调试所需的全部内容。
这台打印机是如何开发的?
为了开发自定义打印机,所需的打印格式在 emit() 函数中进行了编程,该函数覆盖了父类 (uvm_printer) 的相同函数。此处显示了有关如何开发组件的基本思想的图示。
图 1. 如何开发自定义事务打印机的顶级理念
如何使用这台打印机?
用户只需要将文件包含在包或文件列表中即可包含在编译流程中,并且需要将其作为函数调用。有两种使用本打印机的方法。
默认打印机机制 - 用户可以将此打印机设置为 uvm_default_printer,如下图 2 所示,因此项目/SoC 中的所有打印都将以这种格式打印。
图 2. 将自定义事务打印机设置为 uvm_default_printer
选择性打印机机制 - 用户只能通过在 sprint 中的交易项目的 convert2string 中传递打印机来为仅选定的块配置此打印机,如下面的图 3 所示。
图 3:为选定块使用 xaction_custom_printer 的方法
为了用这台打印机打印数据包,可以通过调用这个函数来完成,如下图4所示。
图 4:使用 convert2string 打印交易项目的方法
用户还可以使用自定义事务打印机打印事务数据包,以便将数组打印在单独的行中,并将标量变量保持在同一行中。这种类型的交易数据包打印机制将帮助用户一次读取数组内容。5.5 节展示了这个交易包的外观示例
插图
这是一个例子来展示 xaction_custom_printer 相对于其他三个 uvm_printer 的优越性。在示例中,我们采用了一个通用数据包。以下变量用于解释此自定义打印机相对于默认打印机的优势。
图 5:uvm_sequence_item 中的通用数据包(事务项)
1.1 使用行式打印机输出
1.2 使用树形打印机输出
5.3 使用台式打印机输出
5.4 使用自定义打印机输出
5.5 使用具有在单独行中打印阵列的功能的自定义打印机输出。
定制打印机的优势
显示调试最需要的信息
减少日志大小
提高可读性
通过提高调试效率来节省时间
简洁的外观
Custom Transaction Printer 是我们在 eInfochips 开发的一个组件,旨在为验证工程师面临的问题之一提供解决方案。使用通用数据包示例显示了这款定制打印机相对于内置 uvm 打印机的优势。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !