VHDL和Verilog是用於描述可合成數位硬體的兩種主流語言。但我們不應該忘記,它們最初可不是為了這個目的而開發的,而是為了模擬和歸檔。由於這樣的事實,加上許多其它語法的弱點,引發了許多問題,例如設計參數化能力薄弱、設計再使用性差、程式碼冗長、方法繁複,以及可合成和不可合成的特性之間界線模糊不清。

為了因應這些限制和問題,一些有助於提升現代描述典範的新替代解決方案已經出現,如Bluespec、Chisel、CλaSH、Migen、MyHDL和SpinalHDL等。

以不同方式描述硬體

SpinalHDL就和VHDL、Verilog一樣,可透過定義暫存器和閘極而用於描述硬體;但不同於VHDL和Verilog之處在於SpinalHDL並不使用事件驅動典範來描述硬體,而是使用專為此目的設計的語法。這允許在其聲明中區分組合訊號與暫存器,並透過定義規則來描述硬體行為。這意味著訊號和暫存器可以分配至相同的條件陳述式,而這對於「以事件驅動」(event driven)的替代方案來說是不可能實現的(見圖1)。

20170922_SpinalHDL_TA31P1 圖1:簡單的硬體描述

語言的所有語法都可用於硬體描述,而且可分為兩類。一類是使用專用類型明確地定義可合成硬體;另一類則可用於闡述硬體結構,例如實例迴圈、功能和分類。除此之外,SpinalHDL編譯器將執行許多檢查,以確保用戶設計的合法性,例如,是否缺少組合迴圈、所有組合分配的完整性以避免不必要的閂鎖推論,以及跨時脈域連接的合法性等等,這使得SpinalHDL使用起來更安全。

但SpinalHDL與VHDL、Verilog的主要不同之處在於其嵌入通用語言(Scala)。由於這種方法,我們得到一個‘Meta HDL’,其中高層級部份(分類、動態陣列、字典...)可用於透過演算法產生可合成的硬體描述。這提供了非常高的表現力來描述靈活和可重複使用的硬體。實際上,正是它使得SpinalHDL有能力以物件導向和功能編程的方式來操縱所描述設計中的每一個元素;當它與標準庫結合後,將會在後設硬體描述和闡述能力方面獲得出乎意料的能力,遠遠超越VHDL、Verilog和SystemVerilog的範圍所及(見圖2)。

20170922_SpinalHDL_TA31P2 圖2:使用抽象實現暫存器庫(register bank)

SpinalHDL編譯器能夠將使用者編寫的硬體描述轉換為人類可讀取和可合成的VHDL/Verilog網表(正如大多數原理圖輸入工具所用),這使其得以與業界所使用的大多數EDA工具相容。

此外,目標語言/EDA工具不一定原生支援Spinal-HDL提供的所有先進功能(例如類型和資料結構參數化),但在被解壓縮/展開至產生的VHDL/Verilog網表之前,可在SpinalHDL編譯器內部進行解析(見圖3)。

20170922_SpinalHDL_TA31P3 圖3:仲裁管線的建置

未來展望

為了證實這些概念,我們使用SpinalHDL建置一款名為‘Pinsec’的小型SoC,它整合了RISC-V CPU、SDRAM控制器、嵌入式RAM、GPIO、計時器、UART、VGA和JTAG除錯介面,由AXI4和APB3互連連接所有元件(見圖4)。

20170922_SpinalHDL_TA31P4 圖4:Pinsec SoC方塊圖

透過展示板顯示非常易於建置設計的頂層,特別是涉及匯流排互連的參數化和實例化時。

相較於與傳統方法,SpinalHDL只需幾行程式碼就能搞定,從而大大提高了可讀性和生產力。例如,將新的周邊裝置連接到APB互連只需要一行參數化程式碼(見圖5)。

20170922_SpinalHDL_TA31P5 圖5:Pinsec的匯流排橋接和所有APB3匯流排結構的頂層實例化

另一個有趣的展示是RISC-V CPU(名為VexRiscv)的第二次反覆運算,證實了使用SpinalHDL的先進後設硬體描述功能帶來的增益。首先,CPU頂層是一個空白骨架,它只提供一些闡述服務、作為訊號通過各階段的自動管線以及各階段的仲裁介面。

結合一個可在CPU頂層注入硬體的外掛程式註冊系統,該方法支援非常靈活的CPU架構——支援相同功能的多個變體,而無需將其整合至CPU程式碼中。外掛程式可以從最簡單的事情(例如程式計數器或整數ALU)到最複雜的操作(例如透過L1快取實現載入和儲存支援)。

外掛程式之間的合作也可能非常複雜。例如,所有外掛程式都可以發佈新的指令操作碼,以及如何由指令解碼器進行解碼。

然後,指令解碼器將使用與SpinalHDL後設硬體功能相結合的Quine-Mc Cluskey演算法,以產生最小指令解碼邏輯。

結論

使用SpinalHDL是改變數位硬體設計願景並實現真正工程作業的一種體驗。憑藉其所有功能,可讓晶片設計人員描述靈巧和可重複使用的硬體,而沒有通常使用HDL(如VHDL、Verilog甚至System-Verilog)時的繁瑣和限制。它也證明了使用軟體工程技術在產生的RTL中,無需任何開銷,就可詳細描述硬體結構的可行性和收益。該語言及其參考編譯器也是完全免費和開放源碼的。

最後,值注意的是:上述示例中使用的所有功用和分類,如Stream、RGB、Queue、Apb3Decoder、AxiLite4和AxiLite4SlaveFactory都不是SpinalHDL語言中提供的功能,而是由標準庫使用其常規語法而提供的。換句話說,透過建置新的工具庫、抽象層以及可從根本上改善硬體描述表現力的工具,或是在不忽視抽象硬體的條件下導入新的概念(因為這些庫仍然建置在RTL域內),可進一步擴展語言。