WebM 項(xiàng)目 (www.webmproject.org) 定義了一種開放文件格式,用于在 Web 上分發(fā)壓縮媒體內(nèi)容。Google是 WebM 項(xiàng)目的主要貢獻(xiàn)者,最近著手設(shè)計(jì)和開發(fā)了第一個(gè)用于 WebM 的硬件解碼器 IP,也稱為 VP9 G2解碼器。利用這種免版稅的硬件 IP,開發(fā)多媒體片上系統(tǒng) (SoC) 設(shè)計(jì)的公司能夠?qū)崿F(xiàn)下一代性能和功率效率,在智能電視、平板電腦、移動(dòng)電話以及傳統(tǒng)個(gè)人計(jì)算機(jī)和筆記本電腦等消費(fèi)電子設(shè)備上實(shí)現(xiàn)高達(dá)4K (2160p 60FPS) 分辨率的播放效果。VP9 G2 IP 采用全新硬件架構(gòu)實(shí)現(xiàn),主要是用標(biāo)準(zhǔn) C++ 編碼和驗(yàn)證,并利用 Catapult High-Level Synthesis (HLS) 綜合為寄存器傳輸級(jí) (RTL) 邏輯,以支持不同的目標(biāo)技術(shù)和性能點(diǎn)。
本文介紹用于開發(fā) VP9 G2 硬件解碼器的 HLS 方法,并說明它如何支持實(shí)現(xiàn) WebM 項(xiàng)目的目標(biāo)和戰(zhàn)略。本文解釋了為什么HLS 方法令設(shè)計(jì)實(shí)現(xiàn)和驗(yàn)證比傳統(tǒng)RTL 設(shè)計(jì)流程快 50%,以及它如何讓不同最終產(chǎn)品的設(shè)計(jì)團(tuán)隊(duì)能夠協(xié)作并為同一 IP做出貢獻(xiàn)。
圖1. VP9 G2 解碼器硬件
本文還會(huì)介紹WebM 團(tuán)隊(duì)在成功實(shí)現(xiàn) G2 VP9 的過程中如何實(shí)際使用 Catapult HLS,并分享一些結(jié)果和感想。圖 1 顯示了該硬件,包括 HLS 生成的 RTL 模塊和手寫 RTL 模塊。順便提一下,該硬件大約有 200 萬門電路,采用 65 納米 TSMC 技術(shù),支持 4K (2160p) @ 60fps。
WEBM 項(xiàng)目與 G2 VP9
Google WebM 項(xiàng)目的主要目的是改善最終用戶的網(wǎng)絡(luò)視頻體驗(yàn)。用戶收到的視頻質(zhì)量在很大程度上取決于所使用的壓縮格式,但遺憾的是,與消費(fèi)者對(duì)在線視頻的期望相比,壓縮格式的發(fā)展慢如龜速。例如,高效視頻編碼標(biāo)準(zhǔn)(HEVC,也稱為 H.265)花了 10 年時(shí)間才從 H.264 發(fā)展出來。然后,IP 設(shè)計(jì)人員又花了 1 年時(shí)間編寫和驗(yàn)證 RTL,總共耗費(fèi) 11 年時(shí)間才推出一代可用硬件。
WebM 項(xiàng)目的目標(biāo)是大幅縮短編解碼器設(shè)計(jì)周期,并計(jì)劃每隔幾年更新一次開放格式視頻編解碼器。WebM 項(xiàng)目的主要好處是促進(jìn)硬件 IP 協(xié)作,加速創(chuàng)新,并加快部署新的和更好的視頻壓縮標(biāo)準(zhǔn)。在 WebM模型中,Google 為其半導(dǎo)體合作伙伴提供全功能基礎(chǔ) IP,鼓勵(lì)他們?cè)鰪?qiáng) IP 并與 Google 共享這些改進(jìn),使IP 迅速發(fā)展。
目前有十億多端點(diǎn)提供 VP9 解碼支持,包括 Chrome 瀏覽器、Android、FFmpeg 和 Firefox。通過WebM 網(wǎng)站可索取使用 Catapult C 開發(fā)的 VP9 硬件編碼器和解碼器。該網(wǎng)站包含有關(guān)編碼器和解碼器性能的詳細(xì)信息。
快速硬件創(chuàng)新的挑戰(zhàn)
在 VP9 G2 硬件項(xiàng)目即將開始時(shí),WebM 團(tuán)隊(duì)意識(shí)到需要一種新的硬件設(shè)計(jì)方法來支持快速創(chuàng)新。理想情況下,初始硬件和軟件將與技術(shù)規(guī)范在同一天交付,這意味著設(shè)計(jì)人員必須能夠隨著規(guī)范發(fā)展而輕松調(diào)整和更新代碼。
與前一代硬件相比,VP9 G2 視頻硬件的復(fù)雜度增加了一倍。這意味著仿真運(yùn)行時(shí)間會(huì)過于漫長,全部驗(yàn)證工作預(yù)計(jì)要花費(fèi)數(shù)月時(shí)間。另外,在這個(gè)特定領(lǐng)域中,測試向量的數(shù)量相當(dāng)巨大。復(fù)雜度的增加不僅會(huì)影響總驗(yàn)證時(shí)間,還會(huì)影響在合理時(shí)間范圍內(nèi)可以測試的內(nèi)容。采用 RTL 仿真時(shí),若不大幅增加測試資源,團(tuán)隊(duì)將無法達(dá)到所需的測試水平。
以不同產(chǎn)品或應(yīng)用為目標(biāo)的多個(gè)設(shè)計(jì)團(tuán)隊(duì)和公司會(huì)提出不同的 RTL 變更,合并這些變更也是不切合實(shí)際的。以 RTL 代碼編寫的 IP 包含一定程度的與實(shí)現(xiàn)相關(guān)的細(xì)節(jié),這會(huì)顯著降低 IP 的可復(fù)用性。如果設(shè)計(jì)人員想要針對(duì)不同的 ASIC 技術(shù)復(fù)用該代碼,或者以更高時(shí)鐘速度運(yùn)行,或者改變吞吐量,他們要么必須大幅重寫 RTL,要么就得接受次優(yōu)的功耗、性能或面積。
WebM 團(tuán)隊(duì)評(píng)估了若干較高抽象層次的工具流程,發(fā)現(xiàn) Catapult C 最符合其需求。
使用 C++ 相比使用 RTL 的優(yōu)勢
C++ 支持 Google
實(shí)現(xiàn)快速創(chuàng)新目標(biāo)
Innovation
基于 C 語言的 HLS 流程大大減輕了整體 RTL 驗(yàn)證工作,因?yàn)樗尮こ虉F(tuán)隊(duì)可以更迅速地測試源代碼的每項(xiàng)更改,并在不同的硬件和軟件團(tuán)隊(duì)之間共享代碼。源代碼中的低層實(shí)現(xiàn)細(xì)節(jié)越少,仿真、調(diào)試和修改的速度越快。更高的仿真性能意味著可以運(yùn)行更多測試以更充分地演練源代碼;利用行業(yè)標(biāo)準(zhǔn)工具來監(jiān)視和檢查測試集提供的功能覆蓋率。設(shè)計(jì)人員可以快速高效地修改并重新驗(yàn)證 C++ 模型來對(duì)備選算法和架構(gòu)執(zhí)行一系列假設(shè)評(píng)估,從而能夠基于實(shí)際功耗、性能和面積(而非理論估計(jì))來選擇最佳實(shí)現(xiàn)。
(向上滑動(dòng)查看細(xì)節(jié))
C++ 是大多數(shù)微電子工程師熟悉的語言,常用于硬件和軟件工程設(shè)計(jì)。C++ 描述代表了一種比 RTL 更抽象的編碼風(fēng)格,其給出的是算法和架構(gòu)的描述,而不是精確到每個(gè)周期的信號(hào)和寄存器行為。與 VHDL 和Verilog 的情況非常相似,C++ 有一個(gè)可綜合子集可用于建模和硬件設(shè)計(jì)。標(biāo)準(zhǔn) C++ 結(jié)構(gòu)體和方法的絕大部分都是可以使用的,只有少數(shù)例外,其依賴于底層軟件處理器架構(gòu)來執(zhí)行(例如 “malloc”),這在硬件實(shí)現(xiàn)中是沒有意義的。與 RTL 相比,可綜合 C++ 表示的代碼行數(shù)平均減少 80%,冗長細(xì)節(jié)的縮減使其對(duì)人類更有意義,調(diào)試也更容易、更快捷。類似的功能用C++ 仿真的速度要比用 RTL 快 50-1000 倍;當(dāng)設(shè)計(jì)和調(diào)試復(fù)雜硬件時(shí),使用 C++ 的硬件開發(fā)人員只需大約一半的時(shí)間。
C++ 模型常常被開發(fā)為黃金參考模型,硬件設(shè)計(jì)對(duì)照該模型進(jìn)行驗(yàn)證。這些參考模型用作硬件實(shí)現(xiàn)的起點(diǎn)。如果 C++ 模型本身是可綜合的,則可以避免手動(dòng)重寫入 RTL,軟件或算法工程師與硬件團(tuán)隊(duì)之間將能實(shí)現(xiàn)平滑交接。這會(huì)減少因?yàn)橐?guī)范模糊和誤讀而出錯(cuò)的機(jī)率。在硬件設(shè)計(jì)過程中,系統(tǒng)架構(gòu)師和硬件設(shè)計(jì)工程師均可使用相同的共享代碼庫。以這種方式共享可執(zhí)行代碼意味著概念易于傳達(dá),構(gòu)思不會(huì)有被誤解的風(fēng)險(xiǎn),并且從概念到實(shí)現(xiàn),所有人都可以共享并明確無誤地使用統(tǒng)一的規(guī)范。
在很多不同小組之間共享代碼還需要一個(gè)標(biāo)準(zhǔn)化環(huán)境。對(duì)用 C++ 建模的設(shè)計(jì)進(jìn)行功能驗(yàn)證時(shí),可以使用眾多行業(yè)標(biāo)準(zhǔn)編譯器和調(diào)試工具中的任何一個(gè),例如 gcc 或 MSVisual C++。還有許多其他工具可用于分析源代碼,對(duì)源代碼數(shù)據(jù)庫版本加以控制,以及合并來自多個(gè)開發(fā)人員的 C++ 更改。
對(duì)于 WebM 團(tuán)隊(duì)的硬件 IP 開發(fā),可在該 IP 仍處于開發(fā)階段時(shí),將 C++ 代碼和標(biāo)準(zhǔn)化開發(fā)環(huán)境與其 IP 合作
伙伴共享。反過來,合作伙伴在此過程中也能分享見解并糾正錯(cuò)誤,使得生產(chǎn)硬件幾乎可以在標(biāo)準(zhǔn)最終確定并發(fā)布的同時(shí)交付。
用 C++ 能夠準(zhǔn)確描述硬件的一個(gè)重要方面是使用比特精確數(shù)據(jù)類型,運(yùn)用 C++ 類庫可以在任何標(biāo)準(zhǔn) C++環(huán)境中執(zhí)行。其他硬件設(shè)計(jì)特性,如時(shí)鐘頻率、并行性、寄存器和組件共享以及許多其他微架構(gòu)細(xì)節(jié),均未寫入 C++ 代碼中。C++ 模型中僅描述了算法和功能行為。這意味著只需修改用于驅(qū)動(dòng)綜合工具的命令和約束,同一 C++ 表示便可輕松適用于不同的微架構(gòu)或性能點(diǎn)以及不同的實(shí)現(xiàn)技術(shù)(ASIC 和 FPGA)。
圖 2. G2 VP9 設(shè)計(jì)和驗(yàn)證流程
為了管理其第一個(gè) HLS 項(xiàng)目的風(fēng)險(xiǎn),WebM 團(tuán)隊(duì)決定將視頻解碼器的每個(gè)模塊作為一個(gè)單獨(dú)的項(xiàng)目來實(shí)現(xiàn)。該流程允許多個(gè)模塊由不同工程師并行優(yōu)化,而頂層互連模型則是手動(dòng)編寫。它還支持將 Catapult 用在能夠產(chǎn)生最大益處的地方,對(duì)算法模塊進(jìn)行一些必要的探索以確定最優(yōu)架構(gòu)。其他包含 SoC 集成關(guān)鍵部件(例如時(shí)鐘門控、SRAM 容器)的模塊則是用 RTL 實(shí)現(xiàn)。其結(jié)果便是圖 1 所示的硬件劃分,相應(yīng)的設(shè)計(jì)和驗(yàn)證流程如圖 2 所示。
WebM 工程師需要接受培訓(xùn)才能使用 HLS,但他們很快意識(shí)到,用 C++ 編寫與用 VHDL 或 Verilog 編寫具有相同的“體驗(yàn)”。就像用 RTL 一樣,設(shè)計(jì)人員首先需要可視化其想要構(gòu)建的硬件,然后以該硬件為目標(biāo)來編寫代碼。要學(xué)習(xí)的主要內(nèi)容是編寫什么樣的 C++ 代碼。
通過轉(zhuǎn)向使用 C++ 的 HLS 流程來開發(fā) VP9 G2 硬件,團(tuán)隊(duì)獲得了以下好處:
1. 一個(gè)包含 14 個(gè)模塊設(shè)計(jì)的總代碼行數(shù)約為 69,000。硬件設(shè)計(jì)團(tuán)隊(duì)估計(jì),要描述相同的模塊,基于 RTL的方法將需要大約 300,000 行代碼。
2. C++ 仿真運(yùn)行比 RTL 快 50 多倍。這大大減少了驗(yàn)證工作的跟蹤需求,開發(fā)人員可以整天編寫代碼,晚上離開后開始進(jìn)行回歸處理,第二天早上獲得套件中每項(xiàng)測試的結(jié)果。
3. 使用 C++ 實(shí)現(xiàn)了 IP 協(xié)作,允許多個(gè)貢獻(xiàn)者共享對(duì)同一文件的改進(jìn),并支持標(biāo)準(zhǔn)工具和流程來合并更改。
4. HLS 可以在大約一個(gè)小時(shí)內(nèi)處理完每個(gè)模塊。因此,通過修改 C 代碼或改變工具的約束,可以快速完成對(duì)模塊不同架構(gòu)的探索。設(shè)計(jì)和驗(yàn)證硬件的總工作量大約為六個(gè)月,而用 RTL 手動(dòng)編寫代碼預(yù)計(jì)需要一年。
使用 CATAPULT HLS 流程
實(shí)現(xiàn) G2 VP9 解碼器 IP 的示例
幀間預(yù)測模塊是 VP9 硬件中最復(fù)雜的部分之一。如圖 1 顯示,它是幀間/幀內(nèi)預(yù)測模塊的一部分。該模塊負(fù)責(zé)計(jì)算連續(xù)視頻幀之間的像素預(yù)測值。
圖 3. 幀間預(yù)測模塊的高層次框圖
如圖 3 所示,幀間預(yù)測模塊中有八個(gè)進(jìn)程。該模塊以三種方式進(jìn)行控制。首先,使用存儲(chǔ)器映射寄存器配置該模塊。其次,將命令流發(fā)送到控制進(jìn)程,然后控制進(jìn)程向幀內(nèi)預(yù)測模塊中的核心引擎發(fā)出命令。
還有一個(gè)單獨(dú)的預(yù)取控制進(jìn)程會(huì)監(jiān)視設(shè)計(jì)中參考存儲(chǔ)器的狀態(tài),并預(yù)取新數(shù)據(jù)。最后,使用流控制握手功能將數(shù)據(jù)流送到“寫入?yún)⒖即鎯?chǔ)器”(Write Ref Mem) 進(jìn)程。
一旦參考存儲(chǔ)器中有足夠的存儲(chǔ)器可用,該架構(gòu)便允許幀間預(yù)測模塊預(yù)取數(shù)據(jù)。然后在正向和反向預(yù)測數(shù)據(jù)合并為一個(gè)輸出流之前,控制核心 Ref 和 Pred 引擎盡可能快地處理數(shù)據(jù)。幀間預(yù)測模塊隨后將數(shù)據(jù)和命令轉(zhuǎn)發(fā)到子系統(tǒng)中的下一模塊,即去塊濾波器。
在硬件中,各模塊必須并行運(yùn)行,速率常常不同。但是,源代碼是順序 C++,因此使用算法 C (AC) ac_channel數(shù)據(jù)類型來模擬模塊之間的并行性和不同速率。以下代碼是幀間預(yù)測模塊的頂層源代碼的簡化版本。
幀間預(yù)測模塊大約有 8000 行 C++ 代碼,包括所有相關(guān)的頭文件。設(shè)計(jì)的結(jié)構(gòu)使用 ac_channel 和函數(shù)調(diào)用來描述,然后將每個(gè)函數(shù)映射到進(jìn)程或其他級(jí)別的層次結(jié)構(gòu)。ac_channel 的方向取決于 C 代碼中如何使用它,Catapult 檢查每個(gè)通道只有一個(gè)進(jìn)程寫入。
在 C++ 仿真中,ac_channel 是一個(gè)無限深度的 FIFO,支持簡單的分層子系統(tǒng)仿真,就好像函數(shù)并行運(yùn)行一樣。然后在用 C++ 編寫的完整子系統(tǒng)內(nèi)部仿真源代碼,以確認(rèn)硬件和軟件都正常工作。為了測試該模塊,每個(gè)函數(shù)調(diào)用都包含一個(gè)循環(huán),其迭代到所有輸入數(shù)據(jù)都消耗完畢為止。
接下來,pred_inter 函數(shù)被綜合為 RTL。在綜合期間,函數(shù)轉(zhuǎn)換為模塊之間具有固定深度 FIFO 的并行進(jìn)程。Catapult 為 RTL 生成 SystemC 封裝器,以便可以使用原始測試環(huán)境來確認(rèn) RTL 是否正常運(yùn)行。
然后,pred_inter 的 RTL 需要與其他生成的 RTL 模塊集成,如圖 2 所示。對(duì)于 VP9,這種集成是在 Verilog中手動(dòng)完成。圖 1 顯示了此子系統(tǒng)中的模塊以及用來連接它們的手工編碼 FIFO。然后運(yùn)行該子系統(tǒng),使用的仿真向量與測試原始可綜合 C++ 子系統(tǒng)所用的向量相同。
最后將 RTL 用于 FPGA 進(jìn)行原型開發(fā),或用于 ASIC 以完成最終實(shí)現(xiàn)。對(duì)于這兩個(gè)目標(biāo),C++ 代碼相同,因此 FPGA 原型開發(fā)可以輕松完成而不會(huì)犧牲最終 ASIC 實(shí)現(xiàn)的質(zhì)量。
與 VP9 子系統(tǒng)的其余部分一樣,該模塊最初僅針對(duì) VP9 開發(fā),然后做了改進(jìn)以支持 H.265。根據(jù)編譯時(shí)轉(zhuǎn)換,可以將整個(gè)子系統(tǒng)重新配置和重新優(yōu)化為僅支持 VP9 或同時(shí)支持 VP9 與 H.265。
總結(jié)和結(jié)語
Catapult
與許多前沿硬件設(shè)計(jì)團(tuán)隊(duì)一樣,WebM 硬件團(tuán)隊(duì)需要找到更好的辦法來構(gòu)建硬件。驗(yàn)證預(yù)計(jì)要占開發(fā)工作量的相當(dāng)大一部分,而且硬件難以復(fù)用。最重要的是,這意味著團(tuán)隊(duì)沒有足夠的時(shí)間去構(gòu)建最小、最快、功率效率最高的硬件。
現(xiàn)在,Google 工程師已完成第一個(gè)項(xiàng)目,他們學(xué)會(huì)了在編寫可綜合 C++ 的同時(shí)“看見硬件”。他們還學(xué)會(huì)了為特定類型的硬件編寫什么樣的代碼。
-
模塊
+關(guān)注
關(guān)注
7文章
2721瀏覽量
47567 -
編譯
+關(guān)注
關(guān)注
0文章
659瀏覽量
32908 -
C代碼
+關(guān)注
關(guān)注
1文章
89瀏覽量
14321
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論