电子说
调试(Debug),是个非常广泛的话题,让我先尝试给它下个定义:
调试指的是在遇到工程问题的时候,通过一些手段来进一步诊断问题原因,探索解决方法,最终使得系统功能正常运行的必要过程。
调试应该说是任何一个工程师解决问题的必备技能,对于芯片验证工程师来说更是如此。调试通常没有固定的章法,不可能按照某一个流程步骤就可以解决所有的工程问题,毕竟在实际环境中遇到的问题千差万别,可能只是你的某一个命令参数敲错了,可能是RTL逻辑设计上存在bug,也可能是设计规格(Specification)本身就存在纰漏,等等等等。
尽管调试方法不固定,但调试思想还是很一致的,那就是:尽可能的获取更多的有效信息,并对这些信息做综合分析。你细品,比如最常用的导出仿真日志(log)或者波形文件,这些方法本身就是为了获取更多的有效信息,这些信息能够帮助我们更好地去了解现在RTL的功能行为,帮助我们进一步对问题进行定位。
回到本文主题,本文要介绍的内容就是调试过程中常用的方法和技巧,这些方法的合理应用可以获得上面说的有效信息,从而提高我们解决问题的效率。而至于如何做信息的综合分析,需要根据具体场景和经验才能完成。
方法1:文件和参数索引的建立
之所以把建立文件和参数的索引也说成是调试方法,是因为在面对一个组件繁杂的验证环境,或者规模庞大的设计的时候,能够快速地检查相对应特性的规格文件、配置文件、宏定义、类型定义、参数配置、类原型、函数原型等信息,极有可能就可以解决掉一些低级的错误了。
要快速地找到这些有效信息,一方面依赖于工程师对当前验证环境和设计配置文件的熟悉程度,另一方面可以借助一些工具来找到它们。后者就是本节所要介绍的内容,下面就直接罗列我工作中最常用的一些工具和命令。
以上提到的工具和命令,都可以在网上找到大量的教程。如果有时间,我再写一些小的使用Tip放到公众号上。
方法2:波形的导出和使用
通过波形可以很直观地看到RTL随时间变化的所有行为细节,尽管拉波形看信号变化看多了容易眼睛瞎掉,但不得不承认大多数情况下没有波形的话问题定位会变得寸步难行。波形文件是仿真过程的副产物,它按照一定的格式将每个仿真事件发生时刻的信号和变量状态记录下来,并最终以图形化的方式呈现出来。
波形文件的格式很多,比如VCD、FSDB、VPD、WLF等等。
$dumpfile("name.vcd")
和$dumpvar()
来导出。$fsdbDumpfile("name.fsdb")
和$fsdbDumpvars(0, top)
去导出。注意,要用着两个函数需要将Verdi安装目录中share/PLI下的相关库添加到动态链接库路径($LD_LIBRARY_PATH)中,或者有参数(比如Mentor工具用的-pli)去指定PLI库的路径。$vcdpluson
去导出,在VCS做编译和仿真的时候需要指定debug能力,比如加参数-debug_all。以上提到的函数调用在参数上具有很大灵活性,可以指定具体要dump波形的RTL层级、scope范围甚至指定哪些信号。此外还有其他函数可以用来限制波形文件大小、波形dump开关、导出Memory数据等等。
尽管不同格式的波形文件有以上差异,但在应用的时候大部分情况下取决于你有什么EDA工具可以用,另一方面这些波形格式也有工具可以相互转化。
仿真波形在使用的时候通常有一些技巧,方便问题的定位和重现,下面列举几个常用的:
方法3:仿真日志的导出和使用
仿真日志(常说的log文件)通常是我们查看仿真结果会首先打开的文件。该文件中可以包含整个仿真过程中由编译器和仿真器打印输出的各种文本信息,比如当前导入了哪些文件、本次编译和仿真分别用到了哪些参数、当前DUT的顶层是哪一层、仿真过程中不同时刻的关键动作和信息、本次仿真的结果和资源开销等等。
基于文本的仿真日志记录和对仿真日志的手动分析看起来是比较低级和低效的,特别是当我们看着仿真日志并顺着时间轴试图去将打印数据和RTL行为关联起来的时候,简直苦不堪言。尽管如此,仿真日志的导出和使用仍然在某些时刻起到了基础性的作用,特别是在UVM将report机制构造健全之后,其作用不可忽视。
SystemVerilog本身在打印信息上有好几个任务可以用:**display, **write, **strobe, **monitor, 这几个任务的使用上不完全相同。
在UVM的框架里,打印信息被赋予了严重性等级(severity)和冗杂等级(verbosity),这在信息控制上提供可很大的便利。
Severity分成了INFO、WARNING、ERROR和FATAL,分别使用宏uvm_info、uvm_warning、uvm_error和uvm_fatal来进行信息打印。
Verbosity等级共分为UVM_NONE、UVM_LOW、UVM_MEDIUM、UVM_HIGH、UVM_FULL、UVM_DEBUG六级,表示信息的冗杂程度由低到高。
Verbosity的设置出了直接用仿真参数+UVM_VERBOSITY=UVM_DEBUG来配置,UVM还提供了+uvm_set_verbosity这一非常灵活的参数,具体使用方法这里就不做介绍了。UVM出了这套完备的打印信息控制机制之外,还提供了很多调试宏,比如+UVM_CONFIG_DB_TRACE、+UVM_PHASE_TRACE、+UVM_OBJECTION_TRACE等,用来方便用户从仿真日志中观测配置数据库(configuration database)状态、phase执行状态和objection状态等。
总而言之,信息的打印方法有很多,UVM在report机制上也给到了足够的控制手段,利用好这些方法,仿真日志将是我们调试用例的利器!关于UVM的议题可以介绍的实在太多,有时间再开这一系列的文章。
全部0条评论
快来发表一下你的评论吧 !