Рандомизация параметризованного класса внутри класса не работает - PullRequest
0 голосов
/ 21 мая 2019

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

typedef enum logic [1:0] {
  TWO_LEGS,
  FOUR_LEGS,
  SIX_LEGS,
  EIGHT_LEGS
} leg_e;

typedef enum logic [2:0] {
  HUMAN,
  DOGS,
  CAT,
  ELEPHANT,
  FLY,
  COCKROACH,
  SPIDER
} animal_e;

class parameterized_class #( type enum_type);
  static int initial_allocation;
  static enum_type list[$];

  rand int unsigned ptr;

  constraint ptr_c {
            ptr < list.size();
  }

 function new();
   enum_type my_enum;
    if(initial_allocation == 0) begin
      initial_allocation = 1;
      for(int unsigned i = 0; i < my_enum.num(); i++)
        repeat($urandom_range(1,10)) list.push_back(my_enum);
    end
  endfunction
endclass

class random_class;
  rand parameterized_class#(leg_e) leg_select;
  rand parameterized_class#(animal_e) animal_select;

  rand leg_e leg_q[$];
  rand animal_e animal_q[$];

  constraint leg_animal_c {
      leg_select.list[leg_select.ptr] == TWO_LEGS -> animal_select.list[animal_select.ptr] inside {HUMAN};
      leg_select.list[leg_select.ptr] == FOUR_LEGS -> animal_select.list[animal_select.ptr] inside {DOGS, CAT, ELEPHANT};
      leg_select.list[leg_select.ptr] == SIX_LEGS -> animal_select.list[animal_select.ptr] inside {FLY, COCKROACH};
      leg_select.list[leg_select.ptr] == EIGHT_LEGS -> animal_select.list[animal_select.ptr] inside {SPIDER};
  }

  constraint q_c {
      leg_q.size() dist {[0:5] := 50, [6:10] := 50};
      animal_q.size() == leg_q.size();
      foreach(leg_q[i]) {
        leg_q[i] == leg_select.list[leg_select.ptr];
        animal_q[i] == animal_select.list[animal_select.ptr];
      }
  }
  function new();
    leg_select = new;
    animal_select = new;
  endfunction
endclass

module tb;
  initial begin
    random_class rnd = new;
    repeat (10) begin
      rnd.randomize();
      $display("Animals in queue = %p", rnd.animal_q);
      $display("Legs in queue = %p", rnd.leg_q);
    end
  end
endmodule

Я получаю сообщение об ошибке:
Решатель не найдет массив «animal_select.list», проиндексированный случайным образом переменная 'animal_select.ptr'. Пожалуйста, попробуйте использовать переменную состояния, константу или переменную цикла для массива индекс.

Какую модификацию я должен сделать, чтобы получить такой результат, как: {СОБАКИ, КОШКА, ЧЕЛОВЕК, СЛОН} {FOUR_LEGS, FOUR_LEGS, TWO_LEGS, FOUR_LEGS,}

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Я вставил $diplay() отладку в ваш код

foreach (list[i]) $display(list[i].name());

и увидите, что ваша инициализация неверна. Вы всегда помещаете первое перечисление в список. Я изменил твой код на

  for(int unsigned i = 0; i < my_enum.num(); i++) begin
    /*repeat($urandom_range(1,10))*/ list.push_back(my_enum);
    my_enum = my_enum.next();
  end

и это работает. Код EDA здесь .

И почему все очереди имеют одинаковые элементы, это из-за ваших ограничений

  foreach(leg_q[i]) {
    leg_q[i] == leg_select.list[leg_select.ptr];
    animal_q[i] == animal_select.list[animal_select.ptr];
  }
0 голосов
/ 21 мая 2019

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

typedef enum logic [1:0] {
  TWO_LEGS,
  FOUR_LEGS,
  SIX_LEGS,
  EIGHT_LEGS
} leg_e;

typedef enum logic [2:0] {
  HUMAN,
  DOGS,
  CAT,
  ELEPHANT,
  FLY,
  COCKROACH,
  SPIDER
} animal_e;


class random_class;
  rand leg_e leg_q[$];
  rand animal_e animal_q[$];

  constraint leg_animal_c {
    foreach (leg_q[i]) leg_q[i] == TWO_LEGS   -> animal_q[i] inside {HUMAN};
    foreach (leg_q[i]) leg_q[i] == FOUR_LEGS  -> animal_q[i] inside {DOGS, CAT, ELEPHANT};
    foreach (leg_q[i]) leg_q[i] == SIX_LEGS   -> animal_q[i] inside {FLY, COCKROACH};
    foreach (leg_q[i]) leg_q[i] == EIGHT_LEGS -> animal_q[i] inside {SPIDER};
  }

  constraint q_c {
    leg_q.size() dist {[0:5] := 50, [6:10] := 50};
      animal_q.size() == leg_q.size();
  }
endclass

module tb;
  initial begin
    random_class rnd = new;
    repeat (10) begin
      rnd.randomize();
      $display("Animals in queue = %p", rnd.animal_q);
      $display("Legs in queue = %p", rnd.leg_q);
    end
  end
endmodule

https://www.edaplayground.com/x/3rh8

...