Systemverilog вопрос о синтаксисе перекрестного покрытия - PullRequest
0 голосов
/ 05 марта 2019

Привет, я новичок в stackoverflow и systemverilog / uvm. В настоящее время я пытаюсь получить точку перекрестного покрытия, чтобы поймать условие (a == b) && (c == d), независимо от того, какое значение они имеют. Я попробовал следующие кресты, и ни один из них, кажется, не работает.

covergroup abcd_tracking with function sample (bit [7:0] a, bit [7:0] b, bit [7:0] c, bit [7:0] d);
  coverpoint a {   
    bins a_bin[1] = {[0:$]};
  }
  coverpoint b {   
    bins b_bin[1] = {[0:$]};
  }
  coverpoint c {   
    bins c_bin[1] = {[0:$]};
  }
  coverpoint d {   
    bins d_bin[1] = {[0:$]};



   abcd_cross : cross a,b,c,d 
  {
    bins abcd_bin =  abcd_cross with( (a==b) && (c==d) );

  }

   abcd_cross_2 : cross a,b,c,d 
  {
    bins abcd_2_bin =  ( binsof(a) intersect(b)  && binsof(c) intersect(d) );

  }


   abcd_cross_3 : cross a,b,c,d 
  {
    bins abcd_3_bin =  ( binsof(a) intersect{[0:$]} with (a==b)  && binsof(c) intersect{[0:$]} with (c==d) );

  }

На самом деле это должно быть недопустимым условием, которое никогда не будет достигнуто, но 3 точки перекрестного покрытия, кажется, постоянно получают удар, даже несмотря на то, что, проверяя мои файлы журнала, выбранные переменные не соответствуют условию, которое я пытаюсь определить в моем точка пересечения Каков правильный синтаксис для перехвата этого конкретного условия: "(a == b) && (c == d)"?

1 Ответ

0 голосов
/ 05 марта 2019

У вас есть ряд синтаксических ошибок, но, помимо этого, я думаю, что у вас есть некоторые неправильные представления о том, как работают точки покрытия и пересечения.

Ваши четыре точки покрытия имеют только одну ячейку для всех возможных значений.Это означает, что каждая ячейка получает удар по первому образцу с любым значением, которое составляет 100% покрытие для каждой из четырех точек покрытия в первом образце.А так как крестик создает ячейки для всех возможных комбинаций корзин, вы получаете только одну ячейку на первом примере.Таким образом, каждый из трех крестиков покрывается в первом примере.

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

coverpoint a {   
    bins a_bin[256] = {[0:$]};
}

Теперь простой крестикa, b, c, d создает 256 * 256 * 257 * 256 = 2 32 перекрестных корзин.Ячейки креста генерируются автоматически, и вы указываете ячейки, только если вы хотите, чтобы они были объединены или проигнорированы.Если вас интересуют только случаи, когда (a == b) && (c == d), вы проигнорировали все остальные ячейки с

abcd: cross a,b,c,d {
   ignore_bins not_equal = abcd with( a!=b || c!=d);
}
...