ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RISC-V调试链路精讲:从JTAG TAP状态机到DMI与DM的Verilog实现

RISC-V调试链路精讲:从JTAG TAP状态机到DMI与DM的Verilog实现 调试系统这条链路很多同学一上来就被三个字母绕晕了JTAG、DMI、DM。我最早接触RISC-V调试时也踩过同样的坑——对着《RISC-V Debug Specification》翻了几十页寄存器一堆信号一堆但就是不知道这些模块之间到底怎么配合。后来在FPGA上写了一套支持断点和单步的调试链路才算把整条线彻底捋顺。这篇文章我就从JTAG底层的TAP状态机讲起一路经过DMI总线最后拆到DM调试模块内部配合Verilog代码把这条调试链路的每个环节都过一遍。无论你是做SoC验证、FPGA原型验证还是单纯对RISC-V生态感兴趣这篇文章能帮你把调试系统的骨架立起来。等你看完再去读Spec会发现那些寄存器、地址、操作码突然都有了实际意义。1. 调试系统全景JTAG、DMI、DM这条链路到底在解决什么问题1.1 一个核心矛盾CPU运行时的外部入侵调试的本质是让外部主机有能力控制一个正在运行的CPU。这就要求调试硬件具备两件事一是能随时让CPU停下来halt二是能读写CPU内部的寄存器GPR、CSR和内存。听起来简单但RISC-V的调试困境在于——RISC-V本身是开放指令集每个厂商的核都可能定制指令和寄存器如果调试协议五花八门那调试器比如OpenOCD就得为每款新核写一套插件生态会彻底碎片化。所以RISC-V基金会定了《RISC-V Debug Specification》核心思想就是在CPU核外部加一个统一调试模块DMDebug Module由它来统一接管所有hart硬件线程的调试动作。外部调试器不直接碰CPU内部信号只跟DM打交道。DM对外提供一套标准化的寄存器接口这套接口的物理传输通道就是DMIDebug Module InterfaceDMI本身需要从芯片外部接入最通用的接入方式就是JTAG。1.2 JTAG DMI DM三层的角色分工可以把这三层理解成物流系统JTAG是快递干线——负责把调试指令运到芯片门口只考虑怎么传输不考虑传什么业务。它定义了TAP状态机、指令寄存器和数据寄存器是纯物理层简单链路层。DMI是转运站——负责把JTAG送进来的数据包翻译成对DM内部寄存器的读写操作。它是个点对点总线协议地址最多32位数据宽度通常是32或64位。DM是最终仓库——收到DMI请求后执行真正的调试动作置起haltreq让CPU停止操作data寄存器来回传GPR通过程序缓冲Program Buffer往CPU注入指令或者通过系统总线访问System Bus Access直接读写内存。这个分层设计最巧妙的地方在于隔离变化。CPU核内部怎么实现断点、怎么暂停流水线那是DM与核之间的接口逻辑通常叫Debug Module到Core的接口外部不用关心JTAG和DMI只要协议不变整个调试链路就能复用。哪怕你从单核换成多核只需要把DM的hartselhart选择字段利用起来外部主机一侧的代码几乎不用改。1.3 Logisim级别的地图从主机到CPU的完整路径先给张地图后面所有章节都能对照着看主机PCOpenOCD/自己写的C程序通过USB转JTAG适配器发出TMS/TCK/TDI/TDO信号。这些信号进入芯片上的JTAG TAPTest Access Port模块TAP内部跑状态机把数据移入指令寄存器IR或数据寄存器DR。当IR被设置为访问DMI的指令通常是0x11DMI access指令具体数值由DTM寄存器配置决定DR就对应DMI的移位链。DMI移位链的内容包括写使能2位、地址可变宽一般7位、数据32位和一个op字段。Update-DR时DTMDebug Transport ModuleJTAG这一侧的总称解析这个包发起DMI请求。DMI请求到达DMDM按地址找寄存器执行操作再把结果返回给DTMDTM在TDO上把读出数据移出去。其中一个关键点是JTAG的TCK时钟频率通常是几MHz到几十MHz而CPU主频可能跑到几百MHz甚至GHzDMI接口两侧分属不同时钟域。后面讲跨时钟域时我会具体说这里会有哪些坑。2. JTAG底层的Verilog骨架TAP状态机与指令寄存器设计2.1 先把四根线的协议跑通JTAG标准IEEE 1149.1定义了一组引脚RISC-V调试一般只需要最基本的四根TCK测试时钟所有状态转移和移位都发生在TCK的上升沿。TMS测试模式选择决定TAP状态机跳转到哪个状态。TDI测试数据输入移位时每个TCK上升沿移入1位。TDO测试数据输出每个TCK下降沿更新输出这样TDI和TDO的采样错开简化时序约束。很多同学第一次写TAP状态机时容易把TMS信号当成片选——高电平选中、低电平不选中。其实TMS是状态转移的方向控制位每个TCK沿都有作用只是不同状态下它的含义不同。2.2 完整TAP状态机16个状态一次写清楚TAP状态机总共16个状态按功能分为两半分别处理指令寄存器IR和数据寄存器DR两条扫描路径都是7个状态Test-Logic-ResetTLR → Run-Test/IdleRTI → Select-DR-Scan → Capture-DR → Shift-DR → Exit1-DR → Pause-DR → Exit2-DR → Update-DR同理Select-IR-Scan → Capture-IR → Shift-IR → Exit1-IR → Pause-IR → Exit2-IR → Update-IR这里我给出一个实际项目里经过验证的Verilog状态机骨架状态编码用独热码避免组合逻辑过多导致时序收敛困难
返回列表