System Verilog-如何确保特定代码在另一个之前执行?

时间:2017-02-22 17:13:40

标签: system-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;

将在之前执行吗?

2 个答案:

答案 0 :(得分:1)

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

  1. Semaphores
  2. Mailboxes
  3. Named Events

答案 1 :(得分: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