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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雪天鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值