質問

Verilog でタスクが auto キーワードを使用して宣言されている場合、それは何を意味しますか?

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

注記:この質問の主な理由は、サイトにハードウェア プログラマーがいるかどうか知りたいからです。:)

役に立ちましたか?

解決

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

ご存知のように、私たちの中には Verilog を使用している人もいます...(うーん)

他のヒント

「自動」は実際には「再入可能」を意味します。この用語自体はソフトウェア言語から盗まれたものです。たとえば、C には、変数が含まれるスコープが実行されるときにスタックに割り当てられ、その後割り当てが解除されるように宣言するための「auto」キーワードがあります。これにより、同じスコープの複数の呼び出しが実行されます。その変数の永続的な値は表示されません。C でこのキーワードを聞いたことがないのは、これがすべての型のデフォルトのストレージ クラスだからです :-) 代替案は「静的」です。これは、「この変数を静的に (メモリ内の単一のグローバルな場所に) 割り当てる」ことを意味します。 「関数が何回呼び出されたかに関係なく、プログラムの実行中はこの同じメモリ位置を参照します」、および「揮発性」とは、「これは、私の SoC 上の別の場所のレジスタ、または私が持っていない別のデバイス上の何かである」ことを意味します。を制御する。コンパイラ、コード内に中間書き込みを行わずに以前の読み取りから私の値を知っていると思っている場合でも、私への読み取りを最適化しないでください。」

「automatic」は再帰関数を対象としていますが、同じ関数を異なる実行スレッドで同時に実行することも目的としています。たとえば、(Verilog の fork->join ステートメントを使用して) N 個の異なるブロックを「フォーク」し、それらすべてで同じ関数を同時に呼び出すと、関数がそれ自体を再帰的に呼び出す場合と同じ問題が発生します。

多くの場合、コードはタスクや関数を「自動」として宣言しなくても問題ありませんが、特にそうする必要がない限り、コードを宣言することをお勧めします。

「automatic」キーワードを使用すると、再帰関数を作成することもできます (verilog 2001 以降)。底に達すれば合成可能になるはずだと思いますが、ツールのサポートがあるかどうかはわかりません。

私もVerilogやってます!

ウィルとマーティが言うように、自動は再帰関数を目的としていました。

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

関数を自動にするとこの問題は修正されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top