Как правильно исключить значение {'1} из группы обложек? - PullRequest
0 голосов
/ 28 января 2020

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

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"

Ответы [ 2 ]

1 голос
/ 28 января 2020

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

НО ... 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 nd точке покрытия значение $ перекрывает две спецификации bin, но ignore_bins переопределяет это.

0 голосов
/ 30 января 2020

Просто чтобы поделиться своим обходным путем для обмена знаниями: я решил go с использованием localparam semanti c. Как представляется, проблема связана с инструментом, интерпретирующим {'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});

Приветствия,

...