- Advertisement -
首頁 技術頻道 定義/邏輯驗證精準又簡單 客製化指令加速特定領域應用

定義/邏輯驗證精準又簡單 客製化指令加速特定領域應用

- Advertisement -

隨著從邊緣設備到雲端服務的應用需要處理越來越多的數據,現今對於SoC運算能力的要求也越來越高。此外,系統也必須在非常短的時間內對這些數據(聲音、影像、動態影片、光學雷達、紅外線雷達以及聲納等)進行分析、處理並在一定時間內採取相對的回應。儘管這些應用對硬體常要求大量的運算能力,但它們卻也同樣受到功耗和成本的限制,而一般標準的CPU通常很難滿足這些要求。如果想在特殊的應用或演算法上加快運算的速度,SoC需要一種更好的方法來達到這些目標。

客製化指令加速運算

在運算加速的方法和演進中,主要可以歸納成三種方式。一種是透過外部的硬體加速器,最好的例子之一是加密引擎;第二種是指令集架構(ISA)的標準擴充集,例如RISC-V ISA中的M、P和V擴充集;最後一種是用戶自定義的客製化指令,如RISC-V ISA開放給設計工程師添加他們自己的客製化指令。

表1比較了這三種類型的運算加速。可以看到自定義的客製化指令沒有啟動延遲(Start-up Latency),同時擁有指令專有的優勢,並能夠共用較多的硬體資源來節省大小。在過去將新的指令整合到現有的標準CPU IP較麻煩的是設計流程。這種整合除了要求設計工程師要了解CPU的架構和其工具鏈,以便有效地定義所需的指令之外,工程師更要了解如何將新設計的邏輯電路整合到現有的SoC、仿真和驗證的流程中。廠商如晶心科技提供的Andes Custom Extension(ACE)和客製優化指令開發工具(COPILOT)之EDA等級的客製化指令開發工具來幫忙客戶解決這些問題,使設計工程師可以快速依照他們的需求定義客製化指令,而ACE和COPILOT支援晶心RISC-V V5全系列的核心。

如果將數據密集型運算的加速加以分析,可以將其分為兩部分:數據I/O和運算加速。針對第一部分,設計工程師可以用適當的DMA引擎加上Double Buffers,以減少將數據傳送到加速單元或從加速單元傳送出的等待時間。第二部份運算加速則可以用ACE開發自定義的客製化指令來增強效能,例如定義一個指令來完成矩陣卷積或兩個64×8向量的內積。另外,ACE還可以從CPU生成客製化接口,來控制現有的硬體引擎進行快速的資料交換,例如,在一個週期內向外部硬體引擎發送90位元的訊號。

在這邊也列舉了三種典型的演算法來展示客製化指令所帶來在效能及功耗上的改善。表2列舉了有限脈衝響應(FIR)過濾器、32位循環冗餘校驗(CRC32)和三重數據加密標準(3DES)這些演算法。他們透過ACE添加客製化指令後,得到從20倍到300倍不等的效能提升及功耗降低。

ACE流程設計指令簡易

在ACE的流程設計指令,工程師只需要提供少許的資訊,例如指令名稱、屬性、客製化的硬體資源、運算本身的C語義以及ACE其他和客製化指令相關的參數。ACE自動整合開發工程師所提供的Concise Verilog,該Verilog只需提供客製化指令本身的邏輯而不必擔心與CPU Pipeline相關的接口訊號和控制邏輯。像晶心EDA等級的COPILOT工具會依照這些資訊自動生成擴展的RTL、高精確的模擬器以及工具(編譯器、彙編器/反彙編器和調試器);這些擴展元件和基礎元件結合後,就產生一個新的CPU及其所有相關工具。此外,COPILOT可以產生測試環境來交叉檢查擴展的Instruction Set Simulator(ISS)和RTL,以幫助工程師驗證其設計的客製化指令邏輯是否正確。

COPILOT因為與晶心Eclipse-based的Integrated Development Environment(AndeSight IDE)高度整合,開發工程師可以容易地利用AndeSight中的現有提供給標準RISC-V的功能,這些包括高精確的模擬器、程式的編譯、除錯和軟體效能Profiling工具,來在新產生的RISC-V核心上更快進行應用軟體的開發和驗證。

