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

どのように合成しますか?私には、配列の要素ごとのモジュロ演算子について説明しました。モジュロが安くないという事実を無視して、それはあなたが意図したものでした、そしてそうでなかったらどのようにそれを変えるでしょうか?「1つの演算子をインスタンス化して複数回使用する」と言えるように、何らかの方法でその関数を分割し始めると、関数型言語の多くの力を失いました。

...そして、保持された状態になります。保持状態はハードウェアのいたるところにあります。君はそれが要る。あなたは確かに純粋に関数型言語を使用しないでしょう。

とはいえ、機能的なデザインパターンを捨てないでください。コンビナトリアルプロセス(VHDL)と「alwaysblocks」(Verilog)は、入力で提示されたデータに適用される関数と見なすことができます。パイプラインは、機能のチェーンと見なすことができます。多くの場合、デザインを構成する方法は機能的に見え、Erlangで人気のある「アクター」デザインパターンと多くを共有できます。

では、関数型プログラミングから学ぶべきことはありますか?そうです。VHDLとVerilogが関数型言語からより多くのものを取り入れることを望みますか?時々。問題は、関数型言語があまりにも早く高レベルになることです。「f()の1つのインスタンスを何度も使用する」と「f()の多くのインスタンスを使用する」を区別できない場合は、ハードウェア記述言語が実行する必要があることを実行しません...ハードウェアを記述します。

于 2012-10-07T11:22:51.980 に答える
1

VHDL / Verilogにトランスパイルされる高次言語の例については、http: //clash-lang.orgを参照してください。これにより、関数を引数、カリー化などとして、限られた再帰データ構造のセット(Vec)でも渡すことができます。ご想像のとおり、純粋moore関数は、ステップ/出力関数と開始状態が与えられたステートフルムーアマシンをインスタンス化します。この署名があります:

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

Signal■シーケンシャルロジックで時間進化値をモデル化します。

于 2015-11-24T09:48:03.127 に答える
0

BlueSpecは小さなcomによって使用されます。少数の人だけが知っている-INTEL

これはSystemVerilog(SV)の拡張であり、BSVと呼ばれます

しかし、それはオープンではありません-BlueSpec.comに多額のお金を払わずに使ってみたり、学んだりすることはできないと思います

ザイリンクスで使用されているLavaもありますが、直接使用できるかどうかはわかりません。

注:Vhdl関数(およびおそらくVerilogも)では、時間遅延を設定できません(関数にclkイベントを待機するように要求することはできません)Vhdlには標準があります。lib。複素数の場合。cal。ただし、Vhdlでは、add( "+")などのシステム関数を変更またはオーバーロードして、実装を定義できます。ベクトルまたは行列のaddsubmulまたはdiv(+-* /)関数を宣言し、汎用サイズ(任意)と再帰宣言を使用できます。ほとんどのシンセサイザーは「あなたを理解」し、あなたが求めたことを実行します。

于 2022-02-02T04:55:09.677 に答える