Если у меня есть массив фиксированного размера, как мне написать ограничение, чтобы каждый многобитный элемент массива после рандомизации был нечетным числом - PullRequest
0 голосов
/ 15 января 2019

Мне нужно генерировать нечетные числа после рандомизации элементов массива в последовательности UVM.

1 Ответ

0 голосов
/ 15 января 2019

Допустим, у вас есть следующий класс с переменной массива:

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, эти числа будут положительными.

...