ACE提供的多種功能可以讓工程師設計適合其特定需求的客製化指令,例如ACE支援單週期或多週期的純量(Scalar)指令、For循環或Do-while循環的向量(Vector)指令、以及可立即Retire並在後台持續執行客製化指令的Background選項。此外,ACE支援多種Operands類型:(1)一般CPU都有的標準Operand,像是Immediate、通用暫存器(GPR)和從CPU存取的Baseline Memory;(2)具有任意寬度和數量的客製化暫存器(ACR)、客製化記憶體(ACM)和客製化端口(ACP),以及(3)隱含Mnemonic在指令中的Operand,進而減少客製化指令所需要的編碼空間。另外,根據設計工程師在ACE Script中定義的資訊,ACE會自動決定分配Opcode,然後生成新的工具和SystemC的模擬器。ACE也提供可以優化硬體資源的邏輯共享選項,並自動產生用於模擬時的波形控制文件。而COPILOT自動生成並整合Concise Verilog的邏輯包括指令解碼、Operand Mapping、Dependence檢查、輸入參數的對接和輸出參數的更新等。

ACE開發流程如圖1所示。如果開發工程師己經確定應用軟體中需要加速的代碼,就可以直接定義ACE指令來替換此段代碼。接下來,設計工程師再用Profiling評估新客製化指令增加的效能,以確定其是否已達到所需的週期預估值。如果目標尚未達到,則重複進行此步驟,直到帶有客製化指令的應用程式達到預定的目標為止。一旦應用程式已經達到預期的效能,設計工程師就可以進到下一步去實現ACE客製化指令邏輯的RTL,並進行評估以確保最終的功耗、效能和面積滿足整體系統的要求。如果沒有,則可以透過再次分析應用程式並以添加或修改客製化指令來重複之前的步驟,直到滿足所有的條件為止。

圖1 ACE開發流程

透過設計客製化指令來減少執行週期,除了可以提高性能外,還可以進一步降低功耗。因為多條指令需要多次重複執行獲取、解碼和退出的運算過程,而客製化指令僅需執行一次獲取、解碼和退出週期即可。此外,透過設計專用的邏輯電路來執行客製化指令也能更加優化功耗。

設計ACE指令相當簡單。如圖2所示,ACE定義文件madd32.ace Script提供設計一道客製化指令所需的資訊:「insn」、「Operand」、「csim」和「Latency」。在這個例子中,ACE Script包含客製化指令的名稱「madd32」外,它也列出客製化指令中Operand的名稱和其屬性:輸入、輸出、輸出入、通用暫存器或immediate等;另外它還包括客製化指令在執行過程中所需週期的估計值,而此文件還用C語言來描述客製化指令集在模擬器csim會需要的指令語義。ACE也會自動生成如圖2中的Intrinsic Function「acc_madd32()」。此外,ACE設計者只需要在Concise Verilog的//ACE_BEGIN和//ACE_END之間提供客製化指令本身的邏輯,即可不必提供流水線控制、ACE和CPU接口等細部的電路邏輯,這些都會由COPILOT自動處理。在原來的應用程序代碼(如圖3代碼所示)中,本來用於執行演算法的C代碼中的For循環可以用新的函數「ace_madd32()」以及Operand來替換。

圖2 ACE Madd32指令設計
圖3 原有的應用程式代碼

ACE力助設計效率增加

ACE具有數種可以進一步幫助設計工程師增加效率的功能,像是選擇Andes客製化記憶體和暫存器以及將Scalar轉換為Vector指令,如圖4所示。若在ACE Script中將「vec」關鍵字添加到客製化的Scalar指令名稱之前,就可以將原本指令madd32向量化成vmadd32。除了保留Scalar指令原本的Operand外,設計工程師只需定義循環的次數和記憶體存取位置的增量(跨步)。另一個增加效率的功能是Background,它允許ACE指令與其他指令並行執行;只要使用關鍵字「bg_insn」,就能將ACE指令從Foreground移到Background來執行。

圖4 ACE客製化指令向量化

圖5則是一個使用客製化端口來實現Handshake的例子。設計工程師希望CPU直接與四個外部硬體引擎進行資料交換,CPU將要傳到硬體加速器的命令先寫入客製化暫存器中,然後將命令發送到硬體加速器,接下來CPU等待加速器通知運算結束,然後讀回結果。在ACE Script中,定義了一個90位元的客製化端口,連接到四個硬體引擎;這90位元包括一個位元的Valid和硬體引擎ID。另外,四個硬體引擎的控制訊號用來表示個別運算已做完,可以回傳結果給CPU;CPU可以在等待結果的過程中進行其它工作。為了CPU可以個別接收加速器256-bit的結果,每個加速器需要有一個輸入端口以將資料回傳。

