我一直在使用更多功能风格的语言进行编程,并且已经开始欣赏诸如元组和高阶函数(如地图和折叠/聚合)之类的东西。 VHDL或Verilog都有这些构造中的任何一种吗?
似乎HDL将是这些纯组合器的完美应用 - 而这些组合器仅仅通过Haskell,F#,LINQ等中的命令过程进行模拟,硬件实际上 时钟滴答之间的纯功能。
初看一眼,两种语言看起来都很奇怪命令式。对我来说,似乎很奇怪的是,命令式CPU应用程序开始用函数式语言编写,而功能性HDL代码则以命令式的风格编写。
无论如何,问题是,有没有办法做甚至像
这样的简单事情divByThreeCount = count (\x -> x `mod` 3 == 0) myArray
或
myArray2 = map (\x -> x `mod` 3) myArray
甚至更好,让我用这些语言中的任何一种递归地定义我自己的高级构造?如果不是,哪种语言最接近?
两种语言似乎都计划在这方面取得进展吗?或者这对我来说真的没那么有用,作为HDL的新秀,会想到吗?
答案 0 :(得分:4)
我认为你是正确的,HDL的命令式风格和组合电路的功能性方面之间存在冲突。用线性语言描述并行电路是奇怪的,但我认为一个完整的功能HDL将是一场灾难。
功能语言(我发现)的事情是,编写占用大量资源的代码非常容易,无论是时间,内存还是处理能力。那是他们的力量;他们可以非常简洁地表达复杂性,但他们这样做是以牺牲资源管理为代价的。把它放在HDL中,我想你在合成时会有很多大而耗电的设计。
拿你的地图示例:
myArray2 = map (\x -> x `mod` 3) myArray
您希望如何合成?对我来说,你已经描述了每个元素元素的模运算符。忽略模数不便宜的事实,就是你想要的,如果不是,你将如何改变?如果我以某种方式开始破坏该功能,以便我可以说“实例化单个操作符并多次使用它”,那么我失去了很多函数式语言的功能。
......然后我们保留了状态。保留状态在硬件中无处不在。你需要它。你当然不会使用纯函数语言。
那就是说,不要丢掉你的功能设计模式。组合过程(VHDL)和“始终阻塞”(Verilog)可视为将其自身应用于其输入处呈现的数据的函数。管道可以被视为功能链。通常,您构建设计的方式看起来很实用,并且可以与Erlang中流行的“Actor”设计模式共享很多。
那么有什么东西要从函数式编程中学习吗?当然。我希望VHDL和Verilog从功能语言中获取更多功能吗?有时。麻烦的是功能语言太快了。如果我无法区分“多次使用f()的一个实例”和“使用f()的许多实例”那么它就不会执行硬件描述语言必须做的事情......描述硬件。
答案 1 :(得分:0)
请查看http://clash-lang.org以获取转换为VHDL / Verilog的高阶语言示例。它允许函数作为参数,currying等传递,甚至是一组有限的递归数据结构(Vec
)。正如您所期望的那样,纯moore
函数在给定步/输出函数和开始状态的情况下实例化有状态Moore机器。它有这个签名:
moore :: (s -> i -> s) -> (s -> o) -> s -> Signal i -> Signal o
Signal
模拟顺序逻辑中的时间演化值。