Rocket - debug - TLDebugModuleInner - Abstract Command Decoding & Generation

https://mp.weixin.qq.com/s/0zKSTktxgzo5uCUphqaWSQ

介绍抽象命令的解码和生成。

1. accessRegisterCommandReg

accessRegisterCommandReg是从COMMANDReg取值解析而来的一个带结构变量:

解析出来的结构是ACCESS_REGISTERFields:

这是当command为访问寄存器时的结构:

注:我手上使用的代码比较老了,一直使用所以没有更新。

quick access命令暂时没有实现:

2. GeneratedI

用于生成I-type的指令:

其定义为:

3. GeneratedS

用于生成S-type的指令:

4. GeneratedUJ

用于生成U-type/J-type类型的指令:

5. abstractGeneratedMem

用于存放根据抽象命令生成的两条指令:

abstractGeneratedMem中的值用于生成核心地址空间地址ABSTRACT处的值(两条指令):

6. abstractGeneratedI

用于存放一条I-type的指令:

这是一条LW指令,用于把DATA中的值传到regno代表的寄存器中:

LW/SW指令的定义如下:

7. abstractGeneratedS

用于存放一条S-type的指令:

这是一条SW指令,用于把regno代表的寄存器中的值写入到DATA地址处:

8. nop

用于存放一条I-type指令:

这是一条ADDI指令,没有实际的意义:

ADDI指令定义如下:

9. goAbstract

如果goAbstract为真,即要执行抽象命令,则把生成的指令填入到abstractGeneratedMem中:

1) abstractGeneratedMem(0)

a. 如果transfer为假,则使用nop;

b. 如果transfer为真,从LW/SW中选择;

c. 如果write为真,则使用abstractGeneratedI把DATA中的值传到regno代表的寄存器中(LW);

d. 如果write为假,则使用abstractGeneratedS把regno代表的寄存器中的值写入到DATA地址处(SW);

2) abstractGeneratedMem(1)

如果postexec为假,则使用EBREAK指令。执行EBREAK指令可以退出执行,把控制权交给调试器:

如果postexec为真,则使用nop。执行nop没有操作,一个效果就是会紧接着执行下一条指令。而下一条指令就是Program Buffer的第一条指令:

这也是postexec的用意,即执行完抽象命令之后,立即执行Program Buffer中的指令:

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

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

Rocket - debug - TLDebugModuleInner - Abstract Command Decoding & Generation的相关文章

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 - TLDebugModuleInner - Program Buffer Access

https://mp.weixin.qq.com/s/EJVqw7JPjjaib68tENl5AQ 简单介绍TLDebugModuleInner中的Program Buffer Access. 1. implementation-specific bits set by harts executing code 1) haltedBitRegs/resumeReqRegs haltedBitRegs和resumeReqRegs在dmactive为假的情况下,值为0.在dmactive为真的情况下

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 - 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 - 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:表示需要

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 - 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