在芯片功能验证中,仿真波形一直是调试的重要手段。通过观测分析波形,工程师可以推断代码是否正常运行,电路的功能是否正确,设计是否满足预期。波形解决了芯片验证调试中可观测性的问题,虽然单独依赖观测波形不足以解决调试的所有问题,但是波形是一个最基本的手段。很多FPGA和硬件设计工程师都将仿真波形看作是硬件调试的示波器或者逻辑分析仪。
数字电路中的波形通常由四值逻辑表示,包括:1 - 高电平,0 - 低电平, X - 不定态,Z - 高阻态。
当然,为了降低复杂度,有些仿真系统简单地忽略不定态和高阻态,仅使用二值逻辑表示。波形系统就是将仿真数据通过可视化的方式显示出来。高级波形系统需要更多功能,包括对协议事务级(protocol transaction),混合信号(mixed signals),文本输入输出(File I/O)等功能的显示。目前的大部分EDA厂商工具,都将波形系统都嵌入在各个仿真器和调试工具中,成为紧密结合的一部分。
业界的有多种波形格式,除了VCD是一个公开的标准格式之外,其他商业性质的各具特点,在性能和功能上各有优缺点。目前业界最普遍使用的是C2工具,它具有非常高效的数据压缩率,用户界面也非常友好,但是在大型设计上数据加载还是稍慢,底层优化有待进一步改进。C1工具操作性稍显复杂,人机界面的易用性还有很大的提升空间。B工具中规中矩,它和A工具在数据压缩率上都不能和C2工具相比。下列表格列出各自的一些特性。
波形系统在芯片验证中至关重要,设计验证工程师在使用波形调试的时候,对EDA工具有很高的期待,也提出了很多具体的要求。本文将探讨波形系统的三个关键技术,通过这些具体的技术细节理解,工程师可以深入的了解波形系统的性能和易用性,以便将来选择工具时做出更好的判断。
性能指标:良好的压缩率和内存管理
一个IP可能包含着数千万个的信号,这些信号随时间产生的数据量是巨大的。如果在波形系统中不对数据进行有效的压缩,而只是简单的随时间来记录波形数据,这样最终的数据量将是巨大的。即便在目前磁盘价格日益下降的今天,这样的数据量对于一个复杂IP或者SOC的调试来说,这种大量的磁盘空间积聚也是无法接受的。一个巨大的波形不仅仅对磁盘空间产生各种挑战,最大的问题还在于当调试器调用这些数据的效率。
业界比较通用的波形开放标准是基于VCD (Value Change Dump)格式的,这个格式是基于IEEE1364标准的,也就是VerilogHDL标准中定义的一个用文本方式存储波形的数据格式。这种格式主要是记录波形的名称,对应数值变化的时间点,和数值变化量。他的最核心的思想是只在Value change(VC)的时候做数据和时间点记录,而在没有VC时候不做任何记录。
由于它不用记录每个时间点的波形数值,从某种意义上来说也有一定的数据压缩效果。但即便如此,在一个复杂IP中产生的VCD文件尺寸也可能超过几百GB,由于是文本数据格式,工具在读取文件索引数据上效率也不高,因此,在大型设计中利用VCD做波形调试,会遇到很多性能瓶颈。
各大EDA商业公司都有自己的波形格式。虽然具体的标准都是私有的,但大致都是基于数据库的方式来存储和管理波形数据。这些数据不仅仅是存储,还会进一步地压缩和优化,以便减少磁盘开销,并让工具更有效地读取和管理数据。由于波形是调试的重要工具,各大EDA厂家都有针对波形的压缩技术,对调试器的图形波形界面都做了优化,方便用户的使用,最大程度提高调试的效率。然而,除了关键的压缩技术之外,对工具来说还有一个重要的特性就是内存管理技术。
一个调试工具的内存管理技术决定了这个工具的可用性和易用性。在当下大量数据交互的仿真技术领域,优秀的内存管理技术对工具而言至关重要。简单的来说,内存管理就是工具需要数据放置在磁盘或者内存中寻求一个平衡点,或最优化的比率。
过多的数据放在磁盘,每次工具在加载波形时候会非常缓慢;过量的数据加载到内存,会造成内存爆炸,让整个服务器运行缓慢,从而也导致效率和用户体验下降。
有个笑话,说某工程经理特别要求工程师必须在中午12点开始加载波形调试,加载过程中内存基本耗尽,服务器无法做其他事情,吃完午饭午休后,工具完成波形加载,工程师就可以看波形开始调试工作了,这样就可避免时间浪费。这个笑话虽然经不起仔细推敲,但是它反映了某些工具在内存管理上的缺陷和不足,会导致严重的性能问题和降低用户体验。无论如何,一款好的调试工具都要解决或者避免这些问题。
调试的有效性
除了上述提到的底层核心技术以外,对于波形工具技术本身来说,它必须具备几个关键应用层面技术:仿真器的高效配合,以及场景级(scenario)和事务级(transaction) 操作类型的表示。虽然波形非常直观地反映了设计内部的信号变化,但是设计本身是RTL,而且是信号间有相互关联,因此调试不能仅仅依赖于观测波形,很多时候工程师需要仿真器的配合让调试变得更加有效。
RTL和测试平台(testbenches)在运行后,其实本身很类似通用软件代码运行过程,很多工程师在观测波形变化的时候也希望能了解代码的执行情况;同样在代码调试的过程中,很多时候需要理解代码的执行过程和相对应的信号变化。这个时候对仿真器的单步动态调试可以配合波形变化,工程师可以直观的了解某段代码的执行过程和信号变化。这种类似软件单步调试的方式也是芯片验证中常用的手段之一。
信号驱动追踪(signal driver tracing)是一种常用的调试技术,它通过某个信号查询它的驱动源头。当用户在波形界面上发现信号在某个时刻出现问题后,用户可以追踪这个信号的驱动源,这样调试类似结果到原因(effect and cause)推导过程,大大加强了调试的有效性。通常信号的源头可能不是单一而是多个,用户可以选择在波形界面来观测多个源头,也可以通过仿真器和调试器的配合来选择使用代码或者电路图(schematic)方式进行观测。这种信号溯源技术需要仿真器和调试工具的有机结合,底层也需要高效数据库的支持。
事务级视图(Transaction Viewer)。在复杂设计中大量的信号里厘清数据真实含义是非常困难的,用户往往需要参考几十个信号的量的变化来确定数据类型和操作。例如,一个AXI协议的读写操作涉及到的信号可能有20多个。完成一次读写需要用户在一段时间内观测大量信号的变化,这种操作效率低下,不利于长时间的调试过程。Transaction viewer可在图形界面提供更高层次的视角,让用户直观地了解这些transaction的数据类型和定义,而不需要再从底层信号分析数据。有了这个工具,用户可以快速分析调试数据,包括enum type, class based transaction, sequence item等等。当然,要实现一个transaction可视化,还是需要仿真器配合,以及代码的一些额外工作,比如使用验证IP (VIP),或者使用SystemVerilog等高级建模语言描述。
交互界面的流畅度和易用性
波形工具和其他的验证工具不一样,它是一个频繁和用户交互的图形界面,这些交互体现在用户的鼠标键盘操作和对图形长时间的肉眼观测;和大多商业软件或者移动App一样,这个工具需要用户长时间操作和交互,用户体验成为了波形工具至关重要的一个因素。用户体验通俗来说就是工具的流畅度和易用性。加载波形的速度,波形窗口缩放的响应,代码和波形相互对应(cross-probing),波形比较与合并等,都可以看成是工具的流畅度的体现。
工具的流畅度,除了工具自身的优化,主要还取决于上面谈到的数据压缩和内存管理的优化。一个好的波形工具应该能让工程师很快上手操作,而不需要花费时间学习或培训。简单的功能可以快速地通过菜单选项实现,复杂的功能也可以开放数据接口,让用户编程操作。
总结
上述谈到的几点其实都是相互关联的。优秀的性能可以保证工具的流畅度,而调试的效率也有助于提升工具的用户体验。波形系统只是仿真调试工具中的一个部分,调试工具还有很多很多其他的核心技术,比如代码和电路图调试等。但是观测波形是验证工程师最常用的一种手段,作者希望通过介绍波形系统中的一些基本技术让用户将来选择工具时更加有针对性。同时也希望验证工程师能利用好工具,提升工作效率。
作者:David Hwang,芯华章科技产品市场总监
责编:Amy Guan