Systemverilog точка покрытия для кратного n

Я пытаюсь создать корзину в моей группе покрытия для выборки значений, кратных n (где n - это постоянное целое число в моем случае 15). До сих пор я придумал следующий код:

class rx_port;
      int unsigned rx_rates[];
      ...
      covergroup rx_cov with function sample (int unsigned rate);
           coverpoint rate{
               bins no_rate    = {0};
               bins mul_of_15  = {SOME_PRE_DEFINED_PATTERN};
           }
      endgroup;
      ....
endclass

Где SOME_PRE_DEFINED_PATTERN - массив int от 0 до системного макроса с шагом 15. Я не уверен, является ли это правильным / лучшим способом генерации этого бина. Любое лучшее предложение?

1 ответ

Решение

Как насчет написания некоторых вспомогательных функций:

module FIFTEEN;

  class rx_port;

    typedef enum {IS_ZERO, IS_DIVISIBLE_BY_15, IS_NOT_DIVISIBLE_BY_15} rate_type;

    function new;
      rx_cov=new;
    endfunction

    local function rate_type covergroup_helper(input int unsigned i);
      if (i==0)       return IS_ZERO;
      if (i%15==i/15) return IS_DIVISIBLE_BY_15;
      return IS_NOT_DIVISIBLE_BY_15;
    endfunction

    function sample (input int unsigned i);
      rx_cov.sample(covergroup_helper(i));
    endfunction

    covergroup rx_cov with function sample (rate_type rate);
      coverpoint rate;
    endgroup;
  endclass

  rx_port R = new;

  initial
    begin
      R.sample(0);
      R.sample(30);
      R.sample(31);
      $display("coverage R.rx_cov.get_coverage= %f", R.rx_cov.get_coverage);
    end

endmodule

https://www.edaplayground.com/x/65v7

Здесь я написал функцию, которая определяет, делится ли ее входное значение на 15 или нет, и другую функцию, которая вызывает ее для выполнения выборки. Вы могли бы объединить эти функции вместе, но мне нравится разделение труда в моем примере.

Оказывается, есть лучший способ:

module FIFTEEN;

  class rx_port;

    function new;
      rx_cov=new;
    endfunction

    function sample (input int unsigned i);
      rx_cov.sample(i);
    endfunction

    covergroup rx_cov with function sample (int unsigned rate);
      coverpoint rate { 
        bins IS_ZERO                = {0}; 
        bins IS_DIVISIBLE_BY_15     = {[1:$]} with ((item % 15)==0); 
        bins IS_NOT_DIVISIBLE_BY_15 = {[1:$]} with ((item % 15)!=0); 
      }
    endgroup;
  endclass

  rx_port R = new;

  initial
    begin
      void'(R.sample(0));
      void'(R.sample(30));
      void'(R.sample(31));
      $display("coverage R.rx_cov.get_coverage= %f", R.rx_cov.get_coverage);
    end

endmodule

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

Ты можешь использовать with указать бункеры. Так

bins IS_DIVISIBLE_BY_15     = {[1:$]} with ((item % 15)==0); 

дает вам корзину, которая удаляется всякий раз, когда значение делится на 15 (но не 0) и

bins IS_NOT_DIVISIBLE_BY_15 = {[1:$]} with ((item % 15)!=0); 

дает вам корзину, которая удаляется всякий раз, когда значение не делится на 15.

Другие вопросы по тегам