棋子 · 1 天前

聊聊芯片Debug模块及其应用

1. 前言

在芯片设计中,通常都会增加一些debug(调试)电路逻辑,方便定位软硬件问题。增加这些debug电路的基本要求对系统原有的正常操作无影响,否则可能会出现heisenbug。因此,debug逻辑电路通常用额外的专用资源去实现,debug面积占用超过总芯片面积5%的芯片也不在少数。

由于debug电路逻辑所花费的面积不大,而且可以通过power gating技术,在不用debug功能时,把debug电路关掉,这样耗电量小,对功耗的影响不大。故debug在复杂设计中还是广泛使用的。

2. DAP口

Debug电路包含以下三个主要方面,都是通过Debug Access Port (DAP)来进行的。

  • Tracing(追踪):tracing是将芯片中的关键信息存入到trace buffer(追踪缓冲);
  • Triggering(触发):triggering决定何时开始或结束tracing;
  • Single stepping(单步操作):single stepping允许芯片暂停运行、按时钟或指令来单步调试;

Trace的信息通常以压缩形式存放。而且有了trace的内容,我们就可以通过debugger(调试器)控制处理器执行的前进或回退。

在SoC上,芯片版本、寄存器和寄存器域段信息一般会存放在片上ROM,因此也可以通过DAP口去访问SoC芯片的一些基本信息。

3. Debugger

Debugger可以采用标准的技术去控制芯片包含:

  • Pause和Step:控制一个核(Core)的停止、按指令单步执行、重新开始执行等。单步执行通常通过执行一个指令后触发中断或暂停,这使得debugger可以控制正在被调试的对象。
  • 访问处理器的寄存器:在Core内,程序员模型可见的任何寄存器都可以被debugger读写。
  • 远程控制读写:debugger可以触发load或store操作。一种方式是直接通过系统主总线;另一种是通过受控Core发起的。
  • 观察点(Watchpoints)和断点(Breakpoints):在每个Core中可能会存在多个硬件寄存器,debugger可以使用这些寄存器去存储感兴趣的地址。如果load或store地址匹配到存储在watchpoints寄存器中的地址,那么就产生一个事件。同样地,当程序计数器(PC)匹配到breakpoints寄存器中的值时,也会产生一个事件。
  • Cross-trigger状态机:每个IP模块产生的重要event可以作为输入汇集到中央程序中,形成一个通用的cross-trigger状态机。额外提供了可以被matrix输出设置和复位的状态触发器,它们的输出直接反馈到matrix的输入。因此,可以根据用户指定的事件序列来编程状态机。

4. Debug系统举例

4.1 单核SoC系统

通常情况下,SoC会有一个逻辑DAP口,如下图1所示为一个微控制器或单核的SoC。TCP通过USB与SoC连接起来。JTAG使用1-bit的数据通路,因此速度会慢一些。连接到Core的DAP也可以自己在主总线上触发操作。

在这个简单的单核系统中,breakpoint和watchpoint寄存器会放在CPU核或PMU(Performance management unit)协处理器内部。DAP可以停止或单步调试Core,也可以查看和修改Core中的寄存器。当有来自watchpoint或breakpoint的事件发生时,可以通过PMU寄存器计数或者上报中断给Core或者暂停Core这几种可编程选择的方式去处理,这样debugger就可以接管了。

图片
图1 单核SoC的debug硬件。DAP通过JTAG和USB连接到debug工作站

许多非Core类型的IP模块也会产生事件,对这些事件进行统计也是很有用的,在图1中粉色所示的IP组件的事件可以被连接到某一个Core和PMU,或者可选实现的EMU(Event-Monitoring Unit)组件上。例如,EMU可以对L2缓存缺失率,DRAM的总线事物事件等进行计数。

4.2 多核SoC系统

在多核SoC系统(MPSoC)中,每个core的debug集成不需要很大的变化。不过会新增其它带有debug接口的IP组件。下图2为多核SoC系统的两个主要新增组件,分别是Event Trace LoggingCross-Triggering。为了支持trace logging,Core还另外给出一个接口,用于传递trace events信息给专用事件总线(绿色的线)。这个接口支持很多层面的信息,包括关掉、只报中断、分支和追踪足够的数据去复现。不同Cores的信息通过Trace Event Funnel和Event  Filters进行组合或稀疏。Funnels提供多路选择和其它一些灵活的功能,比如共享一个timestamp给不同拥有同样timestamp输入的数据。Lossless Compressor会执行连续系统时间的运行长度编码,或者无损算法,就像Lempel–Ziv。总得来说,事件带宽必须不能超过事件终点,事件终点要么是片上SRAM事件缓冲或专用高性能总线bond-out。Bond-out在这里的意思是一组Pads。片外追踪缓存经常用于工业或自动驾驶控制器。对于这些,一个更宽并行DAP将其大部分管脚用于数据。或者,一个多gigabit串行器用于快速将数据导出。

图片
图2 现代MPSoC的典型事件追踪流资源。运行的数据总线是黑色的。事件流总线是绿色的。Debug访问总线是蓝色的。粉色箭头代表来自其他IP组件的事件监控线,它们要么没有自己的计数器,要么需要提供cross-triggering

从CPU Cores处收集数据的话,很容易收集到太多的事件追踪数据,因为每个Core执行每条指令平均会有10-bits数据。因此,数据可以从系统总线上收集。如果CPU Core拥有常规缓存的命中率,那么图2中连接到DRAM控制器输入的总线追踪监控器就可以产生少于两个数量级的数据。此外,如果内存可以正常运行的话,那么读数据可能都不需要记录,因为读数据和更早的写数据是一致的。

Event filter可被编程去记录地址窗口内对应的事件,这样可以拓展有效地时间窗口。

由于追踪内存大小是有限的,片上追踪缓冲使用了基于地址卷绕的圆形排列,这样在内存不够时可以先覆盖最老的数据。因此,感兴趣点的数据可以在停止该点追踪时被捕获,而且近期历史记录也会保存在缓冲。另外,在操作系统的控制下,也有可能周期性的将存储在SoC DRAM的追踪数据放到主存中。

图2右下角的ROM会存储Part/ECO信息。另外,每个IP模块通常将自己的标识号写死在它内部debug空间的第一个寄存器。

END

作者:沪闵菜菜子
文章来源:专芯致志er

推荐阅读

更多 IC 设计干货请关注IC 设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
22999
内容数
1373
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息