隨著5G 國(guó)際標(biāo)準(zhǔn)的出爐,Polar碼順利入選控制信道編碼方案,世界上各大通信設(shè)備生產(chǎn)商便開始基于標(biāo)準(zhǔn)設(shè)計(jì)基站和終端產(chǎn)品。
我們明白,從純算法到實(shí)現(xiàn)工程化,中間還有很長(zhǎng)一段路要走。一方面,我們需要保證算法的性能良好;另一方面,便于硬件實(shí)現(xiàn)。本文將從Polar碼編碼角度,介紹Xilinx的Polar Encoder/Decoder IP核的使用方法。
按理說(shuō),我們應(yīng)該分析Polar碼的編碼原理和算法構(gòu)造,然而,專業(yè)性實(shí)在太強(qiáng),定義、定理和公式及推導(dǎo),以及算法性能比較及硬件實(shí)現(xiàn)方案,足夠?qū)懗鲆黄T士論文,甚至博士論文。因此,筆者不打算詳細(xì)講,包括里面的詳細(xì)推導(dǎo)也需要花很長(zhǎng)的時(shí)間,有興趣研究這個(gè)方向的同學(xué),可以多找?guī)灼|(zhì)量較好的論文研讀。
目前也有一些碩博論文在研究和實(shí)現(xiàn)Polar編、譯碼,相信今后一段時(shí)期,還會(huì)有相關(guān)的研究成果問(wèn)世。因此,若你還未走出象牙塔,擁有足夠的時(shí)間去探索,去發(fā)現(xiàn)不一樣的東西。若已經(jīng)在工作崗位上,并正從事相關(guān)的研究設(shè)計(jì)工作,那么,筆者很樂(lè)意請(qǐng)教交流。比如,在開發(fā)過(guò)程中,會(huì)遇到哪些坑,有哪些需要注意,提高工作效率和縮短開發(fā)周期。
本文是筆者的一個(gè)學(xué)習(xí)筆記,主要是利用Xilinx公司的Polar IP核進(jìn)行應(yīng)用開發(fā),并介紹MATLAB軟件中的關(guān)于Polar編碼的函數(shù)。
由于所用的IP手冊(cè)通常是需要購(gòu)買了Xilinx公司或第三方廠家的IP 核才會(huì)提供相關(guān)的文件資料,因此,想獲取公開的關(guān)于5G信道編碼的IP核資料比較難。
先介紹干貨,關(guān)于資料的問(wèn)題,在后面談。
Polar IP介紹
Xilinx提供的Polar Encoder/Decoder IP v1.0支持Polar編碼和譯碼。Polar碼可配置,基于逐塊使用。關(guān)于該IP的詳細(xì)介紹,可參考文獻(xiàn)[1]-[2],本節(jié)做簡(jiǎn)要介紹。該IP支持的器件:UltraScale、UltraScale+和7系列。注意,在本文中,塊是由編碼器或解碼器處理的數(shù)據(jù)基元單元的通稱。碼字是已編碼塊的特定形式,在討論用于生成它的代碼參數(shù)時(shí)使用。
根據(jù)IP產(chǎn)品指南,Polar Enocder/Decoder IP核,在400MHz時(shí)鐘頻率下,最高吞吐量如下:
Polar解碼器:>80Mb/s(N=1024,K=200)
Polar編碼器:>700Mb/s( N=1024,K=200)
這里,K是輸入信息bit長(zhǎng)度,N是輸出碼字長(zhǎng)度。
前向糾錯(cuò)(FEC)碼(例如Polar碼)提供了一種方法去檢測(cè)核識(shí)別糾正不可靠或嘈雜通信信道上的數(shù)據(jù)傳輸錯(cuò)誤。根據(jù)5G NR物理層協(xié)議,Polar碼的編碼過(guò)程,如圖所示。
前級(jí)的傳輸塊信息bit,插入CRC校驗(yàn),下行鏈路還需插入交織,奇偶校驗(yàn)及凍結(jié)bit插入(非必須),再送入編碼器進(jìn)行編碼。
特性總結(jié):
Polar Encoder/Decoder IP核是一個(gè)高度靈活的軟判決實(shí)現(xiàn)為Polar碼提供以下特性。
Decoder執(zhí)行列表大小為8的串行抵消列表(SCL)解碼,根據(jù)3GPP TS 38.212 V15.1.1,通過(guò)奇偶校驗(yàn)和/或CRC比特來(lái)增加比特。
能夠基于逐塊或傳輸指定輸入和輸出數(shù)目。
?通過(guò)AXI-Lite接口最高支持配置128個(gè)代碼。
?逐塊選擇代碼。
碼字大小從N = 32到N = 1024,K從2到N,交織時(shí)Kmax為140。
作為編碼器,內(nèi)核接受K?bit信息,并輸出N個(gè)編碼bit。作為一個(gè)解碼器,內(nèi)核接受N個(gè)軟值對(duì)數(shù)似然比(LLR),并輸出K個(gè)硬判決bit。
解碼器接受8bit軟值LLR輸入,并假設(shè)飽和對(duì)稱。
僅支持按順序塊執(zhí)行。
?輸入輸出寬數(shù)據(jù)接口。
單獨(dú)的輸入和輸出流允許提供控制參數(shù)和狀態(tài)逐塊地進(jìn)行。
應(yīng)用領(lǐng)域:
例如5G無(wú)線,參考3GPP TS 38.212 V15.1.1 Multiplexing and channel coding(Release 15),支持DCI、UCI、和BCH。Polar使用模式設(shè)置,如下表所示。
注意,這個(gè)表很重要,很重要,特別是對(duì)于使用該IP核進(jìn)行應(yīng)用開發(fā)的朋友而言。
產(chǎn)品規(guī)格
Polar編碼器/解碼器Core的框圖如圖所示:
該Core使用AXI接口。AXI4-Lite存儲(chǔ)器映射總線用于參數(shù)(例如Polar碼定義)持續(xù)緩存多個(gè)塊,AXI4-Stream接口用于逐個(gè)樣本提供數(shù)據(jù)(例如,DIN)基于逐塊的配置(例如,CTRL)。這些接口處理提供數(shù)據(jù)外,還提供握手信號(hào)。
每個(gè)塊通過(guò)數(shù)據(jù)輸入接口(DIN)在多個(gè)周期內(nèi)輸入。在每個(gè)周期中傳輸?shù)臄?shù)據(jù)率由一個(gè)單獨(dú)的數(shù)據(jù)流(DIN_WORDS)來(lái)設(shè)置,其中DIN上的每個(gè)事務(wù)都有一個(gè)值。輸出是以類似的方式在DOUT輸出流上生成,在輸入數(shù)據(jù)流DOUT_WORDS上指定了傳輸?shù)臄?shù)據(jù)量。
對(duì)于每個(gè)塊,在控制(CTRL)輸入流上需要一個(gè)輸入,指定要使用的代碼和用戶提供的ID字段。每個(gè)數(shù)據(jù)塊需要一個(gè)控制字,數(shù)據(jù)輸入暫停,直到相關(guān)的控制字可用為止。當(dāng)解碼(或編碼)時(shí),DOUT接口輸出數(shù)據(jù)伴隨著狀態(tài)(STATUS)輸出接口上的狀態(tài)字一起輸出。
該圖包含了非常豐富的信息,對(duì)于從事IC設(shè)計(jì)或FPGA開發(fā)的朋友來(lái)說(shuō),這樣的框圖看到過(guò)太多太多,我們?cè)谡撐睦锘蛘咴O(shè)計(jì)報(bào)告里,經(jīng)過(guò)要這樣畫一個(gè)框圖。
這里面包含了接口、內(nèi)部功能單元及必要的圖注。通常,箭頭方向指明數(shù)據(jù)流向,左邊是輸入端口,右邊是輸出端口,但不是絕對(duì)。
為便于集成和操作,IP核通常采用業(yè)界標(biāo)準(zhǔn)接口,例如上圖中給出的AXI4-Stream、AXI4-Lite等。
所有AXI4-Sream接口包含用于流控的valid 和ready握手。上圖中,數(shù)據(jù)依賴關(guān)系,如下圖所示。
根據(jù)圖示可知,輸入DIN上數(shù)據(jù)輸入依賴于CTRL和DIN_WORDS,DOUT輸出的數(shù)據(jù)依賴于內(nèi)部解碼器輸出和DOUT_WORDS。CTRL的輸入與DIN_WORDS的相關(guān)輸入之間存在延時(shí),并且DIN被接受,需要通過(guò)通道上的tready來(lái)斷言。同樣,DIN_WORDS與DIN也存在延時(shí)。如果要最小化DIN上的延時(shí),那么CTRL和DIN_WORDS應(yīng)該提前提供。同樣,在輸出端,為了避免輸出DOUT延遲,若有必要,應(yīng)該盡早驅(qū)動(dòng)DOUT_WORDS。接口有淺緩存,在CTRL上提供相關(guān)的塊控制之前,DIN和DIN_WORDS上在允許輸入少量數(shù)據(jù)。
當(dāng)我們拿到這樣的IP指南時(shí),首先就要先看看這個(gè)IP能夠?qū)崿F(xiàn)什么功能,適用于哪種協(xié)議或標(biāo)準(zhǔn),IP核端口及信號(hào)定義,以及重要的注釋信息。
對(duì)于通用的FIFO、RAM等,會(huì)用即可。難點(diǎn)在于根據(jù)某些標(biāo)準(zhǔn)協(xié)議或算法而有針對(duì)性開發(fā)的IP核,通常應(yīng)用起來(lái)也要花一些時(shí)間去看文檔,并了解背后的協(xié)議和算法。例如,對(duì)于應(yīng)用于5G信道編譯碼的Polar IP和LDPC IP,涉及標(biāo)準(zhǔn)協(xié)議和一系列參數(shù)配置,并不像使用一個(gè)FIFO那樣簡(jiǎn)單。
更多關(guān)于端口描述和寄存器空間的內(nèi)容,請(qǐng)參閱參考文獻(xiàn)[2]。這里不再占用篇幅和時(shí)間碼字了。
Polar Encoder IP應(yīng)用
本節(jié)內(nèi)容,是大家最為關(guān)心的,拿到資料后,我們初步了解了這個(gè)IP是干嘛的,有什么特性,有哪些端口,如何利用該IP進(jìn)行設(shè)計(jì),流程是什么,怎么仿真驗(yàn)證。
這里,假設(shè)你已經(jīng)看完了產(chǎn)品指南的資料,你已經(jīng)迫不及待準(zhǔn)備開始動(dòng)手了。
然而,你卻迷惑了:我有Polar 編解碼 IP的license嗎?我該用哪個(gè)版本的Vivado設(shè)計(jì)套件?我如何去寫一個(gè)testbench來(lái)驗(yàn)證,我的參考模型在哪里?
關(guān)于Polar IP license的問(wèn)題,解決辦法有兩個(gè):
(1)若你已經(jīng)入職,那么找你項(xiàng)目組的負(fù)責(zé)人,他會(huì)想辦法去購(gòu)買,買回來(lái)就可以用了;
(2)若你還在求學(xué),然而導(dǎo)師想讓你研究Polar碼,要自己動(dòng)手去進(jìn)行硬件實(shí)現(xiàn),你想找個(gè)參考和性能對(duì)比對(duì)象,然鵝沒(méi)有足夠的資金去購(gòu)買一個(gè)IP,并且很不值得,那么你可以去Xilinx官網(wǎng)申請(qǐng)一個(gè)評(píng)估版的license進(jìn)行試用。
然后進(jìn)去申請(qǐng)一個(gè)免費(fèi)的評(píng)估license,可以搜索你想申請(qǐng)的license。一般需要你注冊(cè),并且提前準(zhǔn)備好你主機(jī)的MAC地址,以備填寫信息所用。
關(guān)于Vivado設(shè)計(jì)套件版本的問(wèn)題,看哪個(gè)版本支持5G等開發(fā)就用哪個(gè),筆者用的是Vivado2018.3。
關(guān)于如何寫testbench的問(wèn)題,這個(gè)問(wèn)題確實(shí)很重要,也有很多參考書和博客在比較詳細(xì)的介紹。前面的文章《SystemVerilog與功能驗(yàn)證方法學(xué)》提到過(guò)關(guān)于testbench驗(yàn)證平臺(tái)的問(wèn)題。我們要注意的是,測(cè)試激勵(lì)的產(chǎn)生以及對(duì)DUT輸出結(jié)果的檢測(cè)。首先為DUT提供輸入信號(hào),用邏輯和存儲(chǔ)文件產(chǎn)生必要的信號(hào);其次,要注意各端口測(cè)試激勵(lì)的時(shí)序關(guān)系,應(yīng)根據(jù)DUT的需求進(jìn)行設(shè)計(jì);最后,對(duì)于DUT的輸出,我們可以進(jìn)行寫文件操作,保留仿真產(chǎn)生的結(jié)果,便于數(shù)據(jù)分析。
對(duì)于參考模型,我們常用的就是MATLAB鏈路算法模型。例如對(duì)于Polar的編碼,MATLAB中提供了庫(kù)函數(shù)nrPolarEncode,該函數(shù)是根據(jù)5G NR標(biāo)準(zhǔn)協(xié)議編寫的,可直接調(diào)用。
萬(wàn)事俱備,只欠東風(fēng)。我們把申請(qǐng)好的license加入到license管理器中對(duì)應(yīng)的路徑后,更新確認(rèn)是否可用。
新建一個(gè)工程,通過(guò)Vivado的IP目錄,我們輕松找到Polar IP核:
然后進(jìn)行簡(jiǎn)單的配置,例如選擇進(jìn)行編碼,存儲(chǔ)資源類型可以選DRAM或BRAM?!癘K”后導(dǎo)出IP核,綜合方式可以選全局或者OOC,默認(rèn)是OOC方式。
然后我們將IP的例化文件復(fù)制粘貼到工程的v文件中,并定義好集成的模塊名。
當(dāng)我們例化好IP 核后,將必要的input和output 端口通過(guò)頂層文件進(jìn)行定義。
接下來(lái),就著手編寫testbench了。當(dāng)你不知道怎樣去寫一個(gè)令人滿意的驗(yàn)證IP 的testbench時(shí),你可以在IP sources欄,選擇該IP,右鍵去選擇“Open IP Example Design”打開IP的例程,查看例程的testbench是怎樣寫的,并且可以直接進(jìn)行仿真。當(dāng)然,你也可以自己編寫一個(gè)testbench。
?
跑個(gè)例程是很簡(jiǎn)單,然鵝,你的目標(biāo)可不是跑個(gè)例程就結(jié)束了。
這里在應(yīng)用Polar 編解碼IP核時(shí),最重要的是什么呢?其實(shí)是根據(jù)實(shí)際情況去配置參數(shù)寄存器。
當(dāng)時(shí)筆者也是沒(méi)搞懂這個(gè)寄存器到底應(yīng)該怎樣去配置,才能得到想要的結(jié)果,每次以為已經(jīng)按照指南操作了,可是編碼結(jié)果就是和MATLAB中的結(jié)果對(duì)不上,對(duì)不上,你絕望嗎?
沒(méi)錯(cuò),筆者要說(shuō)的就是下面這個(gè)寄存器空間。
當(dāng)仔細(xì)看完IP指南后,筆者還是很懵的。直到嘗試了好幾天,才終于搞定了。期間,甚至去Xilinx論壇提問(wèn)了,當(dāng)我已解決后的某個(gè)周末,論壇回郵件了。當(dāng)然我只是問(wèn)了一個(gè)不是最重要的問(wèn)題,而是一個(gè)非常普通的不算是問(wèn)題的問(wèn)題,因?yàn)橹改侠锲鋵?shí)已經(jīng)說(shuō)了,只是當(dāng)時(shí)已經(jīng)懷疑自我了。
在指南里,上面這個(gè)表的每一個(gè)地址及對(duì)應(yīng)的配置參數(shù),都有說(shuō)明,然鵝,當(dāng)你看到上表的最后一行,你會(huì)很困惑:這個(gè)位分配表我哪里知道?!
當(dāng)初筆者天真的以為,假如按照輸出的碼字全是信息bit,自己去造一個(gè)位分配表,然鵝,還是太年輕。
仿真過(guò)幾次,不對(duì)啊。
然后又去Xilinx官網(wǎng)找資料,找到了參考文獻(xiàn)[3],并且通過(guò)文中的連接,獲取了一份重要的C模型和MATLAB模型的代碼,這個(gè)文檔就是介紹如何去造位分配表。而C模型和MATLAB代碼,正是在下苦苦尋找的位分配表的產(chǎn)生來(lái)源。
要說(shuō),這個(gè)位分配表,是依據(jù)協(xié)議來(lái)產(chǎn)生的,IP核利用了寄存器映射,指明輸出碼字每一位的類型:凍結(jié)位、信息位、CRC位、奇偶校驗(yàn)位。
依據(jù)這個(gè)MATLAB代碼,筆者根據(jù)實(shí)際參數(shù)進(jìn)行配置,然后產(chǎn)生了位分配表,再把這個(gè)表寫入MIF文件,通過(guò)testbench讀取并寫入IP核的參數(shù)總線。最后,編碼輸出的結(jié)果終于和MATLAB對(duì)上了!
注意,MATLAB的版本最好是2019a/b及以上。
對(duì)比結(jié)果就不貼圖了,本來(lái)這篇水文是不能寫出來(lái)的,在不涉密的情況下,我只能這么水水的描述一下,以饗讀者。
在整個(gè)Polar Encoder/Decoder IP核的開發(fā)應(yīng)用中,需要注意以下幾點(diǎn):
(1)確定參數(shù)配置方式,最好采用可編程方式配置;
(2)對(duì)于DIN_WORDS、CTRL、STATUS、DOUT_WORDS端口輸入,要結(jié)合前文提到的數(shù)據(jù)接口依賴關(guān)系;
(3)對(duì)于不同的信道(如PBCH,PDCCH),IP核的配置不太一樣,仔細(xì)看IP指南和本文提到的很重要很重要的那個(gè)圖表。
如果你有足夠的時(shí)間,完全可以自己動(dòng)手去開發(fā)一個(gè)Polar IP核,掛在網(wǎng)上,說(shuō)不定可以賣出好價(jià)錢。
今天就到此為止,本文介紹得不是很詳細(xì),但筆者遇到的那些坑,基本上指出來(lái)了,希望對(duì)讀者朋友有幫助。
審核編輯:劉清
?
評(píng)論
查看更多