Rocket - debug - DebugTransport

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

 

简单介绍DebugTransport的实现。

 

 

1. JtagDTMConfig

 

1) JtagDTMConfig

 

这是关于JtagDTM的配置:

扫描二维码关注公众号,回复: 10707531 查看本文章

其中:

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

             

 

猜你喜欢

转载自www.cnblogs.com/wjcdx/p/12683359.html