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請求: