Я пытаюсь рандомизировать 3 разные переменные в системном Verilog, но циклически. Я имею в виду, что у меня есть следующие 3 переменные

rand int a;
rand int b;
rand int c;

constraint c_a{
  a inside {1,2};     
}
constraint c_b{
  b inside {1,2,3,4,5,6};
}
constraint c_c{
  c inside {1,2,3}
}

С указанными выше ограничениями существует всего 36 комбинаций всех трех переменных (2x6x3).

Но если мы запустим цикл из 36, вот так:

repeat(36) begin
  this.randomize(a,b,c);
  $display("%d   %d   %d", a,b,c);
end

Мы не выберем все возможные комбинации, так как некоторые комбинации могут повторяться. Следовательно, я ищу способ поразить все эти комбинации, выполнив цикл ровно 36 раз.

Я написал для этого метод грубой силы, объявив другую переменную rand для представления каждой комбинации и используя randc следующим образом:

int a;
int b;
int c;
randc int k;

constraint c_k{
  k inside {[1:36]};
}

repeat(36) begin
  this.randomize(k);
  // randomizing variable 'a' to one of the 2 values.
  if(k<9)
    a = 1;
  else
    a = 2;
  // randomizing variable 'b' to one of the 6 values.
  case(k)
    1,2,3,19,20,21 : b = 1;
    4,5,6,22,23,24 : b = 2;
    7,8,9,25,26,27 : b = 3;
    //
    //   finishing the sequence
    // 
  endcase  

  case(k)
     // similar case statement for the final variable
  endcase

  $display("%d, %d, %d", a,b,c);
end

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

Спасибо за помощь.

2
user3547407 29 Июн 2016 в 20:06

1 ответ

Лучший ответ

Что вы можете сделать, так это объединить ваши переменные в упакованную структуру и сделать ее переменной randc .

module top;
class A;
    typedef struct packed {
    bit [1:0]   a;
    bit [2:0]   b;
    bit [1:0]   c;
    } abc_t;
randc abc_t k;
constraint c_a{
  k.a inside {1,2};     
}
constraint c_b{
  k.b inside {1,2,3,4,5,6};
}
constraint c_c{
  k.c inside {1,2,3};
}
endclass
   A h = new;
   initial 
     repeat(40) begin
       h.randomize();
       $display("%0p",h.k);
     end
endmodule

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

4
dave_59 29 Июн 2016 в 20:49
Спасибо, Дэйв. Пробуя это, я обнаружил, что симулятор, который я использую, позволяет использовать до 32 бит или только 1 тип int. Это вроде бы мало. Я понимаю, почему вы изменили типы данных с int (в моем примере) на bit.
 – 
user3547407
29 Июн 2016 в 23:03
2
Подумайте, что вам нужно, чтобы справиться с 6-битным циклической случайностью. По сути, вам нужно было наметить все возможные решения и случайным образом выбрать одно из них. Решатель ограничений должен делать нечто подобное, и проблема растет экспоненциально по мере увеличения количества битов. При любом другом подходе к этой проблеме необходимо знать точное количество возможных решений, и это становится очень трудным по мере усложнения ограничений.
 – 
dave_59
30 Июн 2016 в 00:24