UVM序列产生相关数字

时间:2015-12-09 10:38:50

标签: system-verilog verification uvm

在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

等。

2 个答案:

答案 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