Verilog で自動キーワードを使用してタスクを宣言するとはどういう意味ですか?
task automatic do_things;
input [31:0] number_of_things;
reg [31:0] tmp_thing;
begin
// ...
end
endtask;
注: この質問の主な理由は、サイトにハードウェア プログラマーがいるかどうか知りたいからです。:)
Verilog で自動キーワードを使用してタスクを宣言するとはどういう意味ですか?
task automatic do_things;
input [31:0] number_of_things;
reg [31:0] tmp_thing;
begin
// ...
end
endtask;
注: この質問の主な理由は、サイトにハードウェア プログラマーがいるかどうか知りたいからです。:)
「自動」は実際には「再入可能」を意味します。用語自体はソフトウェア言語から盗用されています。たとえば、C には、変数が含まれているスコープが実行されたときにスタックに割り当てられ、後で割り当てが解除されることを宣言するための「auto」キーワードがあります。その変数の永続的な値は表示されません。C でこのキーワードを聞いたことがないかもしれない理由は、それがすべての型のデフォルトのストレージ クラスだからです :-) 代替手段は「静的」です。関数が呼び出された回数に関係なく、プログラムの実行中にこの同じメモリ位置を参照し、「揮発性」を意味します。これは、私の SoC の別の場所にあるレジスタか、私が制御できない別のデバイス上の何かです。コンパイラ、コードに中間書き込みがなく、以前の読み取りから私の値を知っていると思っている場合でも、読み取りを最適化しないでください。」
「自動」は再帰関数を対象としていますが、同じ関数を異なる実行スレッドで同時に実行することも目的としています。たとえば、(Verilog の fork->join ステートメントを使用して) N 個の異なるブロックを "フォーク" し、それらすべてに同じ関数を同時に呼び出すと、関数が自分自身を再帰的に呼び出すのと同じ問題が発生します。
多くの場合、コードはタスクまたは関数を「自動」として宣言しなくても問題ありませんが、特にそうする必要がない限り、そこに置くことをお勧めします。
これは、タスクが再入可能であることを意味します。タスク内で宣言されたアイテムは、タスクの異なる呼び出し間で共有されるのではなく、動的に割り当てられます。
ほら - 私たちの中にはVerilogをやっている人もいます... (うーん)
"automatic" キーワードを使用すると、再帰関数を記述することもできます (verilog 2001 以降)。底を打った場合は合成可能になるはずですが、ツールがサポートされているかどうかはわかりません。
私も、Verilog を実行します。
WillとMartyが言うように、自動は再帰関数を対象としていました。
通常の(つまり自動ではない)関数が異なる値で呼び出され、同じタイムスライスでシミュレーターによって処理される場合、戻り値は不確定です。これは、見つけるのが非常に難しいバグになる可能性があります。これはシミュレーションの問題であり、合成するとロジックは正しくなります。
関数を自動化すると、これが修正されます。