Rocket - tilelink - Edges
Posted wjcdx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rocket - tilelink - Edges相关的知识,希望对你有一定的参考价值。
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请求:
??
以上是关于Rocket - tilelink - Edges的主要内容,如果未能解决你的问题,请参考以下文章
Rocket - tilelink - HintHandler
Rocket - tilelink - Monitor
Rocket - tilelink - ProbePicker
Rocket - tilelink - Xbar
Rocket - tilelink - Filter
Rocket - tilelink - Metadata