zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/UggNsNOeEMP-GhzlLiT-qQ

     
    简单介绍Edges的实现。
     
     
    1. TLEdge
     
    包含client和manager两端的边,继承TLEdgeParameters类:
     
    1) isAligned
     
    判断访问的地址和访问大小是否对齐:
    a. 如果最大访问大小为1个字节,则访问是对齐的;
    b. 生成掩码(lgSize=2, maxLgSize=4, mask=0b1100)与地址相与,计算是否为0;
     
    2) mask
     
    根据访问的地址和大小生成访问的掩码:
     
    3) isRequest
     
    判断channel x是否在执行请求:
     
    因为Grant/GrantData需要GrantAck响应,所以也是请求:
    8.3.5: A Grant message is both a response and a request message...
     
    4) isResponse
     
    channel x是否在传输响应:
     
    5) hasData
     
    判断消息是否包含数据:
    首先通过staticHasData检查是否能在构建期(软件代码执行)得到答案,如果不能则生成硬件逻辑在硬件中进行判断。
     
    staticHasData根据client/manager的能力特点,看能否获得恒定的答案:
     
    6) opcode
     
    获取channel中的opcode部分:
     
    可以看到这里使用的是TLDataChannel,而不是TLChannel:
    a/b/c为TLAddrChannel,因为他们包含address这一项;
    a/b/c/d为TLDataChannel,因为他们包含data这一项;
    e既没有address也没有data,只是TLChannel;
     
    7) param
    8) size
    9) data
    10) corrupt
    corrupt信号对应着规范中的valid。
     
    11) mask
     
    这里使用的为TLAddrChannel,只有a/b/c:
    其中:a/b的mask外面提供,c的mask需要自己算;
     
    full_mask都是自己算:
     
    12) address
    13) source
    14) addr_hi/addr_lo
     
    根据manager支持的位宽,把地址分成高低两部分:
    a. 低的部分为按照manager.beatBytes对齐的部分。比如beatBytes=4, 则低2位为低的部分;
    b. 其余的高位为高的部分;
     
    15) numBeats
     
    计算把数据传完需要多少个时钟周期,即burst包含多少个beat:
    a. manager.maxTransfer <= manager.beatBytes:如果最大传输大小,小于数据总线位宽,则一定能在一个时钟周期(beat)内传完;
    b. 否则,需要看数据大小是否大于位宽:size <= UInt(cutoff);
    c. 若small为真,则右移cutoff后decode为0,需要一个beat;
    d. 若small为假,则small为0,需要的beat数取决于decode;
    e. UIntToOH(size, maxLgSize+1)=2^size;
    f. 需要的beat数为:2^size / 2^cutoff;
    g. hasData为假,则没有数据,需要一个beat;
     
    16) first/last
     
    2. TLEdgeOut
     
    定义client到manager的输出边(EO),我为client,对端为manager。
     
    1) Transfers
     
    Cache Permission相关消息。
     
    a. AcquireBlock
     
    生成支持AcquireBlock的硬件连接:
     
    b. AcquirePerm
     
     
    c. Release
     
    Release:
     
    ReleaseData:
     
    不会出错的ReleaseData:
     
    d. ProbeAck
     
    直接传入参数的ProbeAck:
     
    通过b:Probe生成c:ProbeAck:
     
    ProbeAckData同理;
     
    e. GrantAck
     
     
    2) Access
     
    生成访问消息硬件连接。
     
    a. Get
     
     
    b. Put
    考虑因素:
    - PutFull/PutPartial;
    - corrupt是否固定;
    - mask是传入,还是自己生成;
     
    c. Arithmetic
     
    简单数学运算消息:
     
    d. Logical
     
    简单逻辑运算消息:
     
    e. AccessAck
     
    TLEdgeOut从client连向manager:
    - client发起的Access消息从channel a传递,对应的AccessAck从b传回;
    - client发出的AccessAck消息从channel c传递,作为manager通过channel b传来的Access消息的回应;
     
    f. Hint
     
    client通过channel a发送Hint消息:
     
    g. HintAck
     
    client通过channel c返回HintAck消息,以响应manager通过channel b发出的Hint请求消息:
     
    3. TLEdgeIn
     
    定义manager到client的输入边(EI),我为manager,对端为client。
     
    1) Transfers
     
    定义manager发出的与Cache Permission相关的消息。
     
    a. Probe
     
    从channel b发出:
     
    b. Grant
     
    Grant和GrantData通过channel d回复:
     
    c. ReleaseAck
     
     
    2) Access
     
    定义访问消息。
     
    a. Get
     
    manager通过channel b发起请求:
     
    b. Put
    c. Arithmetic
    d. Logical
     
    同上。
     
    e. AccessAck
     
    manager通过channel d回复client通过channel a发来的访问请求:
     
    f. Hint
     
    manager通过channel b发起请求:
     
    g. HintAck
     
    manager通过channel d回复client通过channel a发来的Hint请求:
     
  • 相关阅读:
    搭建一个开源项目8-安装RabbitMQ
    搭建一个开源项目7-Redis缓存安装部署
    Java连载134-连接JDBC
    Java连载133-ResultSet接口的其他方法
    搭建一个开源项目6-安装MySql
    搭建一个开源项目5-安装python双环境以及Maven工程管理工具
    搭建一个开源项目4-安装xFTP,xShell,JDK,NODE
    搭建一个开源项目3-两种方式安装git
    给IE9及其以下等不支持classList属性的浏览器,添加classList属性
    IE9 报错 script1004缺少“;”
  • 原文地址:https://www.cnblogs.com/wjcdx/p/11135451.html
Copyright © 2011-2022 走看看