2015-12-09 4 views
1

В тесте 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 

Я заменил req.randomize() с $ urandom_range, который работал, но это означает потерять все затрудненные случайные способности 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

Вопрос: Просьба уточнить. – Hida

+2

Существуют ли какие-либо ограничения внутри класса ve_seq_item? Попробуйте отключить свой 'while (! Req.randomize() ...' с '' if (reg.randomize() ...) else 'uvm_error (...)' '. Это будет сообщать о любых ошибках вместо застревание в цикле while. – Hida

+0

изменение «if» не сообщало о каких-либо ошибках, но, возможно, это ключ, если я изменяю имя переменной последовательности, соотношение между номерами, выводимыми с помощью последовательности изменений, спасибо за комментарии – StanOverflow

ответ

1

Видимо УВМ использует родительский Random Генератор чисел и последовательность name, чтобы создать новый RNG для последовательности. Это должно дать хороший random stability.

Попробуйте изменить имена последовательностей, чтобы сделать их более уникальными. Я предполагаю, что более длинные уникальные строки дают более высокую степень рандомизации.

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