https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew

简单介绍DebugTransport的实现。

1. JtagDTMConfig

1) JtagDTMConfig

这是关于JtagDTM的配置:

其中:

a. idcodeVersion:表示Jtag模块的版本号;

b. idcodePartNum:表示Jtag模块的Part number;

c. idcodeManfId:表示设计者或制造者的编号;

d. debugIdleCycles:表示需要多少个时钟周期DMI能够完成请求的操作:

2) JtagDTMKey

用于查找JtagDTMConfig的关键字:

3) JtagDTMKeyDefault

JtagDTMConfig的默认值:

2. dtmJTAGAddrs

记录JTAGDTM中使用的IR寄存器的地址:

3. DMIAccessUpdate

定义写入dmi寄存器的数据的结构:

各个字段的意义如下:

4. DMIAccessCapture

定义从dmi寄存器中读取数据的结构:

5. DTMInfo

定义dtmcs寄存器的结构:

规范中的定义如下:

注:规范的版本相较于代码实现较新,代码中没有实现dmihardreset。

6. SystemJTAGIO

定义系统JTAG接口:

7. DebugTransportModuleJTAG

用于生成调试传输模块:

1) io

定义调试传输模块的IO接口:

其中:

a. dmi用于与DMI模块相连:

b. jtag是JTAG标准接口,用于与外部连接:

2) DTM Info Chain

a. dtmInfo是一个DTMInfo结构的数据:

其值基本上都是默认值:

其中,dmiStatus是dmi的状态,其定义在规范中为:

dmiStatus使用stickyBusyReg/stickyNonzeroRespReg实现:

b. dtmInfoChain

dtmInfo用于实现dtmInfoChain:

dtmInfoChain是一个CaptureUpdateChain:

所谓Capture就是在Capture-DR状态把dtmcs寄存器的值捕获到移位寄存器中:

所谓Update是指在Update-DR状态把移位寄存器的值并出到dtmcs寄存器中:

在当前的实现中,只有dmireset为可以写:

3) Debug Access Chain

dmiAccessChain用于实现对dmi寄存器的读写:

读取数据的结构为DMIAccessCapture,写入数据的结构为DMIAccessUpdate。

4) busyReg

busyReg是一个寄存器,用于记录busy状态:

当通过DMI接口发起请求时,进入busy状态;当响应返回时,退出busy状态:

5) busy

a. busy

busy是一个布尔值:

表示当前是否busy:

b. stickyBusyReg

stickyBusyReg是一个寄存器:

表示之前是否存在读取dmi寄存器时而结果还没有返回的情况发生:

当写dtmcs.dmireset被写1时,清除stickyBusyReg的值:

6) skipOpReg

当DTM处于busy状态时,跳过操作:

在Update-DR状态,把skipOpReg的值置为false:

在Capture-DR状态,根据是否busy设置skipOpReg的值:

在Update-DR状态,如果skipOpReg为真,则不修改dmiRegReg的值:

也就是跳过操作。

7) downgradeOpReg

当之前的操作有错误时,把请求的操作降级为nop:

在Update-DR状态,把downgradeOpReg的值置为false:

在Capture-DR状态,设置downgradeOpReg的值:

不busy并且有错误返回时,downgradeOpReg置为true。

若downgradeOpReg为真,则向DMI发送的请求为OP_NONE:

8) nonzeroResp

非零响应即是错误响应:

a. nonzeroResp

nonzeroResp是一个标志位:

当返回的相应非零时,或者存在历史非零响应时置位:

b. stickyNonzeroRespReg

stickyNonzeroRespReg用于记录历史非零响应,在Capture-DR状态时置位:

9) dmiResp

Capture-DR状态捕获的值,存在三种情况:

a. 当busy为真时,使用busyResp:

其中:resp=3,规范中定义为:

b. 否则,当响应返回时,为dmiResp:

c. 当响应没返回时,使用nopResp:

10) dmiReqReg

dmiReqReg用于向DMI发送请求:

a. 当skipOpReg为真时,不改变dmiReqReg的值;

b. 当downgradeOpReg为真时,dmiReqReg为全零;

c. 正常情况下,dmiReqReg的值从移位寄存器中更新:

d. 只有正常情况下,才向DMI发送请求:

e. 针对不同的请求,接收响应的时机有所不同:

如果是写请求,则响应返回时即可接收;

如果是读请求,则需要在Capture-DR状态才能接收响应;

11) idcode

idcode是执行IDCODE命令时在Capture-DR状态获取到的值:

这里之所以可以直接调用get,而不用担心返回None,是因为使用JtagTapGenerator时传入的icode是有值的:

12) tapIO

tapIO是使用JtagTapGenerator生成的JtagTap模块的IO:

