桥接应用与设计鸿沟:利用GDB代理协议远程控制VCS仿真
桥接应用与设计鸿沟:利用GDB代理协议远程控制VCS仿真
作者: Kelly D. Larson, MediaTek Wireless, Inc. (kelly.larson@mediatek.com)
摘要
本文详细介绍了一个最近DSP项目顶层验证测试平台的增强功能,该功能使应用工程师能够访问RTL环境,而无需离开他们已经熟悉的开发环境。通过SystemVerilog结合C语言例程,使用DPI 直接编程接口,我们实现了一种方法,通过利用低级GDB协议接口从全功能调试器远程控制VCS仿真。这提供了启动正常VCS仿真,然后启动远程调试会话,通过Unix套接字连接到仿真的能力。
1.0 引言
在现代SoC设计流程中,应用工程师和设计/验证工程师之间存在显著的差距。应用工程师通常使用高级语言(如C/C++)进行软件开发,而设计和验证工程师使用Verilog/SystemVerilog和EDA仿真器。当应用工程师需要在RTL环境中调试软件时,他们通常被迫学习不熟悉的EDA工具和流程。
本文介绍的方法通过GDB代理协议桥接了这一差距,允许应用工程师使用他们熟悉的GDB调试器远程控制和检查VCS RTL仿真。
2.0 概述
2.1 先前的方法
先前的方法要求应用工程师学习VCS命令行接口和波形查看器,这既耗时又低效。应用工程师需要在他们的开发环境(通常包括GDB或基于Eclipse的IDE)和EDA工具环境之间来回切换。
2.2 RTL与"冻结"时间的能力
RTL仿真的一个独特优势是能够在任意时间点"冻结"整个设计状态。与真实硬件不同,RTL仿真可以在任何时钟边沿暂停,允许对设计的完整状态进行检查和修改。这一特性对于调试复杂的软件-硬件交互至关重要。
2.3 通信
GDB代理协议通过Unix域套接字提供通信通道。VCS仿真创建一个监听套接字,GDB调试器作为客户端连接到该套接字。通信使用标准的GDB远程串行协议(RSP)数据包格式。
3.0 实现
3.1 初始目标项目
目标项目是一个多核DSP设计,包含多个处理器核心、共享存储器和各种外设。应用工程师需要能够在处理器上加载和调试固件,而无需离开他们的标准开发工具。
3.2 扩展测试平台
通过在顶层SystemVerilog测试平台中添加DPI-C函数,我们实现了以下功能: - 创建Unix域套接字服务器 - 解析GDB RSP数据包 - 将GDB命令映射到仿真控制操作 - 提供寄存器/存储器读写访问
3.3 处理断点
断点处理是实现的關鍵部分。当GDB设置断点时,Testbench中的DPI函数将断点地址映射到相应的RTL位置。当仿真执行到达断点时,仿真暂停并通过套接字通知GDB。
3.4 SystemVerilog DPI
DPI 直接编程接口(DPI)是SystemVerilog标准的一部分,允许SystemVerilog代码直接调用C函数,反之亦然。我们使用DPI来实现:
- gdb_server_start() - 启动GDB服务器
- gdb_packet_handler() - 处理传入的GDB数据包
- gdb_memory_read() / gdb_memory_write() - 存储器访问
- gdb_register_read() / gdb_register_write() - 寄存器访问
3.5 GDB代理协议
GDB远程串行协议(RSP)定义了调试器和目标之间通信的数据包格式。
3.5.1 数据包格式
标准RSP数据包以$开头,以#结尾,后跟8位校验和。数据包内容为ASCII编码的十六进制数据。
3.5.2 使用的数据包
实现了以下标准GDB RSP数据包:
- g - 读取所有寄存器
- G - 写入所有寄存器
- m - 读取存储器
- M - 写入存储器
- s - 单步执行
- c - 继续执行
- z/Z - 清除/设置断点
4.0 结果
GDB代理接口成功地在实际项目中使用,实现了以下成果: - 应用工程师能够使用标准的GNU工具链调试固件 - 调试周转时间减少约50% - 应用工程师无需学习EDA工具即可访问RTL环境 - 系统支持多个并发GDB会话(每个处理器核心一个)
5.0 初始局限性与未来增强
5.1 缓存支持
初始实现不支持对处理器缓存的直接访问。计划在未来版本中通过扩展DPI接口来支持缓存状态查询。5.2 完整寄存器写支持
当前实现对寄存器写入提供有限支持。未来计划实现对所有架构寄存器的完整读写支持。5.3 异步暂停
当前实现仅在同步点(时钟边沿)支持暂停。计划添加对GDB中断命令的异步暂停支持。5.4 SoC集成
计划将该方法扩展到支持多处理器SoC配置,包括异构处理器集群。图片索引
本文共3张图片,存放于 _images/ 目录。