zoukankan      html  css  js  c++  java
  • Rocket

    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) 返回生成的各个寄存器的域

     

                 

     

  • 相关阅读:
    Hibernate之必须导入jar包
    浏览器兼容性问题
    CSS中的浮动清除
    CSS的三种手段让元素脱离标准本文档流——浮动、绝对定位、固定定位
    块级元素和行内元素
    网页设计前端——盒子模型
    CSS的继承性和层叠性
    网站前端设计——选择器
    网站中图片的相对路径与绝对路径
    网站隐藏文件夹
  • 原文地址:https://www.cnblogs.com/wjcdx/p/12238324.html
Copyright © 2011-2022 走看看