Rocket - util - AsyncQueue
生活随笔
收集整理的這篇文章主要介紹了
Rocket - util - AsyncQueue
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
https://mp.weixin.qq.com/s/6McbqOKM4fu4J5vdpZvxKw
簡(jiǎn)單介紹異步隊(duì)列(AsyncQueue)的實(shí)現(xiàn)。
??
0. 異步隊(duì)列
異步隊(duì)列的兩端分屬不同的時(shí)鐘域,擁有各自的復(fù)位邏輯。
異步隊(duì)列用于存值的一端為上游端(source),用于取值的一端為下游端(sink)。
1. AsyncQueueParams
??
異步隊(duì)列的參數(shù),包含如下幾項(xiàng):
a. depth
隊(duì)列深度,表示隊(duì)列可以存儲(chǔ)幾個(gè)元素;
b. sync
表示流水線的級(jí)數(shù)。
c. safe
使用valid來標(biāo)識(shí)ridx和widx是否合法;是否要把一端的reset同步到另一端。
d. narrow
標(biāo)識(shí)數(shù)據(jù)同步通道的寬度。如果數(shù)據(jù)同步通道為窄,則每次只同步一個(gè)數(shù)據(jù)。否則,為所有數(shù)據(jù)提供同步通道。
??
2. AsyncBundleSafety
??
safe相關(guān)要在隊(duì)列兩端同步的信號(hào)(這里略去不做詳細(xì)介紹):
??
個(gè)人認(rèn)為更名為AsyncSafetyBundle更好,因?yàn)楸举|(zhì)上是一個(gè)Bundle,Safety是修飾詞,前置為宜。如白馬和馬白不是同一個(gè)意思。
3. AsyncBundle
??
要在隊(duì)列兩端同步的數(shù)據(jù),包括:
a. 待讀取元素的索引號(hào):ridx;
b. 待寫入元素的索引號(hào):widx;
c. 數(shù)據(jù):mem;
d. 數(shù)據(jù)索引號(hào):index;
e. safe相關(guān)的bundle(valid和reset);
c和d重構(gòu)如下:
??
如果數(shù)據(jù)同步通道為窄通道,則mem這個(gè)Vec只包含1個(gè)元素,而index則是當(dāng)前數(shù)據(jù)通道中元素的索引號(hào)。
如果數(shù)據(jù)同步通道為寬通道,則mem這個(gè)Vec包含depth個(gè)元素,每一個(gè)元素都有自己的同步通道,就不需要index來指示元素索引號(hào)了,所以此時(shí)index為None。
PS. option是一個(gè)隱式方法,定義如下:
??
4. GrayCounter
格雷碼計(jì)數(shù)器。
5. AsyncValidSync
用于支持AsyncBundleSafety,這里不做具體介紹。
6. AsyncQueueSource
異步隊(duì)列的上游端。上游端寫數(shù)據(jù)。
??
1) io
??
a. enq:輸入;
b. async:用于數(shù)據(jù)同步的端口;
2) 實(shí)現(xiàn)
a. enq
??
當(dāng)對(duì)方valid,而我方ready,亦即io.enq.fire()時(shí),把io.enq.bits存入mem中。
注意,此index為新定義的index,非io.async.index:
??
b. mem
也要注意區(qū)分mem和io.async.mem。
mem的定義為:
??
存儲(chǔ)的元素個(gè)數(shù)為隊(duì)列深度params.depth。
根據(jù)數(shù)據(jù)同步通道的寬窄,來決定同步一個(gè),還是全部同步:
??
c. widx
??
source端為寫端,widx是一個(gè)格雷碼計(jì)數(shù)器,會(huì)被同步到sink端:
??
d. ridx
??
讀取的元素索引號(hào)。sink端為讀端。ridx從sink端同步而來。
e. ready
隊(duì)列不滿,則可以ready。
??
??
可以看到io.enq.ready也取決于sink_ready。在不考慮safe的情況下,sink_ready一直為true。
7. AsyncQueueSink
??
與AsyncQueueSource對(duì)應(yīng),這里略去。
8. FromAsyncBundle
??
x是一個(gè)AsyncBundle,構(gòu)造一個(gè)sink端與之連接。從AsyncBundle到DecoupledIO,即From AsyncBundle to DecoupledIO。
9. ToAsyncBundle
??
x是一個(gè)ReadyValidIO,構(gòu)造一個(gè)source端與之連接。從ReadyValidIO到AsyncBundle,即To AsyncBundle from ReadyValidIO。
10. AsyncQueue
??
創(chuàng)建異步隊(duì)列的兩端,并把它們相連。
CrossingIO定義如下:
??
總結(jié)
以上是生活随笔為你收集整理的Rocket - util - AsyncQueue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果智能AR挡风玻璃靠谱吗?
- 下一篇: HDU 1728 逃离迷宫 BFS题