Rocket - tilelink - SRAM

https://mp.weixin.qq.com/s/-z9n6SHyAiK2OE7mOSvC2Qnode

 
簡單介紹SRAM的實現。
 
 
1. 基本介紹
 
實現一個支持讀寫的靜態存儲器。存取的內容可使用ECC進行編解碼和驗證。
 
2. TLRAM
 
TLRAM是DiplomaticSRAM的子類:
 
1) 類參數
 
a. address:支持的地址集合;
b. cacheable:是否可被緩存;
c. executable:是否可執行;
d. beatBytes:數據總線寬度;
e. ecc:ECC編碼參數;
f. devName:設備名稱;
 
2) 限定條件
 
a. eccBytes:ECC編碼每次處理的數據字節數;
b. code:編碼類型;
c. eccBytes須要大於1,而且是2的冪;
d. 數據總線寬度須要大於1,而且是2的冪;
e. ECC編碼一次編解碼的字節數要小於等於總線寬度,不然沒法提供足夠的數據給ECC編碼使用;
 
3) diplomacy node
 
diplomacy node用於與其餘節點鏈接,並協商參數。
 
須要注意的是,這是一個manager節點,也就是他沒有下游節點,只能做爲節點路徑上的最後一個節點。
 
使用類參數生成一個manager的參數:
a. address:使用類參數address生成一個地址集合序列;
b. regionType:根據是否能夠緩存進行賦值,即上游節點是否能夠緩存SRAM中的數據,SRAM節點自己是不支持緩存的;
c. supportsXXX:不支持burst請求;
d. fifoId:安裝FIFO順序處理請求;
 
使用類參數生成一個ManagerPort的參數:
a. beatBytes:使用類參數beatBytes賦值;
b. minLatency = 1:最低延遲一個時鐘週期才能回覆響應消息,即a.fire()和d.fire()之間間隔至少一個時鐘週期;
 
4) lazy module
 
lazy module用於實現節點的內部邏輯。這裏主要是實現SRAM的讀寫,以及編解碼邏輯。
 
下面先介紹不考慮sublane(a_rmw_mask == 0)而且eccBytes == 1的狀況。
 
A. 只有一條輸入邊,而沒有輸出邊
 
符合最下游節點的位置特色。
 
B. 計算須要多少個ECC編解碼通道
 
由於每一個ECC編解碼的數據字節數有限,爲了知足beatBytes個字節的數據同時編解碼的要求,須要使用多個通道,同時進行編解碼。
 
C. 生成一塊同步讀/同步寫的內存
 
 
mem是一塊SyncReadMem:
 
D. 用於存儲channel a請求信息的寄存器:
 
其中:
a. d_ram_valid:註釋的意思是:若是剛從SRAM中讀出來的那個時鐘週期,那麼d_ram_valid爲真;其餘時鐘週期其值爲0;
 
 
E. 解碼原始數據
 
根據以前對ECC的介紹,對部分變量進行了重命名:
 
a. d_raw_data
 
按ECC編解碼通道進行劃分的原始數據,從內存中讀取:
 
b. d_decoded
 
把每個編解碼通道讀取的的數據使用編碼算法code進行解碼。
 
c. d_decoded_out:解碼結果:修正後的數據;
d. d_decoded_raw:未解碼前的數據,碼文中的原始數據;
e. d_decoded_corrected:是否進行過糾錯;
f. d_decoded_uncorrectable:是否存在沒法糾正的錯誤;
 
g. d_need_fix:若是進行過糾錯,則須要修正數據;
h. d_error:若是存在沒法糾正的錯誤,則出現錯誤;
 
F. 通知糾正和不可糾正錯誤的信息:
 
 
G. 生成回寫的數據
 
 
回寫是指讀取數據,發現錯誤,進行糾正,而後寫回正確數據。
若是eccBytes==1,那麼upd=0;回寫的是fix也就是ecc糾正以後的數據。
 
H. 生成每一個ECC通道是否回寫的掩碼
 
a. d_wb_lanes_mask:若是發生過糾錯,該通道就須要回寫;
b. d_wb_poison:存在不可糾正的錯誤,或者輸入的數據有錯誤;意義是要回寫的數據有毒(有錯誤);
 
I. 是否回寫:
 
若是從ram中讀取了數據,而且進行了糾錯,就要回寫:
 
J. 保持解碼結果和錯誤信息:
 
 
K. 組裝響應消息到in.d:
 
a. in.d.bits.data
 
若是d_ram_valid爲真,那麼使用d_decoded_raw。
註釋中說,由於d_pause的緣由,使用未修正的數據也是安全的。由於若是發生了糾錯,那麼d_pause就爲真,此時in.a/in.d都是被關閉的:
 
