Допустим, у вас есть следующий класс с переменной массива:
class some_class;
rand int array[10];
endclass
Если вы хотите ограничить каждый элемент массива, вы можете использовать конструкцию foreach
. Чтобы получить все четные числа в массиве, вы можете ограничить каждый элемент массива нечетными. Число нечетное, если остаток от деления на 2
не 0
:
class some_class;
// ...
constraint all_array_elems_odd {
foreach (array[i])
array[i] % 2 != 0;
}
endclass
Вы можете проверить, работает ли он, используя следующий пример:
module test;
initial begin
automatic some_class obj = new();
if (!obj.randomize())
$fatal(0, "Randomization error");
$display("%p", obj);
end
endmodule
Обратите внимание, что я не использовал сравнение остатка деления с 1
. Это происходит потому, что некоторые языки программирования (включая SystemVerilog) используют %
для операции с остатком, а не операции с модулем. Остаток может быть отрицательным (тогда как модуль всегда положителен). Отрицательные нечетные числа будут иметь остаток -1
, поэтому, если оставить остаток равным 1
, эти числа будут положительными.