
VHDL和Verilog是用于描述可编程数字逻辑器件的两种主流语言。但我们不应该忘记,它们最初可不是为了这个目的而开发的,而是为了模拟和归档。由于这样的事实,加上许多其它语法的弱点,引发了许多问题,例如设计参数化能力薄弱、设计再使用性差、代码冗长、方法复杂,以及可编程和不可编程的特性之间界线模糊不清。
为了描述这些限制和问题,一些有助于提升现代描述典范的新替代解决方案已经出现,如Bluespec、Chisel、CλaSH、Migen、MyHDL和SpinalHDL等。
SpinalHDL就和VHDL、Verilog一样,可通过定义暂存器和闸极而用于描述硬件;但不同于VHDL和Verilog之处在于SpinalHDL并不使用事件驱动典范来描述硬件,而是使用专为此目的设计的语法。这允许在其声明中区分组合信号与暂存器,并通过定义规则来描述硬件行为。这意味着信号和暂存器可以分配至相同的条件陈述式,而这对于“以事件驱动”(event driven)的替代方案来说是不可能实现的(见图1)。

图1:简单的硬件描述
语言的所有语法都可用于硬件描述,而且可分为两类。一类是使用专用类型明确地定义可编程硬件;另一类则可用于阐述硬件结构,例如实例回圈、功能和分类。除此之外,SpinalHDL编译器将执行许多检查,以确保用户设计的合法性,例如,是否缺少组合回圈、所有组合分配的完整性以避免不必要的闩锁推论,以及跨时脉域连接的合法性等等,这使得SpinalHDL使用起来更安全。
但SpinalHDL与VHDL、Verilog的主要不同之处在于其嵌入通用语言(Scala)。由于这种方法,我们得到一个“Meta HDL”,其中高层级部份(分类、动态阵列、字典...)可用于通过算法产生可编程的硬件描述。这提供了非常高的表现力来描述灵活和可重复使用的硬件。实际上,正是它使得SpinalHDL有能力以物件导向和功能编程的方式来操纵所描述设计中的每一个元素;当它与标准库结合后,将会在后设硬件描述和阐述能力方面获得出乎意料的能力,远远超越VHDL、Verilog和SystemVerilog的范围所及(见图2)。

图2:使用抽象实现暂存器库(register bank)
SpinalHDL编译器能够将使用者编写的硬件描述转换为人类可读取和可编程的VHDL/Verilog网表(正如大多数原理图输入工具所用),这使其得以与业界所使用的大多数EDA工具相容。
此外,目标语言/EDA工具不一定原生支援Spinal-HDL提供的所有先进功能(例如类型和资料结构参数化),但在被解压缩/展开至产生的VHDL/Verilog网表之前,可在SpinalHDL编译器内部进行解析(见图3)。

图3:仲裁管线的建置
为了证实这些概念,我们使用SpinalHDL建置一款名为“Pinsec”的小型SoC,它整合了RISC-V CPU、SDRAM控制器、嵌入式RAM、GPIO、计时器、UART、VGA和JTAG除错介面,由AXI4和APB3互连连接所有元件(见图4)。

图4:Pinsec SoC方块图
通过展示板显示非常易于建置设计的顶层,特别是涉及汇流排互连的参数化和实例化时。
相较于与传统方法,SpinalHDL只需几行代码就能搞定,从而大大提高了可读性和生产力。例如,将新的周边装置连接到APB互连只需要一行参数化代码(见图5)。

图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域内),可进一步扩展语言。
来源:
eettaiwan 2017-09-24

戳下面的原文阅读,更有料!

