桥接硅前与硅后验证差距 —— Vera 在交换 ASIC 验证中的硅后实现
桥接硅前与硅后验证差距 —— Vera 在交换 ASIC 验证中的硅后实现
会议: SNUG San Jose 2009 作者: Kanad Roy, Broadcom Corp., San Jose, USA 页数: 22
摘要
Vera 测试已成功用于 ASIC 交换芯片验证。通常,这些测试仅在 RTL 验证期间保持活跃,而为仿真和硅验证则需要开发新的测试。本文详细介绍了一套方法,使硅前 Vera 测试能够在硅后验证 Post-Silicon Validation中复用。其好处包括更好的设计周转时间,以及将 Vera 强大的验证特性扩展到硅测试。通过运行时参数实现硅后验证测试的规模扩展,无需修改测试主体,不偏向任何特定(硅前或硅后)范式。实现了良好的硅后运行性能。
目录
1. 引言 2. Vera 测试台 3. 用于硅前验证的 ConfigTool (CT) 4. 验证环境 5. 测试结构 6. 硅测试台 (sTB) 7. 建立到 SDK 和 IXIA 的连接 8. 在 SDK 中配置 DUT 9. 为数据包生成编程 IXIA 10. 在 IXIA 中捕获数据包 11. 关闭到 SDK 和 IXIA 的连接 12. sTB 测试模式(Normal / Configure & Quit / Stress) 13. sTB 性能 14. 交换机(DUT)性能 15. sTB 部署 16. sTB 局限性 17. 结论 18. 致谢 19. 参考文献
1 引言
我们在硅前 ASIC 验证中开发了一个基于 Vera 的前端工具。最近,我们使能并扩展了该工具,使其能在仿真器和硅后硬件上运行相同的硅前测试;这使我们能够在硅验证和仿真中利用现有的硅前测试。
对于可编程芯片(如微处理器),在硅前验证和硅后验证中运行相同的测试是常见做法。然而在 ASIC 验证/验证中通常并非如此;通常采用更底层的方法直接访问和设置芯片资源。在传统 ASIC 验证设置中,用于访问芯片资源和生成输入激励的方法、语言和工具在硅前和硅后平台上差异显著。
目前的工作试图弥合 ASIC 生产流程中硅前和硅后验证/验证之间的差距。我们在 L2/L3 网络交换芯片设计系列的背景下定义了这一框架。优势包括:(i) 无需为硅验证和仿真开发新测试;(ii) 无需为硅后验证重新发明配置硅资源的环境;(iii) 硅后验证和仿真获得与 Vera 硅前验证相同的各种激励随机化优势;(iv) 更快的芯片设计到交付周转时间。
2 Vera 测试台
硬件验证语言 Vera 旨在实现 RTL 设计的健壮和严格功能验证。其突出特性包括:完全随机和约束随机测试激励生成、更好的功能和边界情况覆盖率、简洁而强大的并发/同步/异步通信表达式、与硬件建模和信息封装良好对齐的面向对象语言特性。
我们充分利用 Vera 的随机激励生成能力来编写随机测试和定向随机测试。在定向随机测试中,一部分输入激励被随机化以获得更好的覆盖率,其余部分不随机化以确保数据包被正确交换。图 1 展示了一个典型定向随机 Vera 测试的代码片段。
3 用于硅前验证的 ConfigTool (CT)
我们在 Vera 中定义了一个抽象层来配置和设置环境以及交换芯片资源用于硅前验证。该测试层称为 ConfigTool (CT),配有一套 API 供测试使用,具有以下特性:
- 抽象性:高级抽象使用户免于详细编程,聚焦于目标测试问题。CT 完成大部分配置工作,使得测试更短、开发时间更少、可管理性更好。 - 灵活性:即使允许更高级别的抽象,CT 仍提供通用"安全阀"API,允许访问配置的内部细节。 - 可扩展性:在 CT 中,可以同样轻松地创建少量流或数百个流。扩展测试是一项简单的任务。 - 可移植性:CT 在抽象之下隐藏了大部分芯片资源编程,减少跨项目的测试移植时间。 - 功能丰富性:定义了丰富的 API 集来指定不同类型的流(L2/v4-L3/v6-L3、Unicast/Multicast),以及 Trunk、QinQ 和隧道特性。 - 面向对象:Vera 的 OO 特性有利于 CT 内模块的更好复用。 - 随机化:Vera 强大的随机化允许生成具有最大覆盖率的全面激励。
4 验证环境
图 2 展示了顶层验证设置。CT 派生自一个 SOC(系统级芯片)类,通过一套 API 将测试台连接到 DUT。SOC 层 API 子集建立两个通道:一个用于读写 DUT 的寄存器和存储器,另一个用于向 DUT 发送和接收数据包。
左侧部分展示了用于 C 代码验证的测试台(SocTestcTB),中间部分展示了硅前 RTL 验证的测试台(SocTestChip),右侧部分展示了硅后验证和仿真的测试台(SocTestsTB),其中 CT 与 SDK/仿真器和 IXIA 通信。
5 测试结构
测试编写者遵循将测试分解为几个不同阶段的指南(图 3 的 Vera 测试模板):
program test {
test_init();
test_run();
test_end();
}
task test_run() {
CT ct_hdl;
// GLOBAL SWITCH CONFIGURATION
ct_hdl.test_init();
// TOPOLOGY CREATION
for (i = 0; i < ; i++) { ; ; ; }
// END-TO-END CHECKS
{ ... }
// DEVICE CONFIGURATION
{ write_mem(); write_reg(); }
// PACKET GENERATION AND TRANSMISSION
for (i = 0; i < ; i++) { flow[i].send_packet(); }
ct_hdl.test_end();
}
关键阶段包括:全局交换配置、拓扑创建、E2E 检查、设备配置、数据包生成和传输。
6 硅测试台 (sTB)
图 4 显示了 sTB 的架构。SocTestsTB 使用 DirectC 与薄层 C 代码接口。sTB 执行测试触发 SDK/仿真器和 IXIA 上的一系列动作:
a) 建立连接:ct_hdl.test_init() 打开两个 TCP 客户端连接 —— 程序通道(Program Channel)和数据包通道(Packet Channel)。程序通道另一端是 SDK 上的 Tcl 服务器,数据包通道另一端是 IXIA 系统上的 Tcl 服务器。
b) 配置 DUT:每个 write_mem() 和 write_reg() 命令通过程序通道生成 TCP 命令发送到 SDK Tcl 服务器。
c) 编程 IXIA:每个 send_packet() 命令通过数据包通道使用一系列 TCP 命令在 IXIA 中编程一个流。
d) 捕获数据包:当使能 E2E 数据包检查时,数据包通道接收 DUT 交换的所有数据包并发送回测试层。
e) 关闭连接:测试结束检查通过程序通道读取 DUT 资源,必须在 ct_hdl.test_end() 之后进行。
7 建立到 SDK 和 IXIA 的连接
硅验证台包含一个或多个 IXIA 机箱和包含 DUT 的 SDK(图 5)。IXIA 机箱中的端口由三元组
8 在 SDK 中配置 DUT
DUT 通过一系列寄存器和存储器写入进行配置。遇到了两个需要特别关注的问题:首先是寄存器/存储器的数据字节序(endianness)约定在软件驱动命令和硅前验证环境之间不同 —— 通过 SocTestsTB 中的双向转换代码处理。其次,某些名称在硅前环境和软件驱动之间不同 —— 需要在 SocTestsTB 中添加特殊桥接代码。
经验教训:硅前和硅后团队之间更紧密的合作以及更多自动化有助于解决这些问题。
9 为数据包生成编程 IXIA
CT 使用 Vera 原生随机化特性确保报头字段和有效载荷具有随机值。我们需要将相同的报头发送到 DUT 而不被 IXIA 更改。解决方案是使用 IXIA 流发生器的数据包流模式(Packet Flow mode),在此模式下最多可编程 15872 个具有不同随机报头的数据包,即使在压力测试中也绰绰有余。
图 7 展示了将 IXIA 端口设置为数据包流模式的命令,图 8 展示了为单个数据包编程 IXIA 的完整命令序列。
在硅前验证中,send_packet() 构建数据包并放入发送队列,后台调度器并行处理。在硅后验证中,SOC 层接收命令后编程 IXIA 端口以保持数据包但不发送。当所有数据包都被 IXIA 接收并编程后,ct_hdl.test_end() 命令触发所有端口以运行时选项指定的期望速率发送数据包。
10 在 IXIA 中捕获数据包
对于 E2E 测试,数据包需要被捕获并发送回 Vera 测试层。自由运行的 receive_packets() 线程从 IXIA 捕获缓冲区读取数据包并放入 E2E 的传入数据包邮箱。
由于速度不匹配,E2E 不可避免地落后于 sTB 中的数据包交换。采用启发式方法实现 E2E 终止(图 9):当在 TIMEOUT 周期内任何端口未收到单个数据包时,E2E 终止。TIMEOUT 需要精心选择以高概率确保所有数据包已到达,同时避免不必要的空闲等待。
IXIA 在捕获数据包方面有限制:无法捕获超过 8191 字节的数据包,且捕获缓冲区总大小有限。
11 关闭连接
ct_hdl.test_end() 充当屏障,保证 DUT 中数据包交换的完成。此时 TCP 套接字仍打开,任何 DUT 寄存器/存储器和 IXIA 计数器仍可在测试层中读回。Vera 程序块的 test_end() 在仿真最终终止前关闭这些套接字。
12 sTB 测试模式
12.1 Normal 模式(默认)
测试行为与硅前验证相同,开启 E2E 检查。可用于仿真器上快速周转、仿真器上运行长时间测试、sanity check。运行时命令:runtest -bench= -stb -ntb
12.2 Configure & Quit 模式
利用前端芯片配置工具 CT 快速设置数据包和编程 DUT。一旦完成,用户接管 IXIA 和 SDK 接口的控制,工具退出。运行时命令:runtest -bench= -stb -ntb -nc "+e2e_chk_off +stb_flags=40"
12.3 Stress 模式
最常见的用法,将硅前验证测试扩展到更多流和大量数据包。通过运行时参数扩展测试以发送数百万数据包。运行时命令示例:runtest -bench= -stb -ntb -nc "+e2e_chk_off +stb_flags=80 +num_flows=200 +stb_scale_factor=100000 +stb_ing_rate=50"
+stb_scale_factor 是数据包倍增因子。例如,如果原始测试配置 5 个流,每个发送 10 个数据包(共 50 个),上述参数将扩展测试从 200 个流发送 10*200*100000 = 2 亿个数据包。
13 sTB 性能
两个主要问题影响了良好性能: - E2E 空闲等待:微调 TIMEOUT 值消除了无用的空闲等待。 - 数据包检索开销:最初使用 RR-PR(1) 调度(轮询方式,每次只取 1 个数据包),TCP 开销很大。改为 RR-PR(50) 后,每次最多取 50 个数据包,总体 TCP 开销显著降低。
图 10 和图 11 对比了两种调度方案的性能数据。RR-PR(50) 比 RR-PR(1) 性能高 1.9x 到 3.4x。对于典型平均数据包大小 1024 字节,sTB 能够在 E2E 检查开启的情况下每秒交换约 2.5 秒的数据包。
测量显示 sTB 每个寄存器/存储器写入约需 0.7 msec 用于 DUT 配置。
14 交换机(DUT)性能
在 Stress 模式运行中监控 DUT 性能指标。IXIA 仅当数据包传输进行中时计算接收帧率,传输停止后数据丢失。解决方案是在 C 代码中使用 POSIX 线程编程,在数据包传输开始后立即生成多个并发线程,每个线程采样一组端口以计算接收帧数据率的运行平均值(图 13)。
每个端口派生的性能指标包括:端口速度、最大可能帧率、发送/接收的总帧数、接收帧平均大小、平均存储转发延迟、进出链路利用率。图 14 展示了一次 sTB 压力测试运行的性能数据。
15 sTB 部署
适合 sTB 运行的测试类别:(1) 在 RTL 上运行时间极长的测试;(2) 在仿真器上使用 sTB 快速开发的顶层硅前测试;(3) QoS 测试;(4) 组合大量特性的测试;(5) 功耗分析测试;(6) 合成基准测试。
16 sTB 局限性
IXIA 不支持除标准格式之外的自定义帧格式,因此无法直接编程和发送 Broadcom HiGig 帧。当前的硅前验证环境最初未设计为扩展到多芯片仿真,因此 sTB 只能进行单芯片验证。
17 结论
在大型复杂芯片设计时代,验证几乎总是设计周期中最耗时的部分。我们的验证方法基于以下基本原则:(i) 使用适当的抽象隐藏大量芯片配置细节,实现更短、可扩展、更有针对性和更易管理的测试;(ii) 为测试编写者提供灵活工具进行有意义的验证;(iii) 尽可能复用测试。
我们在硅前验证中这些努力已见成效,并将测试复用原则垂直扩展,跨硅前和硅后验证工作复用测试。sTB 是这一努力的成果。
18 致谢
感谢 Chris Wattana 使能本工作并审阅本文。感谢多位同事提供 SDK、仿真器和相关帮助。特别感谢 Bhavin Shah 实现了 sTB 的一部分。
19 参考文献
[1] C -- A Reference Manual. Harbison and Steele. Prentice Hall.
[2] Configuration Tool (CT). Broadcom, Corp.
[3] IXIA Reference Guide. Ixia.
[4] NTSW Verification Strategy. Broadcom, Corp.
[5] POSIX Threads Programming.
[6] Tcl Development Guide for IXIA. Ixia.
[7] Vera System Verifier - Language Reference Manual. Synopsys, Inc.
[8] Vera User Guide, Synopsys, Inc.
图片索引
共 5 张图片,存放于 _images/ 目录。本文包含 14 个图(图 1-14),覆盖定向随机测试代码、验证环境架构、测试模板、硅测试台架构、硅验证台、SDK 命令示例、IXIA 编程示例、E2E 终止代码、性能图表、线程采样机制、DUT 性能数据等。