Как правильно исключить значение {'1} из группы покрытия?

Я реализовал следующую кавергруппу:

covergroup my_covergroup_cg  (input string name);
      enable_reg_cp : coverpoint enabled_reg[PARAM1-1:0] {
         illegal_bins no_enable = {0};
      }
      feature_active_reg_cp : coverpoint feature_active_reg_mask[PARAM2-1:0] { // Interested in covering a PARAM2-width chunk of a 32-bit feature_active_reg
         illegal_bins all_features_active = {'1}; // We must not activate all features (1 bit = 1 feature active)
      }      
      my_covergroup_cross : cross enable_reg_cp , feature_active_reg_cp {
         illegal_bins il0 = (binsof (enable_reg_cp) intersect {0});
         illegal_bins il1 = (binsof (feature_active_reg_cp) intersect {'1});
      }
   endgroup : my_covergroup_cg

При выполнении недопустимая корзина «il1» моего кросса получает значение «0x1» из feature_active_reg_mask[PARAM2-1:0] — что полностью допустимо и не соответствует {'1} (эквивалентно ..111111 : все).

Есть ли особая проблема с тем, как эти {'1} обрабатываются в области "binsof"?


person El_Gahaf    schedule 28.01.2020    source источник
comment
Обратите внимание, что PARAM2 абсолютно больше 1.   -  person El_Gahaf    schedule 28.01.2020
comment
Не так много помните о кавер-группах, чтобы знать наверняка, но пробовали ли вы вместо этого оператора репликации? ({$bits(feature_active_reg_cp){1'b1}}) Я предполагаю, что правая часть оператора intersect определяется сама по себе, поэтому '1 принимает ширину, равную 1 (см. LRM 2012; 5.7.1). (Помещаю это как комментарий, так как я действительно не уверен)   -  person Unn    schedule 28.01.2020


Ответы (2)


Это, скорее всего, проблема с инструментом. Согласно разделу 19.5.7 Разрешение значений в LRM 1800-20167, все выражения бинов оцениваются в контексте типа точки покрытия. Вы можете использовать [$:$] в качестве альтернативы, которая представляет максимально возможное значение.

НО... illegal_bins в cross не требуется, потому что пересекаются только включенные бины точки покрытия. И... когда вы определяете явный набор бинов, неявно определенных бинов нет, поэтому вы должны написать это как

covergroup my_covergroup_cg  (input string name);
      enable_reg_cp : coverpoint enabled_reg[PARAM1-1:0] {
         bins enable[] = {[1:$]}; // will be split into N bins according to auto_bins_max
      }
      feature_active_reg_cp : coverpoint feature_active_reg_mask[PARAM2-1:0] { // Interested in covering a PARAM2-width chunk of a 32-bit feature_active_reg
         bins some_features_active = {[0:$]}; 
         ignore_bins all_features_active = {[$:$]}; // We must not activate all features (1 bit = 1 feature active)
      }      
      my_covergroup_cross : cross enable_reg_cp , feature_active_reg_cp;
   endgroup : my_covergroup_cg

Во 2й точке покрытия значение $ перекрывает две спецификации бина, но ignore_bins переопределяет это.

person dave_59    schedule 28.01.2020
comment
Спасибо за ответ. Я уже использовал [$:$] и заметил, что инструмент рассматривает его как диапазон, а не как максимальное значение, поэтому он делает незаконными все возможные значения, которые может получить точка покрытия. - person El_Gahaf; 30.01.2020

Просто чтобы поделиться своим обходным путем для обмена знаниями: я решил использовать семантику localparam. Судя по всему, проблема связана с инструментом, интерпретирующим файл {'1}. Я сделал следующее:

localparam all_ones = {PARAM2{1'b1}};
covergroup my_covergroup_cg  (input string name);
      enable_reg_c .... // rest of code

и я передал псевдоним в свой illegal_bins

illegal_bins il1 = (binsof (feature_active_reg_cp) intersect {all_ones});

Ваше здоровье,

person El_Gahaf    schedule 30.01.2020