UVM 测试结束机制
UVM end-of-test mechanism
task mabu_scoreboard::main_phase(uvm_phase phase);
forever begin
# 1ns;
if(extip_rd_req_cnt - extip_rd_rsp_cnt >= `MABU_READ_OST_NUM) begin
hit_rd_max_outstanding = 1;
`uvm_info(get_type_name(),"reach read outstanding threshold!",UVM_NONE);
end else begin
hit_rd_max_outstanding = 0;
end
if(extip_wr_req_cnt - extip_wr_rsp_cnt >= `MABU_WRITE_OST_NUM) begin
hit_wr_max_outstanding = 1;
`uvm_info(get_type_name(),"reach write outstanding threshold!",UVM_NONE);
end else begin
hit_wr_max_outstanding = 0;
end
end endtask
forever
循环在一个耗时阶段(main_phase
)执行。测试可以正确终止,因为 main_phase
没有提出异议?
是的,没错。由于你的记分牌中的 main_phase
没有调用 raise_objection
,记分牌不会阻止测试结束。
您的大部分测试平台组件不会引起异议。您的测试(从 uvm_test
扩展而来的 class)在其 time-consuming 阶段提出异议是很常见的。
开始一个 time-consuming UVM 阶段,必须至少提出一个反对意见以防止该阶段被终止。终止一个阶段意味着所有 uvm_component
执行该阶段的进程都将被终止。
在您的记分牌示例中,我们必须假设其他一些组件对 main_phase
提出异议,否则 forever
循环将永远不会完成其第一次迭代。对于需要为整个测试执行的进程,最好使用 run_phase
。
除了时钟生成之外,在 UVM 测试台中有任何类型的延迟都是不好的做法。 UVM 测试台应该是基于事务的,唯一的延迟应该是生成时钟。具有 1ns 轮询延迟的 forever
循环对性能尤其不利。更好的方法是阻止等待事件。
task mabu_scoreboard::main_phase(uvm_phase phase);
forever begin
# 1ns;
if(extip_rd_req_cnt - extip_rd_rsp_cnt >= `MABU_READ_OST_NUM) begin
hit_rd_max_outstanding = 1;
`uvm_info(get_type_name(),"reach read outstanding threshold!",UVM_NONE);
end else begin
hit_rd_max_outstanding = 0;
end
if(extip_wr_req_cnt - extip_wr_rsp_cnt >= `MABU_WRITE_OST_NUM) begin
hit_wr_max_outstanding = 1;
`uvm_info(get_type_name(),"reach write outstanding threshold!",UVM_NONE);
end else begin
hit_wr_max_outstanding = 0;
end
end endtask
forever
循环在一个耗时阶段(main_phase
)执行。测试可以正确终止,因为 main_phase
没有提出异议?
是的,没错。由于你的记分牌中的 main_phase
没有调用 raise_objection
,记分牌不会阻止测试结束。
您的大部分测试平台组件不会引起异议。您的测试(从 uvm_test
扩展而来的 class)在其 time-consuming 阶段提出异议是很常见的。
开始一个 time-consuming UVM 阶段,必须至少提出一个反对意见以防止该阶段被终止。终止一个阶段意味着所有 uvm_component
执行该阶段的进程都将被终止。
在您的记分牌示例中,我们必须假设其他一些组件对 main_phase
提出异议,否则 forever
循环将永远不会完成其第一次迭代。对于需要为整个测试执行的进程,最好使用 run_phase
。
除了时钟生成之外,在 UVM 测试台中有任何类型的延迟都是不好的做法。 UVM 测试台应该是基于事务的,唯一的延迟应该是生成时钟。具有 1ns 轮询延迟的 forever
循环对性能尤其不利。更好的方法是阻止等待事件。