systemverilog で循環二重リンク リスト クラス (単一の番兵ノードを持つ) を実装しようとしました。リスト自体は期待どおりに動作しているように見えますが、最終的にシミュレーターがクラッシュします (スタックの破損?)
これは、これが言語によって根本的にサポートされていないものなのではないかと思いました (割り当てに関して)。SV には、同じ方法で動作させることができる「キュー」構造があります (おそらく、アクセス時間と挿入時間の両方でより効率的です)。
何か案は?
systemverilog で循環二重リンク リスト クラス (単一の番兵ノードを持つ) を実装しようとしました。リスト自体は期待どおりに動作しているように見えますが、最終的にシミュレーターがクラッシュします (スタックの破損?)
これは、これが言語によって根本的にサポートされていないものなのではないかと思いました (割り当てに関して)。SV には、同じ方法で動作させることができる「キュー」構造があります (おそらく、アクセス時間と挿入時間の両方でより効率的です)。
何か案は?
SystemVerilog にはキュー構造があります。宣言は配列と少し似ていますが、次の$
記号を使用します。
int myqueue[$]; // $ indicates a queue
myqueue.push_front(14);
some_int = myqueue.pop_back();
push_front()
メソッド、push_back()
、pop_front()
およびをどのように組み合わせて使用するかによってpop_back()
、スタックや FIFO などを実装できます。簡単なインターネット検索で、メソッドと宣言オプションの完全なリストが得られるはずです。
SystemVerilog キューが合成可能かどうかは疑問です。そして、最初にインデックスをチェックせずに循環バッファーを作成する方法については、100% 確信が持てません...
私が離れている言語に本質的に欠けているものは何もありません。ほとんどすべてが参照渡しなので、それが必要な主なものです。私が考えることができる唯一の落とし穴は、SV がガベージ コレクションであることを覚えておくことです。そのため、インスタンスがリストから削除されたときに、インスタンスへの参照を無効にすることが重要です (ただし、とにかくそうするでしょう)。
キューがリンクされたリストとして内部的に実装されると確信しています。そうは言っても、奇妙で素晴らしい方法でキューを使用したいときに、さまざまなシミュレーターでいくつかの問題が発生しました。
SystemVerilog はガベージ コレクション言語です。循環リンク リストは、使用しているシミュレーターによって実装されたガベージ コレクション スキームにバグがある場合、問題を引き起こす可能性があります。