System Verilog-如何确保特定代码先于另一代码执行?

System Verilog- How to ensure that specific code will be executed before another?

我的监视器中有以下代码:

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;

之前会执行吗?

您可能想看看 IEEE Std 1800-2012 的第 15 章,其中详细介绍了与 SystemVerilog 语言提供的不同进程间同步和通信机制相关的各个方面。下面列出了这些选项(点击超链接查看一些示例以及如何使用它们中的每一个):

  1. Semaphores
  2. Mailboxes
  3. Named Events

我会按照 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