https://mp.weixin.qq.com/s/cTuVq9xnj1Rcb7hrANDmcg
简单介绍MemoryBus的实现。
1. CacheBlockBytes
用于定义和查找参数配置的key:
对应的参数为缓存块的大小(字节数)。
2. BroadcastParams
BroadcastParams定义TLBroadcast所需要的参数:
TLBroadcast的定义如下:
3. BroadcastKey
用于定义和查找BroadcastParams的Key:
4. BankedL2Params
定义两个参数:
其中:
a. nBanks:bank的个数;
b. coherenceManager:生成内存一致性管理器的函数;默认实现里面使用TLBroadcast提供缓存一致性逻辑。
coherenceManager在ExampleRocketSystem中使用:
假设这里获取到的是默认的coherenceManager,这里的连接结构图如下:
5. MemoryBusParams
定义存储总线的参数:
其中:
a. MemoryBusParams继承自HasTLBusParams/HasBuiltInDeviceParams/HasRegionReplicatorParams;
b. beatBytes/blockBytes:用于实现HasTLBusParams中的抽象成员:
c. zeroDevice/errorDevice:用于实现HasBuiltInDeviceParams中的抽象成员:
d. replicatorMask:用于实现HasRegionReplicatorParams中的抽象成员:
6. MemoryBus
MemoryBus用于实现一个内存总线。
1) TLBusWrapper
MemoryBus继承自TLBusWrapper,实现了其中的抽象成员:
A. inwardNode
inwardNode是总线的上游节点连接的位置。其实现为:
其中:
a. 如果不需要复制下游节点,即params.replicatorMask == 0,直接使用xbar.node;
b. 如果需要复制下游节点内存区域,即params.replicatorMask != 0,就在xbar.node上游增加一个RegionReplicator节点。
c. RegionReplicator节点,根据replicatorMask的值,把下游节点的地址区间复制成多份:
B. outwardNode
outwardNode是总线下游节点连接的位置。其实现为:
其中:
a. ProbePicker用于合并上游的cache clients:
C. busView
busView使用的是第一个输入边:
2) CanHaveBuiltInDevices
用于提供attachBuiltInDevices方法,向memory_bus中引入zero/error设备:
3) CanAttachTLSlaves
MemoryBus下挂内存设备,内存设备作为下游节点,也就是slave存在。所以混入CanAttachTLSlaves以提供方法方便挂接下游节点:
4) toDRAMController
用于连接到下游DRAM控制器节点:
使用如下:
其结构大致如下: