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 语言提供的不同进程间同步和通信机制相关的各个方面。下面列出了这些选项(点击超链接查看一些示例以及如何使用它们中的每一个):
我会按照 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
我的监视器中有以下代码:
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 语言提供的不同进程间同步和通信机制相关的各个方面。下面列出了这些选项(点击超链接查看一些示例以及如何使用它们中的每一个):
我会按照 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