Rocket - debug - DebugTransport
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的更多相关文章
- Rocket - debug - TLDebugModuleInner - Hart Bus Access
https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考 ...
- Rocket - debug - Periphery
https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...
- Rocket - debug - TLDebugModule
https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含 ...
- Rocket - debug - TLDebugModuleInner - ROM Generation
https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...
- Rocket - debug - Example: DMI
https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调 ...
- Rocket - debug - Example: Triggers
https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigge ...
- Rocket - debug - Example: Accessing Registers Using Program Buffer
https://mp.weixin.qq.com/s/8yYLVg-RXX3XX0T431lxeA 介绍riscv debug接口的使用实例:使用Program Buffer读取寄存器. 1. Wri ...
- Rocket - debug - Example: Accessing Registers Using Abstract Command
https://mp.weixin.qq.com/s/RdJzE06mMkh2x__vVj_fEA 介绍riscv debug接口的使用实例:使用抽象命令读取寄存器. 1. Read s0 using ...
- Rocket - debug - TLDebugModuleInnerAsync
https://mp.weixin.qq.com/s/Xf4VFTHIDFh1NHmfwlTX3w 简单介绍TLDebugModuleInnerAsync的实现. 1. dmInner dmInner ...
随机推荐
- pytest文档38-allure.setp添加测试用例步骤
前言 一般流程性的测试用例,写成自动化用例时,步骤较多写起来会比较长.在测试用例里面添加详细的步骤有助于更好的阅读,也方便报错后快速的定位到问题. 举个常见的测试场景用例:从登陆开始,到浏览商品添加购 ...
- 网络流 O - Marriage Match IV
题目链接:https://vjudge.net/contest/299467#problem/O 题目思路:网络流+最短路 这个是一个最短路+最大流,最短路容易,就是跑起点到每一个点的距离. 但是这个 ...
- Spring源码阅读 之 配置的读取,解析
在上文中我们已经知道了Spring如何从我们给定的位置加载到配置文件,并将文件包装成一个Resource对象.这篇文章我们将要探讨的就是,如何从这个Resouce对象中加载到我们的容器?加载到容器后又 ...
- java读源码之 Queue(ArrayDeque,附图,希望能一起交流)
除了并发应用(并发包下的代码我之后会专门写),Queue在JavaSE5中仅有的两个实现是LinkedList和PriorityQueue,它们的差异在于排序行为而不是性能.1.6时新增了一个实现Ar ...
- 【FPGA技巧篇一】FPGA设计的四种常用思想与技巧之一 :乒乓操作
本文篇章将讨论一下的四种常用 FPGA 设计思想与技巧: 乒乓操作. 串并转换. 流水线操作. 数据接口同步化, 都是 FPGA 逻辑设计的内在规律的体现, 合理地采用这些设计思想能在FPGA设计工作 ...
- python语法学习第十天--类与对象
python面向对象语言 对象=属性+方法 OO(Object oriented面向对象)的特征: ①封装,信息隐蔽技术②继承:class A(BaseClass):③多态 类:图纸 class ...
- python第七天--文件练
目的: 将不同人物说的话分别保存下来 以==========分段 代码: f=open('record.txt','r',encoding='UTF-8') zyf=[] smy=[] count=1 ...
- Mysql 常用函数(6)- replace 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html replace 的作用 将某些字符串替换成新的字符 ...
- C#硬件开发业务流程调试技巧
C#硬件开发,一种是调用厂家提供的api;另一种就是通过com口,发送命令,和硬件通信.这2种方法,如果有硬件,业务流程很好调试.但是大部分硬件,只有和客户联调才会有硬件调试的机会.那业务流程没有硬件 ...
- 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器
上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...