在ARM处理器开发中,调试接口设计直接影响着开发效率和质量。ETM10RV作为ARM10系列处理器的嵌入式跟踪宏单元,其调试架构主要由两大核心模块组成:DAP(Debug Access Port)调试访问接口和Trace Port跟踪端口。这两个模块协同工作,为开发者提供了完整的实时指令跟踪解决方案。
DAP接口采用标准的JTAG协议作为物理层,通过TDI、TDO、TMS和TCK四线制实现与外部调试器的通信。与普通JTAG接口不同的是,ARM的DAP在协议层进行了深度优化,支持多级扫描链的灵活配置。在ETM10RV中,扫描链6被专门保留用于访问ETM内部寄存器,这种设计使得调试器可以独立控制处理器核和跟踪单元。
实际调试中常见的问题是DAP接口信号完整性问题。建议在PCB布局时将DBGTDI/DBGTMS/DBGTDO信号走线长度控制在5cm以内,并保持50欧姆阻抗匹配。特别是在高频调试时(TCK>25MHz),需要在信号线上串联33欧姆电阻进行阻抗匹配。
ETM10RV与ARM1026EJ-S的典型连接如图1所示。两个关键信号需要特别注意:
verilog复制// 典型的DAP接口连接示例
assign dbg_tdo = (scan_chain == 6) ? etm_armtdo :
(scan_chain == 0) ? arm_sdoutbs :
1'bz;
这种设计实现了扫描链的动态切换:
在多核系统中,DAP接口需要采用级联结构。图2展示了一个典型的双核连接方案:
关键设计参数:
| 参数 | 单处理器系统 | 双处理器系统 |
|---|---|---|
| 扫描链数量 | 7条 | 14条 |
| TDI-TDO延迟 | <3ns | <5ns |
| 最大TCK频率 | 50MHz | 40MHz |
ETM10RV的跟踪端口包含三类关键信号:
时钟模式配置通过PORTMODE[2:0]实现:
图3展示了1:2模式下的时序要求:
为节省引脚资源,TRACEDATA可以与其他功能引脚复用。ETM10RV提供两个配置信号:
典型的复用电路设计:
verilog复制// 引脚复用逻辑示例
assign io_pad[15:0] = (etmen) ? tracedata[15:0] :
normal_out[15:0];
上电复位时的默认状态:
在双核系统中,推荐使用20引脚共享跟踪端口方案(如表1所示)。这种设计通过PORTSIZE信号动态分配带宽:
| 处理器1带宽 | 处理器2带宽 | 数据引脚分配 |
|---|---|---|
| 20bit | 0bit | [19:0]用于核1 |
| 12bit | 8bit | [19:8]核1, [7:0]核2 |
| 8bit | 12bit | [19:12]核1, [11:0]核2 |
| 0bit | 20bit | [19:0]用于核2 |
多核跟踪的关键挑战是时钟同步。ETM10RV支持两种同步方案:
同源时钟:两个ETM使用同一时钟源
异步时钟:使用独立时钟
vhdl复制-- 异步时钟数据对齐示例(VHDL)
process(traceclk_b)
begin
if rising_edge(traceclk_b) then
if tracedata_b(15 downto 12) = "1100" then -- 检测同步头
data_buf <= tracedata_b(11 downto 0);
valid_b <= '1';
end if;
end if;
end process;
ETM10RV采用特殊的测试封装设计(如图4所示),包含:
测试模式配置:
| 模式 | MUXINSEL | MUXOUTSEL | 功能 |
|---|---|---|---|
| 内部测试 | 1 | 0 | 测试ETM核心逻辑 |
| 外部测试 | 0 | 1 | 测试接口逻辑 |
| 正常工作 | 0 | 0 | 功能模式 |
跟踪端口PCB设计关键要求:
实测中常见问题处理:
在实际项目调试中,有几个关键点需要特别注意:
c复制// 正确的ETM初始化流程
void init_etm(void) {
write_etm_reg(ETMCR, 0x00000000); // 先禁用ETM
write_etm_reg(ETMTRIGGER, 0x0000); // 清除触发器
write_etm_reg(ETMCONFIG, 0x0001); // 基本配置
write_etm_reg(ETMCR, 0x00000001); // 最后使能
}
通过FPGA原型验证发现的一个典型问题:当ARM1026EJ-S进入低功耗模式时,ETM10RV的时钟可能不同步。解决方案是在电源管理代码中加入ETM状态保存/恢复流程:
armasm复制; 低功耗模式处理
enter_low_power:
MRC p14, 0, r0, c1, c0, 0 ; 读取ETM控制寄存器
STMFD sp!, {r0} ; 保存ETM状态
... ; 进入低功耗流程
exit_low_power:
LDMFD sp!, {r0} ; 恢复ETM状态
MCR p14, 0, r0, c1, c0, 0 ; 写回ETM控制寄存器
这些经验来自实际项目的调试积累,希望能帮助开发者避免重复踩坑。对于更复杂的调试场景,建议结合ARM CoreSight架构的其它组件(如ITM、TPIU等)构建完整的调试解决方案。