Clash:一种现代的、函数式的硬件描述语言

2020-05-07 19:54:35

Clash是一种函数式硬件描述语言,它借鉴了函数式编程语言Haskell的语法和语义。它为组合时序电路和同步时序电路提供了一种熟悉的结构设计方法。Clash编译器将这些高级描述转换为低级可综合的VHDL、Verilog或SystemVerilog。

Clash是一个开源项目,在许可的BSD2许可下获得许可,并由QBayLogic积极维护。

Clash构建在Haskell之上,这为良好类型的代码提供了极好的基础。与Clash的标准库一起,很容易构建可扩展和可重用的硬件设计。

将您的设计加载到解释器中,无需设置测试台即可轻松测试所有组件。

尽管Clash提供了许多功能,但有时需要直接访问VHDL、Verilog或SystemVerilog。Clash允许您使用其自己的模板系统执行此操作。

Clash允许程序员在没有硬编码长度或元素类型信息的情况下编写函数,例如此FIR滤波器:

FIR系数x=DOTP系数(窗口x),其中DOTP as bs=sum(zipWith(*)as bs)。

Clash将通过其强大的类型推理系统找出此函数的类型。要使";lock";类型就位,我们可以部分应用`fir`:

--推断:信号dom Int->;信号dom Int fir3int=FIR(3:>;4:>;5:>;Nil)--推断:信号dom Float->;信号dom Float fir4Float=FIR(3.5:>;4.2:>;3.0:>;6.1:>;Nil)。

如果您确实选择显式编写类型,则可以添加其他约束。Clash将检查这些约束,如果不满足则拒绝编译。以下示例实现完全并行矩阵乘法算法:mmult--Dimension Constraints:na~mb=>;1<;=mb--允许模拟访问mb/nb:=>;KnownNAt mb=>;KnownNAt nb--Arguments:=>;Vec ma(Vec NA Int)->;Vec mb(Vec Nb Int)-Result:->。VEC ma(Vec Nb Int)mmult Ma MB=result,其中MBT=转置MB点a b=sum$zipWith(*)a b result=map(\ar->;dot ar<;$>;MBT)mA