Phase机制之-phase_jump的使用场景
应用场景:在验证复位时,需要对正在运行的测试平台进行复位,再次拉高复位信号后,DTU输出的信号是否正确?
采用phase_jump可以使整个测试平台复位,并且再次复位后,可以使得复位后的DUT输出结果继续自动比对。
首先在driver中使用phase_jump,使得整个测试平台进行reset_phase
bit rst_flag; //启动再次复位的标志,在随机约束的tc中进行配置
int cnt=0; //用于停止phase_jump,目前该方法的使用不纯属,暂时采用此方法。不然仿真会发生循环。
task my_driver::main_phase(uvm_phase phase);forkdriver_one_pkt(u_xaction);if(u_xaction.rst_flag == 1'b1) begincnt++;`uvm_info(get_type_name(), $sformatf("cnt value:%d", cnt), UVM_MEDIUM)if(cnt == 2) beign$finish;endelse beign//jump reset phasephase.jump(uvm_reset_phase::get());endendelse begin#(CLK_PERIOD)bus.rst_n = 1'b1;endjoin
endtask: main_phase
在monitor里的reset_phase中删除reference model的遗留数据
task my_monitor::reset_phase(uvm_phase phase);super.reset_phase(phase);u_dout.delete(); //用于收集DUT输出的队列,进行删除遗留数据g_dout.delete(); //用于收集RM输出的队列,进行删除遗留数据//还有一些算法过程中会产生遗留的数据,在此一并删除或初始化。
endtask: reset_phase
在sequencer中加入stop_sequence,目的是为了再次复位后会有两个激励发送给sequencer,产生报错,此操作可以清除之前的激励发生动作。
class my_sequencer extends uvm_sequencer #(dtc_cal_xaction);task reset_phase(uvm_phase phase);phase.raise_objection(this);stop_sequences();phase.drop_objection(this);endtask
endclass: my_sequencer
在xaction中声明rst_flag信号
class my_xaction extends uvm_sequence_item;rand bit rst_flag;constraint rst_constr { soft rst_flag == 1'b0; }; //软约束,优先级比较低,如果与TC中的约束发生冲突,以TC中的为主。endclass: my_xaction
编写一个复位验证的TC,在正常发生数据包后,某一时刻进行复位,然后再继续发送数据包。
在test-case中,在正常数据包中间插入复位动作。
begin repeat(100) begin`uvm_dp(req)endbegin `uvm_do_with(req,{ req.rst_falg == 1'b1;})endrepeat(100) begin`uvm_do(req)end
end
参考文章:
https://ziqiangt.github.io/2019/11/07/UVM-%E9%AA%8C%E8%AF%81%E9%9A%8F%E6%9C%BAreset%EF%BC%88phase-jump%EF%BC%89/
https://zhuanlan.zhihu.com/p/412956948
https://zhuanlan.zhihu.com/p/60576096