飛騰愛好者技術交流群碼公眾號“烏拉大喵喵” 顆粒線序配置輔助工具 B站講解視頻: 正文內容: 一、 飛騰X100顯存使用LPDDR4時,需要工程師在X100的固件中去配置線序交換說明,就類似下麵這個: 圖1 我們需要輸入每個slice中DQ的線序,也需要輸入slice之間的交換關係,這個工作量也不小 ...
飛騰愛好者技術交流群碼公眾號“烏拉大喵喵”
顆粒線序配置輔助工具
B站講解視頻:
正文內容:
一、
飛騰X100顯存使用LPDDR4時,需要工程師在X100的固件中去配置線序交換說明,就類似下麵這個:
圖1
我們需要輸入每個slice中DQ的線序,也需要輸入slice之間的交換關係,這個工作量也不小,同時容易出現錯誤,所以開發了一款輔助小工具,幫助大家快速配置此信息。(工具下載在文末)
二、
下麵我們先簡單的講述線序配置原則:
我們以X100 demo圖為例子,demo中X100的顯存是如下圖這樣接的。
左邊是X100端的解法,我們可以看到是DQ一一對應引出的。
右邊是顯存LPDDR4這邊的接法,從DDR顆粒角度來看,以slice0為例,8bit接線並不是一一對應的,是亂序的。
所以,我們就不去關心X100端了,我們只看右邊顆粒端的接線。
圖2
我們取出來LPDDR顆粒端slice0的部分接線。我們可以看到,
LPDDR4的DQ0接到了X100的DQ5上,
LPDDR4的DQ1街道了X100的DQ7上,
……
圖3
那麼我們從DDR顆粒角度來看,我們按照LPDDR DQ0~DQ7的順序(之所以這裡是從DQ0~DQ7來梳理,是因為原理圖從上到下是從DQ0~DQ7的,這樣符合直觀習慣),把上面的接線整理成表格:
但是因為最終我們是要去配置X100,所以我們的角度就不能以DDR顆粒了,需要從X100的視角來看。所以我們需要把上面的表,從X100的角度,按照DQ7~DQ0的順序進行整理(之所以這裡是從DQ7~DQ0來梳理,是因為X100的固件配置是從DQ7~DQ0來設置的):
所以我們在固件里針對slice0的配置,需要去按照X100 DQ7~DQ0的順序,填入對應的LPDDR4的DQ編號。
也就是上表LPDDR4那一行,從左到右去抄一下,也就是16057423。當然配置的時候需要補一個0x,即0x16057423。
圖4
那麼這是人工手動去梳理的方法,也就是人工將表1改為表2後,再去填入配置的方法。還是那句話,因為從圖2原理圖設計上看,我們X100那邊不需要去管,只需要看LPDDR那邊,所以直接能從表1就推導出配置才是我們最需要的。
三、
好,現在我們來看下這個填入數據的規律,我們拋去0x這個不管,其實我們填入0x16057423中的有效數據就是16057423(註意,這個數沒有0x了,我們需要認為他是十進位數,可以念一下,是1千6百零五萬,7千4百二十三)。
因為它是十進位,所以我們可以發現:
16057423
=1*10000000 + 6*1000000 + 0*100000 + 5*10000 + 7*1000 + 4*100 + 2*10 + 3*1
=1*10^7 + 6*10^6 + 0*10^5 + 5*10^4 + 7*10^3 + 4*10^2 + 2*10^1 + 3*10^0
那麼我們發現,我們從DDR顆粒角度來看,我們只需要按DQ0~DQ7的順序知道對應的X100的DQ是多少就可以。之後,用DDR的DQ值*10的X100的DQ次方,之後再累加就好了。
所以就有了這麼一個工具,我們把LPDDR4這部分電路的接線填入軟體,它就可以算出來需要怎麼交換。
它的計算方法就如上面所說:
0*10^5 + 1*10^7 + 2*10^1 + 3*10^0 + 4*10^2 + 5*10^4 + 6*10^6 + 7*10^3
=0*10^(5%8) + 1*10^(7%8) + 2*10^(1%8) + 3*10^(0%8) + 4*10^(2%8) + 5*10^(4%8) + 6*10^(6%8) + 7*10^(3%8)
=16057423
前面補0x後=0x16057423
之所以這裡都除8取餘,是因為slice0是0~7的,slice1可是8~15呢,那計算的時候可不能*10的8次方或者*10的15次方吧。
四、
Slice的交換演算法也一樣:
所以圖2硬體正確的配置為:
使用軟體計算得到的配置為:
結果一致,說明工具有效。
關鍵源碼:
procedure calc_sw(); var zdiv_value : integer; //z首碼代表是8bit組 mod_value : integer; i: Integer; sw_byte : integer; j: Integer; sw_dq : integer; sw_dq_str : string; begin sw_byte := 0; for i := 0 to 7 do begin zdiv_value := dq_x8x8[i][0] div 8; //這一組除以8,商的值就是這組的接的X100 slice //根據換算關係,就是商是幾,就把i這個數字寫到商位置 //那麼就是 i x 10^商 sw_byte := sw_byte + i * round(power(10,zdiv_value)); //use math , power出來是extended,需要round一下 sw_dq := 0; for j := 0 to 7 do begin mod_value := dq_x8x8[i][j] mod 8;//這一組除以8的餘數,餘數的值就是這組的接的X100的DQ //根據換算關係,就是餘數是幾,就把j這個數字寫到餘數位置 //那麼就是 j x 10^餘數 sw_dq := sw_dq + j * round(power(10,mod_value)); end; if sw_dq < 10000000 then //也就是首位為0,比如0x03571462,如果只用int進行數據處理,這個就會顯成0x3571462 begin sw_dq_str := '0' + inttostr(sw_dq); end else begin sw_dq_str := inttostr(sw_dq); end; case zdiv_value of 0 : mainform.edit_slice0.Text := '0x' + sw_dq_str; 1 : mainform.edit_slice1.Text := '0x' + sw_dq_str; 2 : mainform.edit_slice2.Text := '0x' + sw_dq_str; 3 : mainform.edit_slice3.Text := '0x' + sw_dq_str; 4 : mainform.edit_slice4.Text := '0x' + sw_dq_str; 5 : mainform.edit_slice5.Text := '0x' + sw_dq_str; 6 : mainform.edit_slice6.Text := '0x' + sw_dq_str; 7 : mainform.edit_slice7.Text := '0x' + sw_dq_str; end; end; mainform.edit_byte.Text := '0x' + inttostr(sw_byte); end;
==工具下載地址==
點擊直接下載:
百度網盤鏈接:
https://pan.baidu.com/s/1mCA01ibW95-TtpVn4INFsw?pwd=a0kd
歡迎飛騰愛好者加入微信交流群。
群內大家可以暢所欲言。
在群內不需要表露自己的公司和身份,可以群內交流遇到的問題,分享自己的調試心得。
希望大家共建飛騰友誼!
飛騰愛好者技術交流群碼公眾號“烏拉大喵喵”