3

我一直在使用更多函数式语言进行编程,并且已经开始欣赏元组之类的东西,以及地图和折叠/聚合之类的高阶函数。VHDL 或 Verilog 是否有任何这些结构?

看起来 HDL 将是这类纯组合器的完美应用——虽然这些组合器仅由 Haskell、F#、LINQ 等中的命令式进程模拟,但硬件实际上时钟节拍之间的纯功能。

乍一看,这两种语言看起来都很奇怪。对我来说,命令式 CPU 应用程序开始用函数式语言编写,而函数式 HDL 代码以命令式风格编写,这似乎很奇怪。

无论如何,问题是,有没有办法做一些简单的事情,比如

divByThreeCount = count (\x -> x `mod` 3 == 0) myArray

或者

myArray2 = map (\x -> x `mod` 3) myArray

或者更好的是让我用这些语言中的任何一种递归地定义我自己的高级构造?如果不是,哪种语言最接近?

这两种语言似乎都计划朝着这个方向取得进展吗?或者这真的没有我作为 HDL 新手所想的那么有用吗?

4

3 回答 3

4

我认为您是对的,HDL 的命令式风格与组合电路的更多功能方面之间存在冲突。用本质上是线性的语言来描述并行电路很奇怪,但我认为功能齐全的 HDL 将是一场灾难。

函数式语言的问题(我发现)是很容易编写占用大量资源的代码,无论是时间、内存还是处理能力。这就是他们的力量;它们可以非常简洁地表达复杂性,但它们这样做是以牺牲资源管理为代价的。把它放在一个 HDL 中,我认为在综合时你会有很多大型、耗电的设计。

以您的地图为例:

myArray2 = map (\x -> x `mod` 3) myArray

你想怎么合成?对我来说,您已经为数组的每个元素描述了一个模运算符。忽略模数并不便宜的事实,这是您的意图,如果不是,您将如何更改它?如果我开始以某种方式分解该函数,以便我可以说“实例化一个运算符并多次使用它”,我就会失去函数式语言的很多力量。

...然后我们得到了保留状态。保留状态在硬件中无处不在。你需要它。您当然不会使用纯粹的函数式语言。

也就是说,不要丢弃你的函数式设计模式。组合过程 (VHDL) 和“始终块” (Verilog) 可以被视为将自身应用于其输入处呈现的数据的函数。管道可以被视为功能链。通常,您构建设计的方式看起来很实用,并且可以与 Erlang 中流行的“Actor”设计模式共享很多。

那么有什么东西可以从函数式编程中学习吗?当然。我是否希望 VHDL 和 Verilog 从函数式语言中获得更多?有时。问题是函数式语言太快太高了。如果我无法区分“多次使用 f() 的一个实例”和“使用 f() 的多个实例”,那么它就不能做硬件描述语言必须做的事情......描述硬件。

于 2012-10-07T11:22:51.980 回答
1

查看http://clash-lang.org以获取转换为 VHDL/Verilog 的高阶语言的示例。它允许函数作为参数传递、currying 等,甚至是一组有限的递归数据结构 ( Vec)。正如您所期望的那样,纯moore函数在给定步进/输出函数和开始状态的情况下实例化有状态的摩尔机。它有这个签名:

moore :: (s -> i -> s) -> (s -> o) -> s -> Signal i -> Signal o

Signals 对时序逻辑中随时间演变的值进行建模。

于 2015-11-24T09:48:03.127 回答
0

BlueSpec 被一个小型 com 使用。只有少数人知道 - 英特尔

它是 SystemVerilog (SV) 的扩展,称为 BSV

但它不是开放的——我认为你可以在不支付 BlueSpec.com 大笔资金的情况下尝试使用甚至学习它

还有Xilinx用的Lava,不知道能不能直接用。

注意:在 Vhdl 函数中(也可能是 Verilog)不能有时间延迟(你不能要求函数等待 clk 事件)Vhdl 有一个标准。库。对于复数。卡尔。但在 Vhdl 中,您可以更改或重载系统函数,如 add (“+”) 并定义您的实现。您可以声明向量或矩阵添加 sub mul 或 div (+ - * /) 函数,使用通用大小 (any) 和递归声明 - 大多数合成器将“理解您”并按照您的要求进行操作。

于 2022-02-02T04:55:09.677 回答