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. springboot关于webmvc配置问题记录

    在之前的文章(springboot配置静态资源访问路径)中说过,springboot默认的加载静态资源的地方是在resources目录下的static文件夹下,其实除了resources目录下得sta ...

  2. Python3中正则的贪婪匹配模式

    什么是贪婪模式 正则在进行匹配时,从开始位置查找最远的结束位置,这种模式称之为贪婪模式. 在进行HTML标签类似内容获取时,贪婪模式会导致整个内容的返回,需要使用非贪婪模式. 固定的书写规则 : .* ...

  3. MATLAB矩阵处理—特殊矩阵

    需要掌握 MATLAB语言中特殊矩阵 MATLAB语言中矩阵的变幻 MATLAB语言矩阵如何求值 MATLAB语言中特征值与特征向量 MATLAB语言中稀疏矩阵 2.1  特殊矩阵 如何建立矩阵? 逐 ...

  4. 推荐算法_CIKM-2019-AnalytiCup 冠军源码解读_2

    最近在为机器学习结合推荐算法的优化方法和数据来源想办法.抱着学习的态度继续解读19-AnalytiCup的冠军源码. 第一部分itemcf解读的连接:https://www.cnblogs.com/m ...

  5. 【Spark】SparkStreaming和Kafka的整合

    文章目录 Streaming和Kafka整合 概述 使用0.8版本下Receiver DStream接收数据进行消费 步骤 一.启动Kafka集群 二.创建maven工程,导入jar包 三.创建一个k ...

  6. es6中 var 和 let的区别

    区别1:var没有块级作用域,只有 函数级作用域 和 全局作用域:let有块级作用域 function fn() { { var a = 10; } console.log(a) //输出10 } f ...

  7. Mysql常用sql语句(19)- in / exists 子查询

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 子查询在我们查询方法中是比较常用的,通过子查询可 ...

  8. vue-multi-module【多模块集成的vue项目,多项目共用一份配置,可以互相依赖,也可以独立打包部署】

    基于 vue-cli 2 实现,vue 多模块.vue多项目集成工程 Github项目地址 : https://github.com/BothEyes1993/vue-multi-module 目标: ...

  9. Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:1099 site:blog.csdn.net

    相信你看到这个之前,已经找了很多的方法了 那么最终的解决方案应该是什么呢? 为什么之前明明跑的好好的项目,它就不行了呢?好好跑下去,它不香吗? 好了,不皮了,在我长达3个小时的奋战下,终于,自己找到了 ...

  10. unittest详解 跳过用例的执行(skip)

    在执行测试用例时,有时候有些用例是不需要执行的,那我们怎么办呢?难道删除这些用例?那下次执行时如果又需要执行这些用例时,又把它补回来?这样操作就太麻烦了. unittest提供了一些跳过指定用例的方法 ...