在UVM测试中,我声明并启动序列,但具有相同参数的单独序列的输出是"相关的"不知怎的(见底部的例子),所以当我跨越覆盖范围时,我只覆盖了12.5%的情况,是什么导致这种情况?如何使两个序列的输出独立且随机?
//declare
ve_master_sequence#( 8,`num_inputs) x_agent_sequence_inst;
ve_master_sequence#( 8,`num_inputs) y_agent_sequence_inst;
//build_phase
x_agent_sequence_inst = ve_master_sequence#( 8,`num_inputs)::type_id::create("x_seq");
y_agent_sequence_inst = ve_master_sequence#( 8,`num_inputs)::type_id::create("y_seq");
//run_phase
x_agent_sequence_inst.start(multadd_env_inst.ve_x_agent_inst.sequencer);
y_agent_sequence_inst.start(multadd_env_inst.ve_y_agent_inst.sequencer);
环境包含4个主代理,两个32位,两个8位。在所有代理上运行相同的参数化序列
// within the sequence
virtual task body();
`uvm_info("ve_master_sequence", $sformatf("begin body()"), UVM_MEDIUM);
for(int i=0; i<length; i++) begin
req = ve_seq_item#(data_width)::type_id::create("req");
start_item(req);
while(!req.randomize() with {
data <= (2**data_width)-1;
delay dist { [0:1] := 2, [2:6] := 1};
});
finish_item(req);
get_response(req);
end
#1000;
endtask
我用$ urandom_range替换了req.randomize(),但这意味着丢失了systemverilog的所有约束随机能力。
当我运行代码并进行交叉覆盖时,序列号的输出之间存在相同大小的关系,
when y = 0 is always x = 79 or 80
when y = 1 is always x = 80 or 81
when y = 2 is always x = 81 or 82
....
when y = 51 is always x = 130 or 131
when y = 52 is always x = 131 or 132
等。
答案 0 :(得分:1)
显然,UVM使用其父随机数生成器和序列name为序列创建新的RNG。这是为了给予好random stability。
尝试更改序列的名称,使其更加独特。我假设更长的独特字符串提供更高程度的随机化。
答案 1 :(得分:0)
在序列类中,这个循环创建了序列项。解释是(如上所述)UVM使用类层次结构来创建随机种子,这提供了良好的随机稳定性
for(int i=0; i<1000; i++) begin
//this caused the error
req = ve_seq_item#(data_width)::type_id::create("req");
//this fixed it
req = ve_seq_item#(data_width)::type_id::create($sformatf("req_%1d", i));
//randomizing the sequence item with the loop variable