USER GUIDE / SECURITY / BUS MONITOR / BUS MONITOR OPERATION
BUS_MONITOR 操作
AXI & AHB bus


G32S10 ID 中的数据块
CH0:TNPU
CH1:V1
CH2:V0
CH3:IPU / MSC0 / MSC1 / I2D
CH4:ISP / DPU
CH5:AHB
CH6:MCU-DMA
CH7:ENC / DEC / SCALER
带宽监测
带宽监测主要分为两种模式,手动控制以及自动控制;
手动控制模式:
- 配置 CH_FUN_CTRL.CH_FUN_CLR 清除所有计数,初始化操作;
- 配置 CH_FUN_CTRL.CH_FUN_MODE 为 1 使用手动控制模式;
- 配置 CH_FUN_CTRL.CH_FUN_EN 为 1 启动监测;
- 一段时间后,配置 CH_FUN_CTRL.CH_FUN_EN 为 0 关闭监测;
- 读取 VAL_CLK_NUM、WVAL_HIT_NUM、RVAL_HIT_NUM。
自动控制模式:
- 配置 CH_FUN_CTRL.CH_FUN_CLR 清除所有计数,初始化操作;
- 配置 CH_FUN_CTRL.CH_FUN_MODE 为 0 使用自动控制模式;
- 配置 CH_CLK_THRES,表明自动监测多长时间后停止监测;
- 配置 CH_FUN_CTRL.CH_FUN_EN 为 1 启动监测;
- 等待 CH_INT_STATE.CH_CNT_DONE 为 1 表明监测完成,配置 CH_INT_CTRL.CH_INT_CLR 清除状态;
- 读取 VAL_CLK_NUM、WVAL_HIT_NUM、RVAL_HIT_NUM。
AXI ch 带宽计算方式为(以 CH0 举例):
B = Fch0 * (WVAL_HIT_NUM + RVAL_HIT_NUM) * 8 / VAL_CLK_NUM
其中,Fch0 为 CH0 的时钟频率,单位 Mhz。
AHB ch 带宽计算方式为(以 CH6 举例):
B = Fch6 * (WVAL_HIT_NUM + RVAL_HIT_NUM) * 4 / VAL_CLK_NUM
其中,Fch6 为 CH6 的时钟频率,单位 Mhz。
DEBUG FUNCTION
配置 DBG_TRANS_EN 为 1 可使能总线 debug 模式,monitor 中所有 debug 功能将全部被启用。
在 watchdog 复位或者 pprst 复位时,所有 debug 信息将被锁存在 monitor 内部对应的寄存器中(推荐最好使用 watchdog 复位),复位释放后第一时间读取出 debug 信息用于分析现场。分析策略如下:
- 根据 DBG_BRIDGE0 寄存器中信息判断 CPU / TNPU 是否发出过 AHB 的非 single 访问,正常情况下,CPU / TNPU 在访问模块时为 single 访问,当 0-5bit 为 1 时,CPU / TNPU 所发出的行为不符合预期;
以 DBG_BRIDGE0 中的第 0、6、12bit 为例分析(CPU 访问 AHB0 下的模块):
| 第0bit | 第6bit | 第12bit | Debug分析 |
|---|---|---|---|
| 0 | 1 | 1 | 正常情况 |
| 0 | 0 | x | 异常,总线出现挂死现象 |
| 1 | 1 | 1 | 出现非single访问,但总线未出现异常 |
| 1 | 0 | x | 异常,总线出现挂死现象,可能和非single访问有关 |
| 其余组合情况可能性较低,未做分析 |
同时结合 DBG_BRIDGE1 寄存器,可知道具体是哪个模块在访问哪个模块,具体可见 DBG_BRIDGE1 寄存器中的注释。
- DDR 挂死情况分析,DDR 中共有 7 个 ch,除 ch5 以外(ahb 总线 ch),其余 ch 均为 axi 总线 ch,在 debug 时,对每一个 ch 中的各标志位进行分析帮助定位,以 DBG_DDRC_CH0 为例:
| 位 | 名称 | 说明 | RW |
|---|---|---|---|
| 31:20 | Reserved | 写入无影响,读取为零。 | R |
| 19 | TIMEOUT_WR | 写数据超出一定时间阈值无法响应时,置位为1(阈值可配) | R |
| 18:11 | MISMATCH_ID | 当AXI写传输时,实际写数据量和写cmd发出的数据量不匹配时,记录下AX_ID号,用于判断是哪个主机发生错误 | R |
| 10 | MISMATCH_WR | 当AXI写传输时,实际写数据量和写cmd发出的数据量不匹配时,置位为1 | R |
| 9 | EXCEED_RANGE_RD | 配置AXI读地址范围,当总线访问不在范围内,置位为1 | R |
| 8 | EXCEED_RANGE_WR | 配置AXI写地址范围,当总线访问不在范围内,置位为1 | R |
| 7 | EXCEED_4K_RD | 当AXI总线读传输跨4K边界时,置位为1 | R |
| 6 | EXCEED_4K_WR | 当AXI总线读传输跨4K边界时,置位为1 | R |
| 5 | BUSY_WR | 0:AXI写传输空闲状态 1:AXI写传输未完成 | R |
| 4 | BUSY_RD | 0:AXI读传输空闲状态 1:AXI读传输未完成 | R |
| 3 | RREADY | 读传输ready信号,正常情况下应为1 | R |
| 2 | RVALID | 读传输valid信号,正常情况下应为0 | R |
| 1 | WREADY | 读传输ready信号,正常情况下应为1 | R |
| 0 | WVALID | 读传输valid信号,正常情况下应为0 | R |
优先根据第 4、5bit 判断总线上是否空闲,当处于传输未完成状态时,再根据第 0-3bit 初步判断是由于什么信号导致未完成,如下:
| BUSY_WR | BUSY_RD | WVALID | WREADY | RVALID | RREADY | Debug分析 |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 0 | 1/0 | 正常情况 |
| 1 | 0 | 1 | 0 | 0 | 1/0 | axi写传输挂死,挂死原因为 DDR 不接收写数据,但具体原因可能是别的 ch 间接引起 |
| 1 | 0 | 0 | 1 | 0 | 1/0 | axi写传输挂死,原因为该 ch 的主机不再发送数据,导致DDR挂死 |
| 0 | 1 | 0 | 1 | 1 | 0 | axi读传输挂死,原因为该 ch 的主机发出了读命令,但是不再接受读数据 |
上述分析情况为分别只有读或者写未完成传输的情况。当读写传输同时处于未完成状态时,优先分析写传输的 debug 信息进行定位,在多数情况下,写传输导致的 DDR 挂死会蔓延至所有 ch 的读写传输,而读传输导致的挂死仅影响该 ch 的读传输。
初步定位到读写传输挂死后,可根据第 6-19bit 判断在传输过程中出现过什么类型的错误,当出现第 10bit 实际写传输数据量和发出的命令不对应时,会记录下此时的 ID 号(第 11-18bit),可根据 ID 号判断是哪个主机发出了异常行为。
- 第 2 点描述中提到了写传输挂死会蔓延到所有的 ch,在蔓延的过程中,记录顺序可在一定程度上帮助判断(多数情况下最先挂死的 ch 是挂死的根本原因)。通过 DBG_SORT 寄存器可知顺序,若 ch1 最先挂死,则 DBG_SORT 从高位开始会记录 1001(B),其中高位 1 为挂死标志,001 为 ch1 序号。
- 此外,debug 模式下还会保存一些关键模块中的重要信息,在 DBG_DDRC_ISP 中,分别记录了 DDRC 模块以及 ISP 模块中的一些关键信号,在上述 3 点 debug 策略过程中可结合 DBG_DDRC_ISP 信息分析,帮助有效定位。
注:debug 方案本身是在以往芯片经验上结合对于整体架构的理解输出的方案,但在真是芯片上可能远不止于此的 bug 定位。上述思路只是一个言简意赅的分析顺序,具体情况还需具体分析。