圖5 Andes客製化端口

ACE邏輯共享可減少硬體Gate Count。要啟用邏輯共享,RTL設計工程師必須在Verilog模組之前加入(*ace_shared*)。例如,設計工程師如果希望共用一個16×16的乘法器,則可以使用相同的名稱宣告乘法器模組;或者宣告不同的名稱,以表示不同的模組。ACE會根據這些資訊自動生成所有控制和仲裁邏輯來加快產品的開發。

ACE簡化邏輯驗證程序

除了定義ACE指令外,如何驗證其邏輯的正確性也非常重要。其他工具大多都是從單一來源產生RTL和模擬器模型,工程師必須另行提供其他模型來驗證其設計的客製化指令是否正確,而且這些工具通常都不支援這樣額外的驗證功能。而COPILOT可以自動交叉檢查csim中的C程式和Concise Verilog之間的邏輯是否等效。在使用ACE為RISC-V處理器開發客製化指令時,設計工程師只需使用業界已熟悉的標準C和Verilog語言就可以開始進行客製指令的設計,進而免除了像其它工具學習新語言的時間。

由於工程師在設計電路時會需要使用RTL模擬工具產生波形圖,以進一步除錯分析,COPILOT可以自動生成包含Operand和ACE接口訊號的Waveform Control File簡化工程師工作。圖6中展示了一個ACE客製指令的模型波形圖,其中包含了指令中的三個Operands和其波形訊號:IP、C和V。設計工程師可直接使用這個波形控制文件來檢視邏輯是否正確並除錯。

圖6 自動生成波形控制文件

像晶心也提供了SystemC模擬環境(TLM 2.0),以便設計工程師能夠在正式開發SoC之前,針對整個系統執行前期的評估和驗證。這個環境的SystemC RISC-V CPU模型包括標準的晶心V5 CPU、GDB Server、Local Memory,以及標準接口等。該模型也會整合ACE客製化指令及客製暫存器和客製化記憶體等資源,以在SystemC環境中使用其定義的客製化指令。

圖7說明如何定義一個ACE客製化指令來大幅改進向量的內積運算以快速處理大量數據。圖左方是執行此運算的ACE Script,其中包含了以ACR設計的客製化暫存器「CfReg」和使用ACM來設計的「VMEM」。Operand「out gpr IP」使用一個通用暫存器來累加運算後要輸出的結果,左下的「csim」則是用C言語來描述兩個變數相乘並累加其結果。為了讓C語言程式可處理非標準的多位元運算,csim中使用了一個多精度資料庫來直接處理512位元的變數。此外在右上是向量內積的Concise Verilog。在這例子中,透過一個自動產生的客製化函數「long ace_64B(CfReg_t,VMEN_t)」來替換原本的C代碼後,運算速度可以大幅加快85倍。

圖7 ACE加速向量的內積運算

另一個範例是使用ACE在XY記憶體的架構上設計環形緩衝區。ACM用於定義XY記憶體,ACR則用來設置記憶體位址來指向兩個環形緩衝區。在ACE Script中加上有顏色的代碼後,可將之前的madd32 ACE Script轉換成以XY記憶體為架構的環形緩衝區。如圖8中所示,ACR Xadr和Yard會儲存指定的位址以讀出兩個環形緩衝區。當它們從環形緩衝區中讀取出其的最後一個位址時,X位址和Y位址將指回到這兩個環形緩衝區的起始位址。

圖8 以XY記憶體為架構的環形緩衝區之ACE Script

透過使用Andes Custom Extension,工程師只需要專注在新的客製化指令的功能及邏輯設計上,而開發工具的擴展與CPU流水線及各種機械性控制相關的RTL邏輯,則透過EDA工具COPILOT自動生成,其中包括指令Opcode分配、指令解碼、Operand Mapping、流水線控制邏輯,以及對通用暫存器的依賴性檢查。此外ACE對多種Operand和指令語義也提供了全面性的支援,例如指令向量化以及Background選項。ACE也支援多種可自行定義寬度的客製化資源,包括客製化的暫存器、記憶體和端口,並自動生成驗證環境以方便客製化指令的驗證和除錯。因此藉由ACE添加客製化指令,設計工程師可以快速將RISC-V V5核心轉變成特定領域應用的可程式化加速器。

(本文作者為晶心科技市場處技術經理)

相關文章

- Advertisement -
- Advertisement -

最新文章

- Advertisement -

熱門文章

- Advertisement -

編輯推薦

- Advertisement -