C を使用してデジタル回路を記述できますが (実際、Verilog HDL には C に似たものがあります)、単純な C ではモデル化できない基本的なことが 1 つあります。それは並列処理です。
デジタル回路の記述に属するものがあるとすれば、記述自体に固有の並列処理です: 関数 (実際にはモジュール) と、コード ブロックでさえ並列に「実行」されます。
通常の C プログラムは時間の経過に伴う一連の操作を記述します。したがって、デジタル操作を記述しようとすると、それが非常に些細なものでない限り、一連のステップとしてコンパイルされ、デジタル回路が本来持っている並列処理を利用することはありません。 .
そうは言っても、C にかなり近い HDL (ハードウェア記述言語) がいくつか存在します。そのうちの 1 つがHandel-Cです。Handel-C は、C から借用した構文に加えて、デジタル デザインに固有の並列処理をより適切に処理するための追加機能を使用します。
例: 2 つの変数の値を交換する必要があるとします。古典的な解決策 (ビット演算などに基づく解決策以外) は次のとおりです。
temp = a;
a = b;
b = temp;
しかし、誰かがコンピュータ プログラミングを学んでいる場合、上記のシーケンスを次のようにコーディングするのはよくある間違いです。
a = b;
b = a;
変数の交換を並列操作と見なすため、「b の値が a にコピーされ、その間に a の値が b にコピーされる」.
このアプローチの面白い点は、実際に機能することです...これら2つの割り当てを並行して実行できれば。普通の C では不可能なことですが、Handel-C では可能です:
par
{
a = b;
b = a;
}
このpar
ステートメントは、各コード行が他のコード行と並行して「実行」されることを示しています。
Verilog では、同じ交換は次のように記述されます。
a <= b;
b <= a;
<=
Verilog でのノンブロッキング割り当てです。最初の行が終了した後、2 行目は「実行」されませんが、両方が同時に開始されます。posedge
このシーケンスは、通常、clocked always (センシティビティ リストのクロック信号が 0 から 1または1 から 0 に変化するたびに「実行される」ループの一種) 内にありますnegedge
。
always @(posedge clk) begin
a <= b;
b <= a;
end
これは、clock
が 0 から 1 になるたびに、 と の間a
で値を交換することを意味しますb
。
デジタル デザインの言語について話すときは、常に「実行された」という言葉を引用することに注意してください。コードは、実際にはプロセッサによって実行される一連の操作に変換されませんが、コードは回路です。電子記号の代わりに文と演算子を使用し、配線の代わりに割り当て、引数、および「関数呼び出し」を使用して、2D 回路図を 1D レンダリングしたものと考えてください。
デジタル回路に精通している場合は、「常に」ループのように見えるが、実際には次のように変換されることに気付くでしょう。

これは、同じ高レベルの記述をアセンブリに変換するだけではできないことです (ターゲット プロセッサの ISA にある種のXCHG
命令があり、実際には珍しくなく、コードが 2 つの変数を交換して CPU に交換する場合を除きます)。登録します)。