我的显示器中有以下代码:
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 :(得分:1)
您可能需要查看IEEE Std 1800-2012的第15章,其中详细介绍了与SystemVerilog语言提供的不同进程间同步和通信机制相关的每个方面。下面列出了这些选项(按照超链接查看几个示例以及如何使用它们):
答案 1 :(得分:0)
我会遵循命名事件方法,正如AndresM建议的那样,但如果你需要在同一个块中使用相同的触发条件快速同步,一个简单的#0
可能会解决问题,你是不可靠的由于模拟时间处理的原因。可能值得一试:
begin : clock_c
...
**check =1'b1;**
...
end
begin : main_0
...
#0;
**wait (vif.xn_valid == 1'b1);**
...
end
您也可以使用开始端块的标签来更好地查看和阅读,例如:
begin: main_0
,end: main_0
代替end // main_o