Я не исключаю некоторые поля из рандомизации на основе определенного условия, которое само определяется во время одного и того же запуска рандомизации. Это означает, что я не могу использовать 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
, и это уменьшит потребление памяти, но время от времени копирования будет продолжаться.
Механизм рандомизации должен хранить эти значения где-то, так как в случае противоречия ограничения он вернет нерандомизированный объект. Я бы хотел найти способ использовать эту ценность. Есть ли какая-то особенность языка, который я забыл, что может помочь мне сделать это?
Подходящий пример можно найти на EDAPlayground: http://www.edaplayground.com/x/8nS –