飛騰愛好者技術交流群碼
公眾號“烏拉大喵喵”
顆粒線序配置輔助工具
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
歡迎飛騰愛好者加入微信交流群,
群內大家可以暢所欲言,
在群內不需要表露自己的公司和身份,可以群內交流遇到的問題,分享自己的除錯心得,
希望大家共建飛騰友誼!
飛騰愛好者技術交流群碼
公眾號“烏拉大喵喵”
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/551023.html
標籤:其他
上一篇:手動拷貝檔案至nextcloud中并掃描(docker)
下一篇:返回列表
