3-phase的超时退出(timeout,仅限于run_phase,内含wait(0)以及phase.get_name())
资料来源
(1) UVM实战-张强;
(2) UVM source code;
注意:wait(expression)会一直阻塞,直到expression为真; wait(0)表示永远阻塞,这种用法会在UVM source code中遇到;
1.phase的超时退出
(1)背景: 验证平台运行时,有可能会出现挂起的情况; 这种情况下,仿真时间一直往前走,但是driver或monitor并没有发出或收到transaction;
(2)方法: 一个测试用例的运行时间可以预计,超过这个时间,通常出错,可以使用UVM的set_timeout方法设置超时时间;
1.1通过uvm_root的set_timeout函数可以设置超时时间;
(1) set_timeout的第一个参数为要设置的时间,第二个参数表示此设置是否可以被其后的其他set_timeout语句覆盖;
注1:默认的超时时间是通过宏UVM_DEFAULT_TIMEOUT来指定的;
注2:在uvm_phase的execute_phase task中,存在fork join_any线程,其中一个线程会判断当前phase是否为run_phase,如果是run_phase,则会delay top.phase_timeout,并退出线程;如果当前phase不是run_phase,则不会delay top.phase_timeout,而是执行wait(0),相当于该线程无限阻塞;
注3:phase.get_name()可以获取当前phase的名字,如build,main,run,connect等,详见uvm_common_phases.svh注释部分;
1.2通过仿真命令行进行设置