2016-04-13 19 views
0

これらの私のテストベンチでのシミュレーション性能を妨げ、その理由(システムのverilogコンパイラの観点から答えを探してい):比較シミュレーション性能

task A; 
wait(dut_if.a==1); 
. 
. 
endtask 

OR

task A; 
    forever @(posedge clk) begin 
    if(dut_if.a==1).. 
    end 
endtask 

PS: " a "は、シミュレーション中にあるクロックエッジでアサートされるdut信号です。このタスクが1回だけ呼び出されたとします。

+0

ご意見ありがとうございます。だから、私が理解していることから、永遠にブロックされた後、常に低レベル言語に変換されると、実際には割り込みサービスルーチンの一部となり、待機文が分岐命令のようなものになります。私が間違っているなら私を訂正してください。コンパイラの観点からシステムのVerilogについて話しているいくつかのソースを私に教えていただければ幸いです。 –

答えて

2

第1のオプションはパフォーマンスが向上します。私はあなたの使用のコンテキストで、両方のオプションが機能的に正しいと仮定しています。

2番目のコードは、すべてのクロックで待機し、次に状態をチェックします。待機は永遠のループの内部にあるので、このコードはclkのすべてのposedgeでコンテキスト切り替えを引き起こします。一方、オプション1のコードはコンテキストを1回だけ切り替えます。

4

2つは機能的に同等ではありません。

 _ _ _ _ _ 
clk _| |_| |_| |_| |_| |_ 
      ______________ 
a ______| 

      | | 
      1 2 

番号はお見せそれぞれがトリガーされますとき:a(すなわち同じサイクルを正確なもの)、第二のスニペットはaは「見」されるまでのクロックサイクルで高いことが待機し、一方、高レベルになるまで、最初のスニペットは、待機します。何が本当に欲しいのです:

@(posedge clk iff dut_if.a); 

これは(何もコンテキストが切り替わりませんので速い)@Coverifyのコメントはここにも適用されるべきである2.スニペットと同じ意味です。

0

両方のオプションが機能的に同等ではありません。

しかし、この場合、第2のオプションは第1のオプションよりも優れた性能を発揮します。

、第一オプションで、ツールは、第二のオプションで、ツールだけで posedgeではなく、各タイムステップをチェックします一方、各 、すべてのタイムステップでの値をチェックする必要があるので

0

どちらが優れたパフォーマンスを備えていますか?シミュレータの実装によって異なります。真のイベントベースシミュレータでは、評価コードがクロックエッジごとに起床しないため、ケース1の方がパフォーマンスが向上します。しかし、評価コードがクロックティックとうまく一致しているため、ケース2は現実世界でパフォーマンスが向上すると考えられます。

コードで非同期ロジックをモデル化していない場合は、ケース2を使用することをおすすめします。コードは理解しやすく理解しやすいです。あなたの人生をはるかに簡単にするクロックとすべてを整列。