考慮到minLatency=1,也就是說in.d在至少一個時鐘週期後才能返回,那時候d_ram_valid=0,返回的是d_held_data,這是糾錯以後的數據。
整理一下,即:
fire() => d_ram_valid = 1 => in.d.bits.data := d_decoded_raw
=> 至少1個時鐘週期 => d_ram_valid = 0 => in.d.bits.data = d_held_data
 
b. in.d.bits.corrupt
 
這裏使用的是d_error,也就是存在不可糾正的錯誤時纔會回覆數據出錯。
也就是能夠糾正的錯誤不會回覆數據出錯。
 
L. d_pause
 
若是剛讀取到的數據須要修正,那麼就先暫停接收請求和回覆響應:
其中:
若是d_pause爲真,代表接收了一個讀請求,d_full應當爲真;
 
M. 解析接收到的請求:
 
 
N. a_sublane
 
意思是:某些通道沒有足夠的數據供編解碼使用。
 
這裏假設eccBytes == 1,先忽略a_sublane。
 
O. 讀使能,以及所需ECC通道的掩碼:
 
 
P. d.fire()則d_full爲假:
 
 
Q. 默認值
 
這裏的默認值,其實是做爲最後一個else語句使用。也就是說別處的判斷賦值未觸發的狀況下,就觸發這個默認賦值。
 
R. a.fire()
 
解析並存儲請求的各項信息:
 
這裏跟上面的結合在一塊兒,對a_ram_valid的賦值語句爲:
when (in.a.fire()) {
d_ram_valid := a_ren
} otherwise {
d_ram_valid := Bool(false)
}
 
S. 讀寫使能
 
a. wen:若是須要回寫糾正後的數據,或者不是一個讀請求,那麼須要向SRAM中寫數據;
b. ren:若是不是寫使能,那麼就在a.fire的那個時鐘週期打開讀使能。這有兩個效果:首先,寫使能優先;其次,讀使能只打開一個時鐘週期。
 
T. 生成寫邏輯:
 
其中:
a. addr:若是回寫,則使用d_address,即有問題數據的地址;不然使用a_address,即要寫的數據的地址;
b. sel:若是回寫,則使用d_wb_lanes_mask,即發生了修正的ECC通道組成的掩碼;不然使用a_lanes_mask,即從in.a.bits.mask中獲取到要寫哪些數據字節的掩碼;
c. dat:若是回寫,則使用ECC糾正後的數據做爲寫入內存的數據;不然使用in.a.bits.data做爲寫入內存的數據;
d. poison:若是回寫,則根據是否有不能糾正的錯誤來肯定要寫入的數據是否有毒;不然使用in.a.bits.corrupt來肯定;
e. coded:對數據進行編碼;若是不能檢錯,那麼就認爲沒有錯;
f. write:寫入的是編碼後的數據;
 
U. 不支持channel b/c/e:
 
 
3. 流程分析:回寫情景
 
這裏對讀取數據有誤然後成功修復後進行回寫的流程,進行簡單分析。
 
1) 讀取數據
 
A. a.fire()
 
 
B. ren打開
 
 
C. read
 
 
D. decode
 
 
E. d_pause
 
由於d_need_fix爲真,因此這裏暫停channel a/d:
 
2) 回寫數據
 
A. d_wb:須要回寫
 
 
B. 回寫的數據
 
 
C. 回寫的掩碼
 
 
3) 寫數據
 
A. wen
 
 
B. write
 
 
4) 什麼時候回覆Get請求?
 
ren打開讀取內存數據的下一個時鐘週期,d_ram_valid == 0,使得d_pause = 0,進而in.d.valid == 1,能夠回覆AccessAckData消息:
 
4. sublane
 
sublane的意義爲:某些通道沒有足夠的數據供編解碼使用。
 
若是eccBytes == 1,ECC通道要麼使用,要麼不使用,不存在數據不夠用的狀況。
 
數據不夠ECC通道使用,包含以下幾種狀況:
a. PutPartial請求中的mask能夠爲任意值,若是eccBytes == 2,而mask = 0x1011,那麼其中一個通道就只有一個字節可使用,此時就沒法進行編碼;
b. PutFull請求的大小小於eccBytes,這樣數據也不夠;如eccBytes == 2,而size==0要寫一個字節;
c. Get請求的大小小於eccBytes,雖然也能使a_sublane爲真,可是處理與普通的讀並沒有區別;由於每次老是讀取beatBytes個字節,足夠ECC通道使用;
 
針對Put請求的狀況,如何處理呢?
a. 先從RAM中讀取缺乏的字節;
b. 而後與現有的數據合在一塊兒進行編碼;
c. 最後再把合在一塊兒的編碼數據寫入內存中;
 
5. 附錄
 
1) ECC重命名錶
 
相關文章
相關標籤/搜索