2017-02-22 8 views
-1

私は自分のモニターに次のコードを持っている:システムVerilog-特定のコードが別のコードより先に実行されるようにする方法は?

virtual task run_phase(uvm_phase phase); 
     fork 
    begin : clock_c 
     forever begin 
      wait(vif.fact_log2_samp != fact_log2_samp_init); 
      for(int counter = 0; counter < 46; counter++) begin 
      check = 1'b0; 
      @(posedge vif.clk); 
      end 
      **check =1'b1;** 
     end// forever 
    end// clock_c 
    begin : main_0 
     forever begin 
      mon_trx = tx_lin_int_transaction::type_id::create("mon_trx"); 
      mon_trx.fact_log_2 = fact_log2_samp_init;   
      **wait (vif.xn_valid == 1'b1);** 
      #1; 
      mon_trx.rand_data_xi = vif.xi; 
      mon_trx.rand_data_xq = vif.xq; 
      if (check == 1'b0) 
     mon_trx.check = FALSE; 
      else 
      fact_log2_samp_init = vif.fact_log2_samp; 
      $cast(t, mon_trx.clone()); 
      //send transaction to scoreboard via TLM write() 
      ap.write(t); 
      wait (vif.xn_valid == 1'b0); 
     end// forever 
    end// main_0 
     join 
    endtask: run_phase 

問題が

wait(vif.xn_valid == 1'b1); 

、それは

check =1'b1; 

(同時に)直前に実行した後にコードということです。

check =1'b1; 

を確実に実行するにはどうすればよいですか?

+0

のは、[イベント](HTTPSを使用します//verificationacademy.com/forums/uvm/what-difference-between-event-and-wait-event.triggered)(要件に応じてエッジまたはレベルがトリガーされることがあります)。 'check = 1'b1;の直後に' clock_c'でイベントをトリガし、 'main_0'スレッドで待機します。 – sharvil111

+0

@ sharvil111 - どうやって悪魔をかけることができますか? – sarad

+0

[this](http://www.verificationguide.com/p/systemverilog-events.html)と類似したものです。いくつかのロジックを変更しました。 – sharvil111

答えて

0

は私が続くだろうという名前イベントメソッド、AndresMが示唆したように、まったく同じブロックで同じトリガー条件でクイックシンクを必要とする場合は、単純な#0が問題を解決するかもしれません、それはシミュレーション時間の処理のために信頼できません理由。試してみる価値があります:

begin : clock_c 
    ... 
    **check =1'b1;** 
    ... 
end 
begin : main_0 
    ... 
    #0; 
    **wait (vif.xn_valid == 1'b1);** 
    ... 
end 

また、あなたが例えば、見て、より良い読み始めるエンド・ブロックのラベルを使用することができます。: begin: main_0end: main_0代わりend // main_o

+0

私はあなたが私の質問に投票したことを感謝します(私はいくつかの答えがあるなら正当な質問だと思う...)。 – sarad

+0

私は既にsucsessなしで0を試しました。 – sarad

+0

この他の[スレッド](https://verificationacademy.com/forums/systemverilog/question-about-0)で@ dave_59の返信を確認してください。場合によっては#0が動作するかもしれませんが、それはちょうどハックです。言語が提供する構造体を使用することを学ぶなら、あなたはもっと良いでしょう。 – AndresM

1

IEEE Std 1800-2012の15章を参照してください。ここでは、SystemVerilog言語が提供するさまざまなプロセス間同期および通信メカニズムに関連するあらゆる側面について詳しく説明しています。これらのオプションは、(いくつかの例を見るためにハイパーリンクをたどると、それらの一つ一つを使用する方法)の下に記載されています:

  1. Semaphores
  2. Mailboxes
  3. Named Events
関連する問題