1. vmm_ms_scenario 也可以利用factory 模式
class cpu_rand_scenario extends vmm_ms_scenario;
cpu_trans blueprint;
`vmm_scenario_new(cpu_rand_scenario)
function new()
blueprint=new(); // factory should be in constructor, 没有替代的blueprint就用自己。
endfunction
`vmm_scenario_member_begin(cpu_rand_scenario)
`vmm_scenario_member_vmm_data(blueprint, DO_ALL,DO_DEEP)
`vmm_scenario_member_end(cpu_rand_scenario)
virtual task execute(ref int n);
cpu_trans tr;
....
$cast(tr,blueprint.copy());
assert(tr.randomize());
chan.put(tr);
n++;
endtask
endclass
这样factory就可以实现了(类似于atomic gen)
2. vmm_ms_scenario 中可以引用资源,不过new函数要带上相关的handler 参数。常用的资源有 ral, cfg, mam。
3. vmm_ms_scenario_gen 在start_xactor后会自动执行main,然后摸到scenario中执行execute函数。注意在execute 前会先设置 n 为0. 在执行完execute task 后,n_insts才会加上n, 然后判断 n_inst是否超出 stop_after_n_insts 从而决定是否发出DONE 的notify。
4. vmm_ms_scenario 的基类是 vmm_scenario, 因此 vmm_scenario 的函数也可使用,譬如
set_parent_scenario(vmm_scenario parent)
get_parent_scenario()
5. 在调用顶层scenario(即注册的scenario)中的execute函数之前会对顶层scenario进行randomize,子scenario不会被randomize,为了重用,不建议在ms_scenario中定义rand 成员,而是定义一个类,然后显示的randomize。