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的复位信号:

原文地址:https://www.cnblogs.com/wjcdx/p/12683359.html

时间: 2024-10-18 12:46:38

Rocket - debug - DebugTransport的相关文章

Rocket - debug - TLDebugModuleInner - ROM Generation

https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbstract是一条指令,跳转到抽象命令的指令: Instruction.JAL是jump and link指令: GeneratedUJ用于生成一个UJ格式的指令结构: JAL属于J-format. GeneratedUJ的定义如下: jalAbstract.setImm(ABSTRACT(cfg)

Rocket - debug - TLDebugModule

https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含了设备的各种信息: 2. dmOuter dmOuter是一个TLDebugModuleOuterAsync模块: 其结构示意图如下: 3. dmInner dmInner是一个TLDebugModuleInnerAsync模块: 其结构示意图如下: 4. node node是dmInner.tlN

Rocket - debug - Periphery

https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTAG 这是两个参数,用于进行参数查找: ExportDebugDMI表示导出DMI接口: ExportDebugJTAG表示导出JTAG接口: 2. DebugIO 定义系统调试模块接口: 其中:clockeddmi和systemjtag只有一个存在: 3. HasPeripheryDebug Has

Rocket - debug - Example: Selecting Harts

https://mp.weixin.qq.com/s/HjG5S9binyniG_amC3Dr5Q 介绍riscv-debug的使用实例:如何选择核心,执行Halt/Resume请求. 1. Selecting Harts 可以有多个核心连接在一个调试模块上,如果要让一个核心暂停.重新执行.复位,或者执行调试命令,需要先选择目标核心. A. Selecting a Single Hart 可以在hartsel中填入目标核心的编号,选择单个核心: B. Selecting Multiple Har

Rocket - debug - dm registers

https://mp.weixin.qq.com/s/P48K17TyRoZC7xBMltbXKQ 简单介绍调试模块中每个寄存器的定义. 1. DMI_RegAddrs 记录DMI访问的各个寄存器的地址: 在规范中定义如下: 2. DMSTATUSFields 在规范中定义如下: 3. DMCONTROLFields 寄存器dmcontrol中各个域的定义如下: 4. HARTINFOFields 寄存器hartinfo中各个域的定义如下: 5. HAWINDOWSELFields 寄存器haw

Rocket - debug - Custom

https://mp.weixin.qq.com/s/jkBP6ZjEbgm-SVDpLUMjlA 简单介绍Custom的实现. 1. DebugCustomParams 包含两个参数: a. addrs: 地址: b. width: 数据宽度: 2. DebugCustomNull 定义向上游传递的空参数: 3. DebugCustomBundle 定义DebugCustom节点连接所需要的Bundle: 从一个节点的角度看,其定义如下: 其中: a. 相连节点发送输入地址(addr),以及地

Rocket - debug - DebugCustomXbar

https://mp.weixin.qq.com/s/7h9Bdb0x4_clyigMU_0B7Q 讨论DebugCustomXbar中的几个问题. 1. sources/sourceParams node.in.unzip解出来输入边中的BI, EI参数,分别是sources和sourceParams: 其中,sourceParams的类型为Seq[DebugCustomParams],其中包含了每一条输入边的地址列表(addrs:List[Int])和数据宽度: 2. decoded dec

Rocket - debug - DebugCustomXbar再讨论

https://mp.weixin.qq.com/s/YPFa6kE6I_Ud_MJGvzmS-g 简单讨论输入边/输出边Bundle的方向. 1. 上游节点的地址不重复 仔细看了一下sourceFn的实现: 其中要求上游节点中不存在重复的地址: 这样也就不存在decoded中存在两个元素同时为真的情况: 2. source.addr := sink.addr 在lazy module的实现中,把sink.addr输入到source.addr中: 而在DebugCustomBundle的定义中,

Rocket - debug - DMI

https://mp.weixin.qq.com/s/70BoeS7z4aBZK24zxdZzXA 简单介绍DMI的实现. 1. DMIConsts 定义DMI使用的常量: 其中: a. dmiDataSize为数据宽度: b. dmiOpSize为操作宽度: 2. DMIReq 定义DMI请求的结构: 其中: a. addr为请求地址,其宽度由参数传入: b. data为请求时使用的数据: c. op为请求的操作类型: 3. DMIResp 定义DMI响应的结构: 其中: a. data为响应