其类型为JtagBlockIO:

13) io连接

a. io.jtag

io.jtag连接到tap的jtag接口:

b. io.jtag_reset

io.jtag_reset输出到tapIO.control.jtag_reset:

作为Jtag状态机的复位信号:

c. io.fsmReset

当状态为TestLogicReset时,jtagTap输出reset信号:

这个reset信号进而输出到io.fsmReset:

io.fsmReset又被输出到DebugTransportModuleJTAG的复位信号:

Rocket - debug - DebugTransport的更多相关文章

  1. Rocket - debug - TLDebugModuleInner - Hart Bus Access

    https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考 ...

  2. Rocket - debug - Periphery

    https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...

  3. Rocket - debug - TLDebugModule

    https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含 ...

  4. Rocket - debug - TLDebugModuleInner - ROM Generation

    https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...

  5. Rocket - debug - Example: DMI

    https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调 ...

  6. Rocket - debug - Example: Triggers

    https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigge ...

  7. Rocket - debug - Example: Accessing Registers Using Program Buffer

    https://mp.weixin.qq.com/s/8yYLVg-RXX3XX0T431lxeA 介绍riscv debug接口的使用实例:使用Program Buffer读取寄存器. 1. Wri ...

  8. Rocket - debug - Example: Accessing Registers Using Abstract Command

    https://mp.weixin.qq.com/s/RdJzE06mMkh2x__vVj_fEA 介绍riscv debug接口的使用实例:使用抽象命令读取寄存器. 1. Read s0 using ...

  9. Rocket - debug - TLDebugModuleInnerAsync

    https://mp.weixin.qq.com/s/Xf4VFTHIDFh1NHmfwlTX3w 简单介绍TLDebugModuleInnerAsync的实现. 1. dmInner dmInner ...

随机推荐

  1. B - Housewife Wind POJ - 2763 树剖+边权转化成点权

    B - Housewife Wind POJ - 2763 因为树剖+线段树只能解决点权问题,所以这种题目给了边权的一般要转化成点权. 知道这个以后这个题目就很简单了. 怎么转化呢,就把这个边权转化为 ...

  2. 软件工程复习 WHUT

    软件过程模型: 瀑布模型:界限分明的独立阶段,计划驱动的软件过程.规范软件开发活动 (例如:可分为分析.开发.维护三个阶段) 也称生命周期模型.线性模型,采用结构化分析.设计.编程技术 不足的地方:知 ...

  3. pyhanlp安装成功,import导入失败,出现:importerror: cannot import name 'jvmnotfoundexception'

    1.问题描述: pyhanlp成功安装,并且可以正常使用,但是这段时间再去用的时候,发现出问题了,一运行就出现,下面的问题: importerror: cannot import name 'jvmn ...

  4. 数据结构——ArrayList的源码分析(你所有的疑问,都会被解答)

    一.首先来看一下ArrayList的类图: 1,实现了RandomAccess接口,可以达到随机访问的效果. 2,实现了Serializable接口,可以用来序列化或者反序列化. 3,实现了List接 ...

  5. ":-"的用法举例

    例子1: #!/bin/bash A=aaa C=${A:-bbb} echo $C 输出结果:aaa 例子2: #!/bin/bash A="" C=${A:-bbb} echo ...

  6. 使用npoi导入Excel - 带合并单元格--附代码

    之前我们在使用npoi导入excel表格的时候,往往会遇见那种带有合并单元格的数据在导入的时候出现合并为空的问题, 也就是只有第一条有数据,其余均为空白.在网上翻了半天也没有找到合适的解决方案,最后还 ...

  7. 从`ArrayList`中了解Java的迭代器

    目录 什么是迭代器 迭代器的设计意义 ArrayList对迭代器的实现 增强for循环和迭代器 参考链接 什么是迭代器 Java中的迭代器--Iterator是一个位于java.util包下的接口,这 ...

  8. 20184302 2019-2020-2 《Python程序设计》实验一报告

    20184302 2019-2020-2 <Python程序设计>实验一报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:20184302 实验教师 ...

  9. 【转载】皇 家 国 际 开 户图像的插值算法18O88O49999

    插值的定义: 设函数y=f(x)在区间[a,b]上有定义,且已知在点a≤x0<x1<…<xn≤b上的值为y0,y1,…,yn,若存在简单函数P(x)使得 P(xi)=yi (i=0, ...

  10. 抛弃os.path,拥抱pathlib

    基于Python的文件.目录和路径操作,我们一般使用的是os.path模块. pathlib是它的替代品,在os.path上的基础上进行了封装,实现了路径的对象化,api更加通俗,操作更便捷,更符编程 ...