zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/X0s5CWN84GEiwpNR7tiRgA

    基于AddressAdjuster介绍LazyModule的实现。

     
     
    1. AddressAdjuster
     
     
    地址适配器,根据chip_id & mask对地址进行区分:
    a. 与chip_id & mask相同的在本地(local)处理;
    b. 不同的使用远端(remote)处理;
     
    2. LazyModule的实现:lazy val module
     
    1) AddressAdjuster是一个中间节点,他有一个上游节点(对应一个输入边),两个下游节点(对应两个输出边):
     
    2) 计算需要Local节点处理的地址:
    效果相当于:local_address = chip_id & mask
     
    以channel A为例:
    根据地址是否应当由local处理:val a_local: Bool = local_address === (parent.a.bits.address & mask.U)
    a. 设置parent.a.ready由谁输入;
    b. 设置parent.a.valid输出到谁;
    c. 把parent.a.bits输出到local.a.bits/remote.a.bits;
     
    3) 错误处理
     
    计算local能处理的地址范围:
     
    parent的地址是否包含在local中:
     
    地址没在范围内,或者执行不支持的操作,则为错误:
     
    对local节点channel A的地址进行适配:
    a. 如果没出错,则使用parent.a.bits.address;
    b. 如果出错,则使用错误地址:errorSet.base.U;
     
    错误的地址会把操作导向错误处理设备:errorDev。
     
    4) 小结
     
    这里有两层适配:
    a. 根据parent.a.bits.address & mask是否与chip_id & mask相等,决定parent对接的是local还是remote;
    b. 根据local是否能处理对接到他的地址,决定是否把地址适配成为错误处理地址;
     
    3. Node的实现:val node
     
    AddressAdjuster中的node,用于与其他节点相连接以组成拓扑结构,以及用于协商参数。
     
     
    1) clientFn & managerFn
     
    clientFn为dFn,用于把参数向下游传递,managerFn为uFn,用于把参数向上游传递:
     
     
     
    clientFn和managerFn返回一个参数:val a = uFn(p)
    然后复制成n个:Seq.fill(n)(a)
     
    这里,clientFn的返回值被复制成2个,managerFn的返回值被复制成1个。
     
    2) managerFn
     
    managerFn是uFn,使用两个输出边的参数(UO),生成一个输入边的参数(UI):
     
    生成的参数如下:
    很遗憾的是,因为AddressAdjuster没有被使用,所以也无法得知这个新生成的参数(UI)如何使用。
     
    从其实现上,可以得到如下信息:
    a. endSinkId:AddressAdjuster的endSinkId是local和remote的endSinkId之和;
    b. minLatency:AddressAdjuster的minLatency是local和remote中的较小值;
    c. managers:这个下面单看;
     
    从endSinkId和minLatency两个参数看,UI是对两个UO的综合。
     
    3) managers
     
    a. checkMask
     
    AddressAdjuster的mask中的所有比特位,都在local/remote的AddressSet的mask中。
    也就是说AddressAdjuster的mask中的比特,是local/remote的所有AddressSet的mask中比特的共同子集。
     
    b. 使用AddressAdjuster的mask的AddressSet
     
    mask之外的地址集合:AddressSet(id, ~mask)
    其中,id从ids中取值:
     
    c. local的地址集合是remote的子集
     
     
    d. AddressSet(0, ~mask)中的地址漏洞(holes)
     
    ra: remote中的地址漏洞;
    la: la中的地址漏洞;
    holes: ra中的地址集合减去la中的地址集合;
     
    这些地址漏洞中的地址要转发(route)到local中去处理,所以la就不算是漏洞,需要从ra中减掉。
     
    e. newLocal
     
     
    newLocal的地址集合是原地址集合与(0, ~mask)的交集。如果是errorDev,那么还要处理ra的地址漏洞。
     
    f. newRemote
     
    newRemote的地址集合是原地址集合与(id, ~mask)的交集。
     
    问题1:为什么这里没有减去local与(id, ~mask)的交集?
     
    g. newLocal + newRemote
     
    UI的managers如下:
     
    问题2:为什么UI参数的managers中的地址集合,都是原local/remote地址集合与mask之外地址集合的交集呢?
     
    因为不知道这个参数如何使用,所以这两个问题就不得而知了。
     
    4. 另外一个Node:val chip_id
     
    这也是一个Node。
    所以AddressAdjuster中包含两个节点(node, chip_id),都可以与其他节点相连接。
     
    5. 附录
     
    AddressAdjuster.scala:
     
  • 相关阅读:
    Android学习之三:使用DDMS调试程序
    Android学习之二:使用Android文档帮助
    Android学习之四:创建一个简单程序
    Android学习之五:android一些基本控件
    创建Android开发环境
    Android学习之七:使用Container
    Android学习之六:使用Container
    IOSresign keyboard 新法儿
    IOStxt文件UTF8、UTF16格式
    IOSXMPP arc用方法fobjcarc
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10822824.html
Copyright © 2011-2022 走看看