Rocket - debug - SBA
https://mp.weixin.qq.com/s/eFOHrEhvq2PlEJ14j2vlhg
简单介绍SBA的实现。
1. SystemBusAccessState
系统总线访问状态:
分别是:空闲、读请求、写请求、读响应、写响应;
2. SBErrorCode
定义错误码:
3. SBToTL
系统总线到TileLink总线的转换模块:
1) cfg
从配置参数中获取的DebugModuleParams配置;
2) diplomacy node
定义LazyModule的diplomacy node:
TLClientNode是SourceNode的子类,是一个上游节点,只有输出边,没有输入边。
3) lazy module
lazy module实现实际的转换逻辑。
A. 获取输出边
B. IO(...)
LazyModuleImp是MultiIOModule的子类,可以使用IO()方法来定义模块的IO接口:
其中:
a. rdEn:读使能;
b. wrEn:写使能;
c. addrIn:地址输入;
d. dataIn:数据输入;
e. sizeIn:访问大小;
f. dmactive:输入调试模块是否激活;
g. rdLegal:读请求是否合法;
h. wrLegal:写请求是否合法;
i. rdDone:读请求是否完成;
j. wrDone:写请求是否完成;
k. respError:响应错误;
l. dataOut:输出一个字节数据;
m. rdLoad:表示读取的数据字节的掩码;
n. sbStateOut:输出当前状态;
C. sbState
当前状态:
D. channel d
响应状态下d.ready为真:
E. 引用channel a/d的ready/valid信号以方便使用:
F. 把128位的输入数据按字节存入vecData:
G. counter是字节的序号:
H. muxedData用于承接逐个字节的数据,只有8位:
I. 生成读写逻辑:
其中,edge.Put()方法带入的muxedData只有8位,但是io.sizeIn的大小可能是8/16/32/64/128位:
Put操作的定义如下:
其中,size和data是独立的。data的宽度是有databits/beatBytes决定的。在这里是diplomacy node(TLClientNode)与下游节点连接的link中的channel a的数据宽度决定的。
SBToTL.node连接下游节点的位置只有一处:
在这里使用TLWidthWidget(1)对数据总线的宽度进行了限制,即限制为1个字节。所以无论是edge.Get还是edge.Put都是以1个字节为单位进行的。
J. 输出读写是否合法信号:
K. 输出当前状态:
L. 根据读写状态,通过channel a发出读写请求:
M. 输出:响应是否存在错误:
N. 读写数据传输是否完成:
O. counter是否增加或回转:
P. 生成读取数据的掩码:
Q. 驱动状态机:
R. 输出:读写是否完成标志:
S. 输出channel d返回的数据:
其中,io.dataOut是8位,d.bits.data也应该是8位;
T. channel a中是否存在合法请求:
U. 不支持缓存:
4. SystemBusAccessModule
生成系统总线访问模块的逻辑:
1) cfg
从配置参数中获取的DebugModuleParams配置;
2) sbcs
A. 包含各个域的bundle:
B. 复位值:
C. 读取值(带结构):
D. 写入的32位值:
E. 解析后的写入值(带结构):
F. 读写使能标志:
G. 生成sbcs寄存器的各个域:
其中:
a. 寄存器宽度为32位;
b. 从SBCSRdData.asUInt()中返回读取的32位值;
c. 把32位值写入到SBCSWrDataVal中;
d. 读使能标志:SBCSRdEn;
e. 写使能标志:SBCSWrEn;
3) sbaddr
A. 根据地址位数确定是否包含sbaddr1/sbaddr2/sbaddr3:
B. 4个32位地址寄存器:
C. 接收写入值的变量:
D. 读写使能标志:
E. 自增之后的地址:
F. 生成四个地址寄存器的域:
a. 如果不支持,则返回空的域序列;
b. 如果dmactive为假,则地址值为0;
c. 读地址寄存器时的数据源:
- 如果写地址使能位真,之前的sb操作没有错误,并且没有正在进行系统总线操作,那么使用SBADDRESSWrData(i)中的值作为寄存器的数据源;
- 如果读写已结束,并且配置要求自增地址,那么使用自增后的地址作为数据源:
d. 生成sbaddr寄存器域:
G. 把四个地址寄存器导向sb2tl模块:
H. 是否存在写某个地址寄存器的操作:
4) sbdata
A. 是否支持sbdata1/sbdata2/sbdata3:
B. 4个32位数据寄存器:
C. 读取寄存器时的数据源:
D. 写寄存器时的接收写入值的变量:
E. 读写寄存器的标志位:
F. 生成寄存器域:
a. 如果不支持,则返回空的域序列;
b. 如果dmactive为假,则数据值为0;
c. 读取数据源:
- 如果写数据使能为真,之前的sb操作没有错误,并且 没有正在进行sb操作,那么使用SBDATAWrData(i)中的值作为数据源;
- 如果存在新读取的数据,则使用sb2tl的数据输出:
d. 生成sbdata的寄存器域:
G. 把数据寄存器导向sb2tl模块:
H. 是否存在读写数据寄存器的操作:
5) sb2tl
A. 尝试读写使能标志:
其中:
a. sb写操作时sbdata0总是被使用;
b. sb读操作存在两种可能:
- 写sbaddr0寄存器并且设置了sbreadonaddr;
- 读sbdata0寄存器并且设置了sbreadondata;
B. 是否存在系统总线访问错误:访问大小不支持:
C. 是否存在地址对齐错误:
D. 输入读写使能标志:
E. 输入访问大小:
F. 输入调试模块是否激活:
G. 忙状态标志:
6) 生成sbcs寄存器的当前值
A. SBCSFieldsReg.sbbusyerror
a. 如果正在写入1,则清零:
b. 忙时写地址,则报错:
c. 忙时读写地址则出错:
d. 否则保持不变;
B. SBCSFieldsReg.sbreadonaddr/SBCSFieldsReg.sbautoincrement:如果正在写则使用新值,否则使用原值:
C. SBCSFieldsReg.sbreadondata/SBCSFieldsReg.sbaccess:如果正在写则使用新值,否则使用原值。
D. SBCSFieldsReg.sbversion:保持不变:
7) 生成sbcs寄存器的读取值
A. 生成地址或数据寄存器访问错误掩码:
B. 将默认读取值为寄存器的当前值:
C. 返回能力值:
D. 返回忙状态:
E. 返回错误状态:
8) 返回生成的各个寄存器的域
Rocket - debug - SBA的更多相关文章
- 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 - DebugTransport
https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew 简单介绍DebugTransport的实现. 1. JtagDTMConfig 1) JtagDTM ...
- 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 ...
随机推荐
- POJ2376Cleaning Shifts(区间覆盖贪心)
应该还是蛮简单的一题,但是因为模拟太差,一直没调出来....... \(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\). \(那么第一个区间的l一定要是1,而且必拿(否则没有区间能 ...
- C. Ilya And The Tree 树形dp 暴力
C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...
- 挑战程序竞赛 反转开关 poj3276
这个我其实也没有看太懂它的证明过程. 1.若某一个位置被翻转了n次,则其实际上被翻转了n%2次. 2.分析易知翻转的顺序并不影响最终结果. 3.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只 ...
- 第一个Vue-cli
第一步下载node.js https://nodejs.org/zh-cn/ 安装成功后 在cmd 输入 node -v 看看能不能打印出来 在cmd 输入 nmp-v 看看能不能打印出来 全局安装 ...
- 自动化运维工具Ansible之Roles测验详解
Ansible Roles 详解与实战案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...
- Spring官网阅读(十八)Spring中的AOP
文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...
- spring学习笔记(八)webSocket
知识储备 什么是stomp? 我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要 ...
- Day_09【常用API】扩展案例2_测试小字符串在大字符串中出现的次数
分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: 请输入大字符串: woaiheima,heimabutongy ...
- 解决MySQL 8.0数据库出现乱码的问题
1.在MySQL 8.0的安装目录下创建一个my.ini文件(保存为utf8格式),然后写入以下内容: [mysql] # 设置mysql客户端默认编码 default-character-set=u ...
- 手把手教系列之IIR滤波器设计
[导读]:在嵌入式系统中经常需要采集模拟信号,采集模拟信号的信号链中难免引入干扰,那么如何滤除干扰呢?今天就来个一步一步描述如何设计部署一个IIR滤波器到你的系统. 何为IIR滤波器? 无限冲激响应( ...