https://mp.weixin.qq.com/s/elOGjaVCWc48gs9c_cTqww 简单介绍TLDebugModuleInner中HALTSUM寄存器的实现. 1. numHaltedStatus 为了记录每个核心的暂停状态,需要的宽度为32位的窗口数: numHaltedStatus = (nComponents + 31) / 32 = (nComponents - 1 + 32) / 32 = (nComponents - 1) / 32 + 1 当前实现最多只支持1024…
https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考资料: a. https://github.com/pulp-platform/riscv-dbg/blob/master/doc/debug-system.md b. RISC-V External Debug Support Version 0.13.2 Appendix A.2 1. Hart…
https://mp.weixin.qq.com/s/jkiHceU0HaJbHGvHiU-QOA 简单介绍TLDebugModuleInner的实现. 1. 引入全局配置 1) cfg 引入DebugModulePrams: 2) hartSelFuncs 定义hartsel与hart id之间的映射函数: 2. 多个diplomacy node 1) dmiNode dmiNode是一个寄存器节点,包含除了DMCONTROL/HAWINDOWSEL/HAWINDOW三个寄存器之外的0x000…
https://mp.weixin.qq.com/s/tI41wu0xaIQ5PRq6F82tNw 简单介绍TLDebugModuleInner中生成DMI控制和状态寄存器使用到的状态. 1. abstractCommandBusy 表示是否处于等待状态,如果不是在等待状态,则视为Busy: 2. ABSTRACTCSWrEnLegal 如果正处于等待状态,则可以合法写入ABSTRACTCS寄存器: 3. COMMANDWrEnLegal 如果正处于等待状态,则可以合法写入COMMAND寄存器:…
https://mp.weixin.qq.com/s/RcXI8uEHvZHGCvX3DoVR4Q 简单介绍TLDebugModuleInner中处理抽象命令时的状态机. 1. CtrlState 定义抽象命令相关的四个状态: 1) ctrlStateReg ctrlStateReg是一个寄存器,记录了当前的状态: 2) ctrlStateNxt ctrlStateNxt记录了ctrlStateReg的下一个状态: 其值会输出到ctrlStateReg寄存器中: 3) reset 当io.dma…
https://mp.weixin.qq.com/s/1bIqzDYXM36MIfSsjvvYIw 简单介绍TLDebugModuleInner中的针对Custom的访问. 1. customNode customNode定义为DebugCustomSink类型的节点: 根据DebugCustomSink的定义,customNode所属的模块为调试模块: 这与customNode所属的模块为TLDebugModuleInner相符. Custom相关节点到连接图如下,供参考: 2. needCu…
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)…
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为真的情况下…
https://mp.weixin.qq.com/s/kjhJJ3moRQzxHt6pJOXEgg 简单介绍TLDebugModuleInner中Program Buffer寄存器的实现. 1. programBufferMem 1) 定义 以字节为单位的Program Buffer寄存器: 2) 复位值 dmactive为假时,其值为0: 2. programBufferNxt 用于存放programBufferMem寄存器的将要使用的值. 3. 寄存器组 programBufferMem是一…
https://mp.weixin.qq.com/s/DOLkEi-_qQt6lWOhJ2hxVQ 简单介绍TLDebugModuleInner中抽象数据寄存器的实现. 1. abstractDataMem 以字节为单位,表示抽象数据寄存器: dmactive为假时,其值为零: 2. abstractDataNxt 用于存放abstractDataMem寄存器的将要使用的值. 3. 寄存器组 abstract data是一组寄存器,包含了多个寄存器.这里使用RegFieldGroup来定义: 这…
https://mp.weixin.qq.com/s/Lz_D43YdhbRhiGiyoCBxDg 简单介绍TLDebugModuleInner中COMMAND寄存器的实现. 1. COMMANDReset 寄存器复位时使用的值: 当dmactive为假时,存入寄存器中: 2. COMMANDReg 带结构的寄存器: 3. 写 不带结构的32位写入值: 转换为带结构的写入值: 寄存器写入逻辑: 其中:COMMANDWrEnMaybe标志是否正在写入. COMMANDWrEnLegal标志写入的数…
https://mp.weixin.qq.com/s/adSB7lmKcqmwVd80-gmdIw 简单介绍TLDebugModuleInner中ABSTRACTAUTO寄存器的实现. 1. ABSTRACTAUTOReset 寄存器复位时使用的值: 当dmactive为假时,存入寄存器中: 2. ABSTRACTAUTOReg 带结构的寄存器: 3. 写 1) ABSTRACTAUTOWrDataVal 不带结构的32位值: 用于接收写寄存器时传入的数据: 2) ABSTRACTAUTOWrD…
https://mp.weixin.qq.com/s/dF_0sE5ZakyY569wlppVHA 简单介绍TLDebugModuleInner中ABSTRACTCS寄存器的实现. 1. ABSTRACTCSReset 寄存器复位时使用的值: 其定义如下: 其中,datacount和progbufsize的值从配置中获取. 2. ABSTRACTCSReg 带结构的寄存器: 3. 写 1) ABSTRACTCSWrDataVal ABSTRACTCSWrDataVal是一个不带结构的32位值:…
https://mp.weixin.qq.com/s/9GjZAax0SZhRqLne16jn-w 简单介绍TLDebugModuleInner中HARTINFO寄存器的实现. 1. HARTINFORdData 读HARTINFO寄存器时使用的数据源,通过dmiNode访问: 其中的值基本上都是根据配置生成后即保持不变: 2. dataaccess 表示使用CSR寄存器实现还是使用内存实现: 当前实现中,其值为1: 也就是使用内存实现. 3. datasize 表示data寄存器占用的32位字…
https://mp.weixin.qq.com/s/GyGriFyeq_7Z3xOjKn56Mg 简单介绍TLDebugModuleInner中DMSTATUS寄存器的实现. 1. DMSTATUSRdData 从DMSTATUS寄存器读取时,使用DMSTATUSRdData作为数据源: 2. authenticated 认证功能没有实现: 3. version 当前版本号值为2,代表Version 0.13: 4. any & all 规范中定义为: 代码实现为: 1) nonexisten…
https://mp.weixin.qq.com/s/7UY99gEJ8QpVBJIohdqKhA 简单介绍TLDebugModuleInner中innerCtrl相关的寄存器. 1. innerCtrl 接下来用到的innerCtrl来自于io中: io.innerCtrl从整体上看方向是输入,信号经过TLDebugModuleInnerAsync中转,来自Outer: io.innerCtrl一直处于ready状态: 2. selectedHartReg selectedHartReg是一个…
https://mp.weixin.qq.com/s/0zKSTktxgzo5uCUphqaWSQ 介绍抽象命令的解码和生成. 1. accessRegisterCommandReg accessRegisterCommandReg是从COMMANDReg取值解析而来的一个带结构变量: 解析出来的结构是ACCESS_REGISTERFields: 这是当command为访问寄存器时的结构: 注:我手上使用的代码比较老了,一直使用所以没有更新. quick access命令暂时没有实现: 2. G…
https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTAG 这是两个参数,用于进行参数查找: ExportDebugDMI表示导出DMI接口: ExportDebugJTAG表示导出JTAG接口: 2. DebugIO 定义系统调试模块接口: 其中:clockeddmi和systemjtag只有一个存在: 3. HasPeripheryDebug Has…
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:表示需要…
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…
https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调试模块. 2. dmi Debug Module Interface是对Debug Module的访问接口. 3. DTM dmi包含在DTM中.DTM是硬件接口相关的,可以是JTAG DTM,也可以是USB DTM. 4. JTAG DTM Registers 1) 支持的寄存器列表 a. 这里的…
https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigger是指硬件触发器:A debugger can use hardware triggers to halt a hart when a certain event occurs. 2. Trigger Module Triggers can: a. cause a breakpoint except…
https://mp.weixin.qq.com/s/8yYLVg-RXX3XX0T431lxeA 介绍riscv debug接口的使用实例:使用Program Buffer读取寄存器. 1. Write mstatus using program buffer 1) csrw s0 MSTATUS csrw用于写CSR,这里是把s0写入到mstatus中. 2) ebreak ebreak被debugger用于把控制权返回给调试环境,这里就是执行完Program Buffer中的程序之后,执行…
https://mp.weixin.qq.com/s/RdJzE06mMkh2x__vVj_fEA 介绍riscv debug接口的使用实例:使用抽象命令读取寄存器. 1. Read s0 using abstract command 1) abstract command 抽象命令,Debug模块支持一些可选的抽象命令.一般情况下,debugger执行命令时,CPU核心是被暂停的: 命令是否支持只能通过执行之后判断返回的错误码来确定: debugger通过写command寄存器来执行命令: 使…
https://mp.weixin.qq.com/s/Xf4VFTHIDFh1NHmfwlTX3w 简单介绍TLDebugModuleInnerAsync的实现. 1. dmInner dmInner是TLDebugModuleInnerAsync内部的一个子模块.其中又包含多个子节点. 1) dmiNode dmiNode是一个寄存器节点: 2) tlNode tlNode也是一个寄存器节点: 3) sb2tlOpt sb2tlOpt是一个把系统总线转换为tilelink总线的转换模块: 4)…
https://mp.weixin.qq.com/s/PSeMVZjSjEFHJgCYZzfa9Q 简单介绍TLDebugModuleOuterAsync的实现. 1. dmi2tl dmi2tl是TLDebugModuleOuterAsync中的一个子模块,用于把dmi接口转换为tilelink接口. 其结构图如下: 2. dmiXbar dmiXbar是一个TLXbar模块,用于连接多个TileLink模块: 3. dmOuter dmOuter也是一个子模块: 4. intnode int…
https://mp.weixin.qq.com/s/9nMo6IYmDCz7S-ALFx824g 简单介绍TLDebugModuleOuter的实现. 1. DebugModuleAccessType 定义调试模块访问宽度: 2. DebugAbstractCommandError 定义抽象命令访问错误: 3. DebugAbstractCommandType 定义抽象命令类型: 4. DebugModuleParams 定义调试模块参数: 其中: a. nDMIAddrSize:调试总线地址…
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为响应…
https://mp.weixin.qq.com/s/eFOHrEhvq2PlEJ14j2vlhg 简单介绍SBA的实现. 1. SystemBusAccessState 系统总线访问状态: 分别是:空闲.读请求.写请求.读响应.写响应: 2. SBErrorCode 定义错误码: 3. SBToTL 系统总线到TileLink总线的转换模块: 1) cfg 从配置参数中获取的DebugModuleParams配置: 2) diplomacy node 定义LazyModule的diplomac…
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的定义中,…