RISC-V Debug学习笔记(一)JTAG调试模块的Verilog实现

注:转载请注明出处
参考RISC-V External Debug Support Version 0.14.0-DRAFT。
记录下学习过程,个人水平有限,可能理解有误,后续若发现错误之处,会及时更新。

VersionDate
1.02021.12.16

在此之前,我学习了JTAG标准,现在需要通过实践去加深理解。故这篇笔记用来介绍RISC-V SoC中调试模块的实现。以Gitee上 tinyriscv 项目中的调试模块为参考深入学习。

调试模块目录下有四个Verilog代码文件,如图1所示:
在这里插入图片描述

图1 调试模块目录

首先介绍下RISC-V的调试系统,如图2所示:
在这里插入图片描述

图2 RISC-V调试系统概述

可以看到主要分为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所示:
在这里插入图片描述

图3 jtag_top原理图

可以看到顶层模块例化了一个jtag_driver和jtag_dm。

二、jtag_driver.v

模块编译后的原理图如图4所示:
在这里插入图片描述

(a)模块封装图

在这里插入图片描述

(b)模块内部原理图
图4 jtag_drive 模块原理图

可以看到此模块的输入输出信号有jtag接口信号TCK、TMS、TDI,rst_n ,TDO;此外还有DTM与DM通信的请求和应答信号。故个人目前理解是,此信号实现了DTM(其中包括了TAP控制器)和DMI。可通过JTAG接口来对DTM的寄存器进行读写操作,DTM 按照JTAG标准可理解为测试逻辑架构,其内有TDR、IR和TAP控制器。
接下来对Verilog实现代码进行分析:
在这里插入图片描述

图5 jtag_drive.v中所有的always块

在这里插入图片描述

图6 always块-state swith
  • state swith:根据TCK和TMS信号,进行TAP控制器状态转移。(具体转移规则可查看我JTAG标准对应部分的学习笔记。)

在这里插入图片描述

图7 always块-TAP reset

  • TAP reset:当TAP控制器当前状态为 test-logic-reset时,IR置为IDCODE寄存器的地址即5’b00001;为Update-IR状态时,将移位寄存器链(shift_reg)的低5位赋值给IR,这也符合了JTAG标准,即IR寄存器只有在此两个状态时才会发生改变或者说更新。

在这里插入图片描述

图8 always块-DTM reset
  • DTM reset:通信状态指示信号 sticky_busy 仅在 Update-DR状态且DTMCS寄存器被选中,DTMReset标志位有效和硬复位下会清零;在Capture-DR状态且DMI寄存器被选中时,sticky_busy 被赋值。

在这里插入图片描述

图9 always块-IR or DR shift
  • IR or DR shift:在不同的状态(Capture/Shift-IR/DR),对移位寄存器链进行对应操作,如右移一位,赋值等。这里移位寄存器链代表了TDI和TDO之间的移位寄存器路径。通过MUX来选中不同的DR或者IR到此路径中。
    在这里插入图片描述
图10 start access DM module
  • start access DM modulet:在Update-DR状态且DMI寄存器被选中时,发送端也处于空闲状态,则向DM发送数据。
    在这里插入图片描述
图11 receive DM response data
  • receive DM response data:这个块的功能就是当接收有效时,把接收的数据放入到对应的寄存器中

在这里插入图片描述

图12 tx busy
  • tx busy:DTM请求访问DM时将DM状态置于busy,当DTM接收到应答信号 rx_valid有效时,将DM状态置为空闲(1’b0)。

在这里插入图片描述

图13 TDO output
  • 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

  • 10
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
RISC-V是一种基于开放架构的指令集架构(ISA),其具有丰富的调试功能,被称为RISC-V DebugRISC-V Debug为软件和硬件提供了一种统一的调试接口,以实现系统级的调试操作。 在RISC-V Debug中,存在一个特殊的调试模块,称为Debug Module(DM)。DM是连接CPU核心和调试工具的桥梁,它通过一系列调试命令和寄存器来实现针对运行中的处理器进行监控和调试的功能。 在RISC-V Debug中,有两种调试接口:Debug Transport Module(DTM)和Debug Abstract Rachine Interface(DARI)。DTM通常用于通过调试接口连接硬件开发板和调试工具,而DARI用于连接软件仿真器和调试工具。 RISC-V Debug支持多种调试操作,包括读写寄存器、设置断点、单步执行、观察内存等。通过这些操作,调试工具可以实现RISC-V处理器的控制和观察。 RISC-V Debug还支持硬件断点和软件断点功能。硬件断点可以在特定的内存地址上设置断点,一旦处理器运行到该地址,就会暂停执行并跳转到调试工具。软件断点则是在程序执行过程中插入的特殊指令,一旦程序执行到该指令,也会触发断点。 除了断点功能,RISC-V Debug还提供了观察寄存器和内存的能力。调试工具可以读取和写入处理器的寄存器和内存内容,以便分析程序的状态和数据。 总体而言,RISC-V Debug是一种功能强大的调试工具,它为软件和硬件开发人员提供了多种调试操作,以帮助他们更好地分析和调试RISC-V处理器的程序。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪天鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值