UVM にマルチスレッドを組み込むにはどうすればよいでしょうか。UVM テストベンチのスレッド、拡張 UVM コンポーネント、シーケンス、および fork と join の間のメソッドですか? 私が調べた限りでは、このようなマルチスレッド テストベンチは、ハードウェアの複数のコアに対して設計が分割されていない限り、シミュレーション時間の高速化やパフォーマンスの向上にほとんど影響を与えません。そうですか?
2 に答える
SystemVerilog/UVM のコンテキストでのマルチスレッドは、マルチコア ハードウェアとは関係ありません。EDA ベンダーはマルチコア サポートを提供していますが、コーディングによって制御できるものではありません。
この質問も見てください:複数のコアで UVM フェーズを実行しています。
余談ですが:
HDL シミュレーションは、並行して発生する信号の更新をキャプチャする必要があるため、本質的にマルチスレッドです。SystemVerilog を使用すると、ユーザーは一連fork...join
の構造を使用して独自の並列実行スレッドを生成することもできます。UVM 自体は、この機能を多用して、たとえばシーケンスを開始し、すべてのコンポーネントの実行フェーズを並行して開始します。もちろん、fork...join
必要に応じて独自のコードで を使用して、独自の並列スレッドを開始することもできます。
別のメモ: SV でこのようにスレッドを開始するための用語は、「並列プロセスの開始」だと思います。
私には、質問と回答の両方が混乱を示しています。Ahlawat は 2 つの質問をしているようです。
(1) UVM テストベンチは本質的にマルチスレッド化されていませんか? と
(2) そうでない場合、UVM テストベンチにマルチスレッドを導入できますか?
HDL シミュレーションは本質的にマルチスレッドであるという記述は正しくないと思うので、質問 #1 に対する回答は混乱を招くと思います。HDL シミュレーションは、すべての異なる電子コンポーネントが並列に動作するハードウェア設計の並列処理をモデル化しようとします。ただし、これをモデル化するためにマルチスレッドを使用しません。代わりに、HDL シミュレーター (もちろんそれ自体がプログラムです) は、少なくとも伝統的にはシングルスレッド プログラムです。単一のスレッド化されたプログラムで並列処理の効果をモデル化することは十分に可能であり、それが HDL シミュレーターの機能です。並行処理のモデル化、つまり物事が同時に起こっているように錯覚させることは、物事が実際に同時に起こっていることと同じではありません。
マルチスレッドとは、特定のプログラムを、同時に実行できる複数のプログラムに分割することを意味します。現在、それらが実際に同時に実行される かどうかは、オペレーティング システム次第です。
また、オペレーティング システムは、マシンのプロセッサとメモリ アーキテクチャによって制約を受けます。
- マルチコア コンピューターでは、1 つのコアでさまざまなスレッドが実行される可能性が非常に高くなります。
- コアが旧式のタイプであり、内部で複数のスレッドをホストする機能がないシングルコア コンピューターでは、マルチスレッドは実際には発生せず、むしろ、異なるスレッドが切り替えられます。コンテキストスイッチとして。
さて、以上のことをすべて述べたので、与えられた答えの 1 つの側面は的を射ていました。それは、UVM 自体の一部ではなく、Verilog と System Verilog の一部ではない fork-join 構造により、本質的に、テストベンチ内の特定のコードを別のスレッドで実行することをオペレーティング システムに伝えます。ただし、これは UVM ライブラリ自体のプロパティではなく、Verilog/System Verilog の構造です。