用FPGA 技術(shù)更新傳統(tǒng)系統(tǒng)是許多嵌入式系統(tǒng)設(shè)計(jì)人員都知道的場(chǎng)景。但現(xiàn)有設(shè)計(jì)確實(shí)需要更新,這其中就包括連接互聯(lián)網(wǎng)、 IoT等。當(dāng)然,我們也需要進(jìn)一步增強(qiáng)安全性。尤其考慮到目前人們熱衷于人工智能,大家對(duì)深度學(xué)習(xí)推理或機(jī)器視覺(jué)又有了新的需求。
盡管現(xiàn)在已將系統(tǒng)整合至物聯(lián)網(wǎng),但仍然面臨一個(gè)迫在眉睫的問(wèn)題——這些更改將對(duì)系統(tǒng)硬件造成影響。直接使用 CPU 可以緩解所有的問(wèn)題(圖 1)。但對(duì)于小型嵌入式設(shè)計(jì)(一開(kāi)始就只有一英寸的小外形)來(lái)說(shuō),由于存在成本、功耗和散熱方面的限制,這種蠻力法可能行不通。此時(shí),必須采用 FPGA 方法。
圖1.更新傳統(tǒng)系統(tǒng)可能需要采用新的方法來(lái)提升計(jì)算能力
事實(shí)上,系統(tǒng)中通常有一個(gè)老舊的小型 FPGA 負(fù)責(zé)執(zhí)行實(shí)用工作:充當(dāng)端口擴(kuò)展器或設(shè)備控制器。然而,現(xiàn)在的低端 FPGA 可以充當(dāng)硬件加速器,將新的計(jì)算要求拉回至現(xiàn)有系統(tǒng)處理器范圍之內(nèi)。
采取下一步行動(dòng)
我們需要采取進(jìn)一步行動(dòng),考慮將系統(tǒng)(或子系統(tǒng))的 CPU 或微控制器單元 (MCU) 也整合到 FPGA 中是否可行?顯而易見(jiàn),答案是“當(dāng)然不可行”。眾所周知,F(xiàn)PGA 中的軟 CPU 內(nèi)核尺寸大、速度慢、價(jià)格貴。除了對(duì)于重要的嵌入式系統(tǒng)來(lái)說(shuō),這些概括性說(shuō)法都不對(duì)。
我們不是在討論擁有強(qiáng)大 CPU 性能的系統(tǒng)。(比如 Arm* Cortex*-A53 內(nèi)核集群。)在硬件中包含此類 CPU 集群的中端 FPGA,但該主題不在本文介紹范圍之內(nèi)。今天我們討論的是處理器適用范圍更廣的系統(tǒng)(或總體設(shè)計(jì)中的子系統(tǒng)):微控制器中的 Cortex-M 級(jí)內(nèi)核,或真正的傳統(tǒng) CPU,如 68000。通常情況下,這種老舊處理器不適用于系統(tǒng)設(shè)計(jì),因?yàn)樗鼈兪冀K不愿意接觸古老、文檔不完整的代碼,直至最后生命周期結(jié)束被迫淘汰。我們要介紹的是,通??梢詫⑦@種小型或老舊 CPU 整合至低端 FPGA 中(圖 2)。
圖 2.小型現(xiàn)代 FPGA 可以吸收舊設(shè)計(jì)中所有的傳統(tǒng)處理器
“芯”起點(diǎn)在哪兒?
如果您有用 C 或 C++(最好是通過(guò)原始測(cè)試工作臺(tái))編寫的文檔化源代碼,那么情況將對(duì)您非常有利。您可以從適用于在 FPGA 中進(jìn)行軟實(shí)施的整個(gè) CPU 內(nèi)核選項(xiàng)中進(jìn)行選擇。然后,還可以針對(duì)所選的 CPU 重新編譯并測(cè)試代碼。
遺憾的是,測(cè)試結(jié)果并不總是樂(lè)觀的。過(guò)去,微處理器的編譯器并不總是適合嵌入式設(shè)計(jì),尤其是對(duì)于存在實(shí)時(shí)限制的子系統(tǒng)。老代碼或保守型工程師編寫的代碼,可能完全是用匯編語(yǔ)言編寫的?,F(xiàn)代代碼主要是用 C 語(yǔ)言編寫的,其中關(guān)鍵例程用匯編語(yǔ)言手動(dòng)編寫。無(wú)論采用哪種語(yǔ)言編寫,都至少會(huì)有一部分代碼鎖定在特定的指令集架構(gòu)中。
其次,需要謹(jǐn)慎考慮硬件獨(dú)立性程度,不是語(yǔ)言方面,而是編碼風(fēng)格方面。在過(guò)去節(jié)省代碼空間和縮短延遲至關(guān)重要的時(shí)候,往應(yīng)用代碼中嵌入中斷處理程序、驅(qū)動(dòng)程序和物理 I/O 地址等不良實(shí)踐通常被認(rèn)為是明智之舉,這些做法會(huì)加大移植到新硬件的難度。過(guò)去,一些極其糟糕的想法,比如編寫時(shí)序依賴型代碼,通常被認(rèn)為更加明智。這種代碼可能需要重新編寫,才能在快速的現(xiàn)代硬件上運(yùn)行。但即使存在匯編語(yǔ)言源代碼和不合時(shí)宜的編碼風(fēng)格,我們?nèi)匀豢梢圆捎脤?shí)際方法將傳統(tǒng)模塊整合到 FPGA 中。
第一種方法是,如果 CPU 的確非常老舊,則使用開(kāi)源寄存器傳輸級(jí) (RTL) 模型在 FPGA 中重新實(shí)施傳統(tǒng)微處理器或微控制器。Github 等資源擁有許多用于傳統(tǒng)處理器(包括 6502、Z80、6809、68000 和 8086)的 Verilog 模型。但在這些內(nèi)核中進(jìn)行設(shè)計(jì)之前,必須考慮幾個(gè)問(wèn)題。
第一個(gè)問(wèn)題是合法性。因?yàn)?Verilog 可用并不意味著您擁有在商業(yè)產(chǎn)品中使用該設(shè)計(jì)的合法權(quán)利。有一些模型是研究人員和業(yè)余愛(ài)好者編寫的,沒(méi)有考慮到知識(shí)產(chǎn)權(quán)。因此,很久之前的一些架構(gòu)可能實(shí)際上位于公共域中。
另一個(gè)問(wèn)題是作者的意圖。例如:Verilog 是架構(gòu)的近似功能描述。它的目的是僅在模擬中執(zhí)行代碼,還是封裝在用戶控件邏輯和 I/O 中?或者,該模型是否包含進(jìn)入微處理器芯片的其他所有硬件?您必須匹配 Verilog 模型的特性和傳統(tǒng)系統(tǒng)的需求,否則將要花費(fèi)大量的時(shí)間來(lái)了解舊芯片的劣勢(shì)。
接下來(lái)就是一些令人傷神的細(xì)節(jié)問(wèn)題。SiFive 產(chǎn)品經(jīng)理 Jack Kang 指出,與現(xiàn)代 CPU 一樣,傳統(tǒng) CPU 也在整個(gè)產(chǎn)品生命周期中經(jīng)歷了多次修改,每次修改都會(huì)糾正一些錯(cuò)誤或劣勢(shì)。Verilog 代表哪個(gè)版本?或者它是一個(gè)理想化版本,代表著作者假定芯片怎樣正常運(yùn)行的方式?最后是設(shè)計(jì)師的謹(jǐn)慎程度。該模型是否按照實(shí)際傳統(tǒng)芯片一個(gè)循環(huán)接一個(gè)循環(huán)地運(yùn)行?是否啟動(dòng)了您需要使用的操作系統(tǒng)?是否成功合成過(guò)?
如果 Verilog 模型無(wú)法正常運(yùn)行,還有另一個(gè)選擇。老舊的 CPU 速度非常慢,以致于在當(dāng)前 FPGA 中的微小現(xiàn)代 RISC 內(nèi)核上運(yùn)行的指令集模擬器都可以實(shí)時(shí)地遍歷傳統(tǒng)代碼,尤其是當(dāng)麻煩序列卸載到 FPGA 中其他位置的狀態(tài)機(jī)上時(shí)。這種方法不能簡(jiǎn)單地呈現(xiàn)周期精確或時(shí)序精確,但在功能上是正確的。而且它還可以將移植問(wèn)題從硬件域轉(zhuǎn)換到軟件域,在軟件域,您可以訪問(wèn)整個(gè)調(diào)試工作臺(tái),這樣移植問(wèn)題處理起來(lái)容易得多。
如何實(shí)施 CPU?
討論了將傳統(tǒng)代碼遷移至新系統(tǒng)的可行性和難度后,接下來(lái)的問(wèn)題是如何在低端 FPGA 中實(shí)施 CPU 內(nèi)核。我們之前討論過(guò)復(fù)制傳統(tǒng) CPU 的情況,現(xiàn)在我們可以來(lái)了解下實(shí)施現(xiàn)代高性能 CPU 的選項(xiàng)。
主要問(wèn)題是處理器內(nèi)核依賴部分硬件結(jié)構(gòu),這種結(jié)構(gòu)在 ASIC 中以標(biāo)準(zhǔn)單元甚至是自定義邏輯的形式實(shí)施,無(wú)法在 FPGA 結(jié)構(gòu)中輕松高效地復(fù)制。因此,我們必須了解三種不同情況(圖 3):
僅通過(guò)用于模擬或 ASIC 合成的 Verilog 模型進(jìn)行合成的 CPU 內(nèi)核 — 即所謂的開(kāi)箱即用場(chǎng)景。
擁有面向 FPGA 合成手動(dòng)優(yōu)化的 RTL 的內(nèi)核。
從一開(kāi)始就開(kāi)發(fā)了架構(gòu)以在 FPGA 中實(shí)施的內(nèi)核。每種方法的可用性、規(guī)模和性能都不相同。這些方法都適用于現(xiàn)代低端 FPGA。
圖3.CPU 內(nèi)核中的三種 FPGA 優(yōu)化級(jí)別。
開(kāi)箱即用
盡管并不是每家 CPU 內(nèi)核知識(shí)產(chǎn)權(quán) (IP) 廠商都專門針對(duì) FPGA,但大多數(shù) IP 提供商都至少提供兩條遷移至 FPGA 內(nèi)核的路徑。最明顯的路徑是授權(quán)面向內(nèi)核的 RTL 源代碼,并通過(guò) FPGA 廠商的工具鏈運(yùn)行該代碼。實(shí)施這條路徑會(huì)遇到很多挑戰(zhàn),全都是因?yàn)樵?RTL 用于 ASIC 合成,而非 FPGA 合成。
特別是首次在 FPGA 中嘗試運(yùn)行該代碼,那么遇到第一個(gè)問(wèn)題將是:源代碼中的有些東西是采用 FPGA 合成工具無(wú)法處理的。代碼可能與合成工具不兼容的方式被隱藏或加密,可能包含您的工具無(wú)法識(shí)別的編譯指示、信號(hào)命名,甚至是帶有破壞性的注釋約定。您可以編輯這些內(nèi)容,但會(huì)因此產(chǎn)生第二個(gè)問(wèn)題:許可。
如果您使用用于 ASIC 開(kāi)發(fā)的 Verilog 源代碼,可能需要進(jìn)行編輯。這意味著您需要包含完整文檔的未隱藏的源代碼,以及/或 IP 廠商的大量支持。這些都是可用的,但它們都是針對(duì)財(cái)力雄厚、產(chǎn)量巨大、擁有大型法務(wù)部門的客戶所編寫和定價(jià)的。
還有另一條路徑:一些 IP 廠商提供評(píng)估或開(kāi)發(fā)套件,您可以通過(guò)它們?cè)?FPGA 中實(shí)施 CPU 內(nèi)核。該內(nèi)核可能沒(méi)有經(jīng)過(guò)高度優(yōu)化,但至少可以運(yùn)行和驗(yàn)證,而且其速度對(duì)軟件開(kāi)發(fā)來(lái)說(shuō)足夠快。
SiFive 產(chǎn)品經(jīng)理 Jack Kang 表示,他的一些客戶已經(jīng)采用了這種方法。該公司的 CoreDesigner 工具支持您從各種 RISC V 預(yù)配置內(nèi)核開(kāi)始,根據(jù)您特定的需求調(diào)整配置,然后輸出 RTL。但該工具也會(huì)在 SiFive 的開(kāi)發(fā)套件上輸出一個(gè)關(guān)于 FPGA 的編程文件。
Kang 還指出,“RISC V 的這種 FPGA 實(shí)施并未面向 FPGA 使用進(jìn)行高度優(yōu)化,但仍然包含不到 20K 的查找表,而且速度可以達(dá)到 100 Mhz 左右,當(dāng)然這很大程度上取決于配置。這種規(guī)模適合許多留有大量空間的低端 FPGA,支持您快速、輕松地將常用開(kāi)源內(nèi)核整合到系統(tǒng)中?!?/p>
優(yōu)化方法
有一些方法可以改善這些數(shù)據(jù),但需要采取一些措施。之所以有這種改善機(jī)會(huì),是因?yàn)?CPU 中有一些結(jié)構(gòu)并不適合 FPGA 邏輯結(jié)構(gòu)。
FPGA 使用大量相同邏輯元件陣列來(lái)實(shí)施邏輯,每個(gè)元件都包含一些查找表 (LUT) — 通常每個(gè) LUT 包含 4 個(gè)輸入 — 以合成邏輯函數(shù),以及一個(gè)或多個(gè)觸發(fā)器。這種安排適用于大多數(shù)隨機(jī)邏輯、管道和簡(jiǎn)單狀態(tài)機(jī)。對(duì)于高扇入邏輯,由于可能出現(xiàn)在算法硬件和地址解碼器中,因此合成往往會(huì)生成一長(zhǎng)串窄邏輯元件,從而消耗互連并導(dǎo)致延遲。對(duì)于基于內(nèi)存的功能,比如寄存器文件、高速緩存和相聯(lián)內(nèi)存,一次將功能映射至邏輯元件的觸發(fā)器(一或二位)可能要消耗大量資源,即使廠商工具足夠智能,嘗試將邏輯元件的 LUT 和觸發(fā)器隔離,并單獨(dú)使用它們。
很久以前,當(dāng) FPGA 首次用于數(shù)據(jù)包切換、數(shù)字信號(hào)處理和類似應(yīng)用時(shí),這種不匹配就非常明顯。為了解決這個(gè)問(wèn)題,F(xiàn)PGA 廠商在邏輯結(jié)構(gòu)中嵌入了大型可分割 SRAM 模塊和硬件乘法累加模塊。通過(guò)使用這些資源,通??梢燥@著改進(jìn) CPU 實(shí)施規(guī)模,有時(shí)還可以提高性能。但可能需要在 RTL 源代碼中或合成過(guò)程中運(yùn)用一定的知識(shí)進(jìn)行干預(yù)。如果熟練的 FPGA 用戶仔細(xì)檢查 RTL,并面向 FPGA 合成使用已知最佳 FPGA 編碼實(shí)踐對(duì)其進(jìn)行調(diào)優(yōu),能夠進(jìn)一步提升性能。
特定于 FPGA 的內(nèi)核
行業(yè)標(biāo)準(zhǔn) CPU 內(nèi)核,比如 Cortex-M 家族或 RISC V,提供熟悉度、成熟的(或以 RISC 為例不斷壯大的)工具和軟件生態(tài)系統(tǒng),以及在 FPGA 廠商之間輕松遷移或遷移至 ASIC 實(shí)施的機(jī)會(huì),甚至在某些情況下還可遷移至第三方現(xiàn)成的 SoC。但反過(guò)來(lái)要付出一定的代價(jià):費(fèi)用、規(guī)模,有時(shí)還有性能。
如果您想最大限度地優(yōu)化 FPGA,還需采取另一個(gè)步驟:不僅優(yōu)化實(shí)施過(guò)程,還要優(yōu)化 CPC 和指令集架構(gòu)本身:從一張白紙開(kāi)始,僅添加對(duì) FPGA 友好的結(jié)構(gòu)。很久以前,當(dāng) FPGA 首次變得足夠大,可容納 CPU 內(nèi)核時(shí),主要 FPGA 廠商就已經(jīng)開(kāi)始做出這樣的努力。他們始終在做出這樣的努力:在英特爾案例中為 Nios? II 處理器,其以發(fā)展演進(jìn)為專有 CPU 架構(gòu),不斷壯大由工具、軟件和 FPGA 外設(shè) IP 組成的生態(tài)系統(tǒng)。
目前,這些內(nèi)核家族提供多種類型的產(chǎn)品,從具備最少特性的小型微內(nèi)核 (和 Arm 的 Cortex M0 沒(méi)什么不同)到全功能、支持 Linux 的 CPU。其中許多型號(hào)都適用于廠商的低端 FPGA。例如,緊湊型 Nios Iie 內(nèi)核只需大約 1000 個(gè)邏輯元件,但速度可達(dá)到或超過(guò) 75 MHz。在另一個(gè)極端,具備高速緩存和內(nèi)存管理功能,且能夠運(yùn)行 Linux* 操作系統(tǒng)的內(nèi)核大約需要 5000 個(gè)元件。在這兩者之間還有許多選擇來(lái)滿足特定需求。甚至這種全功能配置也足夠小,不但可以將多核 CPU 集群放在一臺(tái)低端英特爾? MAX? 10 設(shè)備中,還仍然擁有足夠的空間。
因此,有許多方法可以將傳統(tǒng) CPU 功能遷移至低端 FPGA,同時(shí)仍然擁有豐富的資源來(lái)支持傳統(tǒng)接口或控制器功能、IoT 連接、安全性,或機(jī)器學(xué)習(xí)加速。古老的機(jī)器代碼可在 FPGA 上運(yùn)行,以向老舊 CPU 致敬,也可在現(xiàn)代內(nèi)核的指令集模擬器上運(yùn)行。
高級(jí)語(yǔ)言代碼可面向現(xiàn)代代碼進(jìn)行編譯。極具挑戰(zhàn)性的代碼模塊可以卸載到 FPGA 中的加速塊中,然后通過(guò)多種優(yōu)化程度各不相同的方法,得到許可并在 FPGA 中實(shí)施現(xiàn)代 CPU 內(nèi)核的某個(gè)版本。為了最大限度地提高資源效率,廠商專有 CPU 內(nèi)核可在各種性能和功能點(diǎn)中實(shí)現(xiàn)最佳的緊湊性,且?guī)缀踹m合所有的設(shè)計(jì)場(chǎng)景。
編輯:hfy
-
微控制器
+關(guān)注
關(guān)注
48文章
7627瀏覽量
151775 -
FPGA
+關(guān)注
關(guān)注
1630文章
21778瀏覽量
604806 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3613瀏覽量
129615 -
機(jī)器視覺(jué)
+關(guān)注
關(guān)注
162文章
4400瀏覽量
120516 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5511瀏覽量
121356
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論