注:转载请注明出处
参考RISC-V External Debug Support Version 0.14.0-DRAFT。
记录下学习过程,个人水平有限,可能理解有误,后续若发现错误之处,会及时更新。
Version | Date |
---|---|
1.0 | 2021.12.16 |
在此之前,我学习了JTAG标准,现在需要通过实践去加深理解。故这篇笔记用来介绍RISC-V SoC中调试模块的实现。以Gitee上 tinyriscv 项目中的调试模块为参考深入学习。
调试模块目录下有四个Verilog代码文件,如图1所示:
首先介绍下RISC-V的调试系统,如图2所示:
可以看到主要分为3个部分
- Debug Host:调试主机,可理解为PC;
- Debug Transpost Hardware:可理解为JLink或者CMSIS-DAP这种的调试工具;
- RISC-V Platform :RISC-V 系统,包含调试组件和处理器核。
在调试组件包括DM、DMI、DTM,这也是代码所要实现的模块,与调试工具直接交互的是DTM模块,DTM模块通过DMI接口与DM模块交互,DM根据调试指令去控制处理器核进行对应操作。
下面分别讲解调试模块的各部分:
一、jtag_top.v
调试模块的顶层模块为 jtag_top,编译后的RTL原理图如图3所示:
可以看到顶层模块例化了一个jtag_driver和jtag_dm。
二、jtag_driver.v
模块编译后的原理图如图4所示:
可以看到此模块的输入输出信号有jtag接口信号TCK、TMS、TDI,rst_n ,TDO;此外还有DTM与DM通信的请求和应答信号。故个人目前理解是,此信号实现了DTM(其中包括了TAP控制器)和DMI。可通过JTAG接口来对DTM的寄存器进行读写操作,DTM 按照JTAG标准可理解为测试逻辑架构,其内有TDR、IR和TAP控制器。
接下来对Verilog实现代码进行分析:
- state swith:根据TCK和TMS信号,进行TAP控制器状态转移。(具体转移规则可查看我JTAG标准对应部分的学习笔记。)
- TAP reset:当TAP控制器当前状态为 test-logic-reset时,IR置为IDCODE寄存器的地址即5’b00001;为Update-IR状态时,将移位寄存器链(shift_reg)的低5位赋值给IR,这也符合了JTAG标准,即IR寄存器只有在此两个状态时才会发生改变或者说更新。
- DTM reset:通信状态指示信号 sticky_busy 仅在 Update-DR状态且DTMCS寄存器被选中,DTMReset标志位有效和硬复位下会清零;在Capture-DR状态且DMI寄存器被选中时,sticky_busy 被赋值。
- IR or DR shift:在不同的状态(Capture/Shift-IR/DR),对移位寄存器链进行对应操作,如右移一位,赋值等。这里移位寄存器链代表了TDI和TDO之间的移位寄存器路径。通过MUX来选中不同的DR或者IR到此路径中。
- start access DM modulet:在Update-DR状态且DMI寄存器被选中时,发送端也处于空闲状态,则向DM发送数据。
- receive DM response data:这个块的功能就是当接收有效时,把接收的数据放入到对应的寄存器中
- tx busy:DTM请求访问DM时将DM状态置于busy,当DTM接收到应答信号 rx_valid有效时,将DM状态置为空闲(1’b0)。
- TDO output:TDO 在 SHIFT_IR 和 SHIFT_DR 状态时将寄存器链的最低位输出,其余状态输出0。
总结: jtag_driver实现了DTM(包括TAP控制器)以及DMI,可与DM进行通信。
其余两个.v文件将在下一篇博客中讲解。
参考文献
【1】RISC-V External Debug Support Version 0.14.0-DRAFT Fri Oct 23 2020