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的更多相关文章

  1. Rocket - debug - TLDebugModuleInner - Hart Bus Access

    https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考 ...

  2. Rocket - debug - Periphery

    https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...

  3. Rocket - debug - DebugTransport

    https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew 简单介绍DebugTransport的实现. 1. JtagDTMConfig 1) JtagDTM ...

  4. Rocket - debug - TLDebugModule

    https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含 ...

  5. Rocket - debug - TLDebugModuleInner - ROM Generation

    https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...

  6. Rocket - debug - Example: DMI

    https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调 ...

  7. Rocket - debug - Example: Triggers

    https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigge ...

  8. Rocket - debug - Example: Accessing Registers Using Program Buffer

    https://mp.weixin.qq.com/s/8yYLVg-RXX3XX0T431lxeA 介绍riscv debug接口的使用实例:使用Program Buffer读取寄存器. 1. Wri ...

  9. Rocket - debug - Example: Accessing Registers Using Abstract Command

    https://mp.weixin.qq.com/s/RdJzE06mMkh2x__vVj_fEA 介绍riscv debug接口的使用实例:使用抽象命令读取寄存器. 1. Read s0 using ...

随机推荐

  1. POJ2376Cleaning Shifts(区间覆盖贪心)

    应该还是蛮简单的一题,但是因为模拟太差,一直没调出来....... \(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\). \(那么第一个区间的l一定要是1,而且必拿(否则没有区间能 ...

  2. C. Ilya And The Tree 树形dp 暴力

    C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...

  3. 挑战程序竞赛 反转开关 poj3276

    这个我其实也没有看太懂它的证明过程. 1.若某一个位置被翻转了n次,则其实际上被翻转了n%2次. 2.分析易知翻转的顺序并不影响最终结果. 3.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只 ...

  4. 第一个Vue-cli

    第一步下载node.js https://nodejs.org/zh-cn/ 安装成功后 在cmd 输入 node -v 看看能不能打印出来 在cmd 输入 nmp-v 看看能不能打印出来 全局安装 ...

  5. 自动化运维工具Ansible之Roles测验详解

    Ansible Roles 详解与实战案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  6. Spring官网阅读(十八)Spring中的AOP

    文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...

  7. spring学习笔记(八)webSocket

    知识储备 什么是stomp? 我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要 ...

  8. Day_09【常用API】扩展案例2_测试小字符串在大字符串中出现的次数

    分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: 请输入大字符串: woaiheima,heimabutongy ...

  9. 解决MySQL 8.0数据库出现乱码的问题

    1.在MySQL 8.0的安装目录下创建一个my.ini文件(保存为utf8格式),然后写入以下内容: [mysql] # 设置mysql客户端默认编码 default-character-set=u ...

  10. 手把手教系列之IIR滤波器设计

    [导读]:在嵌入式系统中经常需要采集模拟信号,采集模拟信号的信号链中难免引入干扰,那么如何滤除干扰呢?今天就来个一步一步描述如何设计部署一个IIR滤波器到你的系统. 何为IIR滤波器? 无限冲激响应( ...