2015-03-22 4 views
2

Я не исключаю некоторые поля из рандомизации на основе определенного условия, которое само определяется во время одного и того же запуска рандомизации. Это означает, что я не могу использовать rand_mode(0), так как это нужно вызвать перед вызовом randomize().Исключить некоторые поля из рандомизации во время запуска генерации

Вот простой пример того, что я имею в виду. Скажем, у меня есть класс с 2-х целочисленных полей и булево, который решает, следует ли рандомизации второе поле или сохранить свою постоянную величину (то есть один перед вызовом randomize()):

class some_item; 
    rand bit do_rand_other_field; 
    rand int some_field; 
    rand int some_other_field; 

    // ... 
endclass 

Единственное, что я могу придумать, чтобы объявить дополнительное локальное поле, которое будет хранить значение some_other_field до рандомизации бега:

class some_item; 
    // ... 

    local int some_other_field_init; 

    function void pre_randomize(); 
    some_other_field_init = some_other_field; 
    endfunction 

    // ... 
endclass 

Когда do_rand_other_field это не так, я просто сдерживал поле, чтобы занять свое первоначальное значение:

class some_item; 
    // ... 

    constraint randomize_some_other_field { 
    if (!do_rand_other_field) 
     some_other_field == some_other_field_init; 
    } 

    // ... 
endclass 

Это работает, но если у меня много таких условно рандомизированных полей, это может стать неэффективным для их хранения и копирования. Я мог бы объявить эти «начальные» поля как static, и это уменьшит потребление памяти, но время от времени копирования будет продолжаться.

Механизм рандомизации должен хранить эти значения где-то, так как в случае противоречия ограничения он вернет нерандомизированный объект. Я бы хотел найти способ использовать эту ценность. Есть ли какая-то особенность языка, который я забыл, что может помочь мне сделать это?

+0

Подходящий пример можно найти на EDAPlayground: http://www.edaplayground.com/x/8nS –

ответ

1

Там нет особенности SystemVerilog делать то, что вы просите либо без копирования состояния вы потенциально хотите сохранить, или разделения на независимые randomizations (объекты отдельного случайного класса или 2-пропуск на тот же объект)

Решатели ограничений в SystemVerilog работают концептуально, сначала создавая пространство решения, а затем произвольно выбирая одно из решений. Вы не можете динамически изменять случайность одной из переменных в процессе построения пространства решений.

Я полагаю, что SystemVerilog может быть улучшен, так что обращение к предыдущему значению случайной переменной может быть использовано в ограничении как переменная состояния, но в любом случае это будет на несколько лет.

+0

Вид того, что я ожидал, но я хотел услышать его из уст лошади. Сегодня не было хорошего дня для науки. –

0

С моей точки зрения, pre/post_randomize не всегда называются. А также из Mentor Graphics они предлагают избегать их использования. Для вашего случая, можно ли последовательно поместить значение последней транзакции? Сделайте обычную рандомизацию в элементе последовательности. Затем проверьте поле, чтобы решить, нужно ли переопределить другое со старым значением.

+0

Я не хочу делать 2-х рандомизацию. –

+0

Hi @Tudor. Извините за мой плохой английский, и я не уверен, что вы имеете в виду «2-х рандомизация». Я просто поместил здесь модифицированный код, вы можете посмотреть. [Http://www.edaplayground.com/x/N4a](http://www.edaplayground.com/x/N4a). –

+0

Двухступенчатая рандомизация означает, что вы сначала рандомизируете часть объекта, а затем снова запускаете рандомизацию и снова производите ее. –

Смежные вопросы