2008-08-29 14 views
15

タスクがVerilogで自動キーワードで宣言されているとはどういう意味ですか?Verilog自動タスク

task automatic do_things; 
    input [31:0] number_of_things; 
    reg [31:0] tmp_thing; 
    begin 
    // ... 
    end 
endtask; 

注:この質問は、サイトにハードウェアプログラマーがいるのが不思議です。 :)

答えて

14

これは、タスクが再入可能であることを意味します。タスク内で宣言された項目は、タスクの異なる呼び出し間で共有されるのではなく、動的に割り当てられます。

あなたが見る - 私たちの一部のVerilogを行う...(ぐふ)

3

「自動」キーワードは、(2001年のverilog以降)再帰関数を記述することができます。彼らが底を打つと合成可能でなければならないと信じていますが、ツールサポートがあるかどうかはわかりません。

私もverilog!

1

ウィルとマーティが言うように、自動機能は再帰機能を意図していました。

通常の(つまり自動ではない)関数が異なる値で呼び出され、シミュレータによって同じタイムスライスで処理された場合、戻り値は不定です。それは見つけにくいバグかもしれません!これはシミュレーションの問題に過ぎず、合成されたロジックが正しいとします。

機能を自動化すると、これが修正されます。

21

「自動」は実際に「再入可能」を意味します。この用語自体はソフトウェア言語から盗まれています。例えば、Cはスコープが実行されたときにスタックに割り当てられている変数を宣言するための "auto"キーワードを持っています。その後、同じスコープの複数の呼び出しその変数の永続的な値は表示されません。あなたがCでこのキーワードを聞いたことがない理由は、それがすべてのタイプのデフォルトのストレージクラスであるということです:-)代替変数は "static"です。つまり、 "この変数を静的に(メモリ内の単一のグローバル位置に)この関数が呼び出された回数にかかわらず、プログラムの実行中にこの同じメモリ位置を参照してください。これは、「これは私のSoC上のどこか他の場所のレジスタか、あなたがあなたが私の価値を知っていると思う時でさえ、読者を私に遠ざけるように最適化してはいけません。

"自動"は再帰的な機能を目的としていますが、同じ機能を別々の実行スレッドで同時に実行するためのものです。例えば、N個の異なるブロックを(Verilogのfork-> joinステートメントを使用して) "fork"して、それらがすべて同じ関数を同時に呼び出せば、再帰的に自身を呼び出す関数と同じ問題が発生します。

多くの場合、タスクや機能を「自動」と宣言することなく、コードはうまくいくでしょうが、具体的にそれが必要な場合を除いて、そこに配置することをお勧めします。

関連する問題