Динамические Точки прикрытия в Покрытии Systemverilog

class conf;
  typedef struct packed
  {
    int ns_size;
    int limit;
  } ns;

  int num_ns_supported;
  ns num_ns[];

  function new(input int s=5);     
    num_ns_supported = s;
    num_ns = new[s];
    foreach(num_ns[i])
    begin
      num_ns[i].ns_size = (1000 * (i+1));         
    end
  endfunction
endclass

class pac;
  int nsid=1;
  int slba;
endclass

class c;
  pac p;
  conf cfg;

  covergroup x;
    option.per_instance = 1;
    a : coverpoint p.slba
    {
      bins range[3] = {[32'h0000_0000 : cfg.num_ns[p.nsid-1].ns_size]};
    }
  endgroup

  function new(input conf ca);     
    p = new();
    cfg = ca;
    x = new();
  endfunction

  function void sample(input pac p1);
    p = p1;
    x.sample();
  endfunction
endclass

program p1;
  conf cfg = new(6);
  pac p = new();
  c co = new(cfg);

  initial
  begin
    p.nsid = 1;
    p.slba = 550;
    co.sample(p);
    p.nsid = 2;
    co.sample(p);
  end  
endprogram

В этом коде мне нужно покрыть slba диапазонами, связанными с уважаемой структурой num_ns.

Но в этом коде диапазоны будут разделены только в соответствии с num_ns[0].

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

2 ответа

Решение

То, о чем вы просите, не может быть выполнено и не имеет никакого смысла. См. https://verificationacademy.com/forums/coverage/how-get-values-different-bins-coverpoint

Ответ на этот вопрос дал @dave_59. Но я просто выложу обновленный код с его логикой.

Динамические точки прикрытия невозможны. Так что вот еще одно решение с той же целью, с фиксированными точками покрытия.

class conf;
  typedef struct packed
  {
    int ns_size;
    int limit;
  } ns;

  int num_ns_supported;
  ns num_ns[];

  function new(input int s=5);     
    num_ns_supported = s;
    num_ns = new[s];
    foreach(num_ns[i])
    begin
      num_ns[i].ns_size = (1000 * (i+1));         
    end
  endfunction
endclass

class pac;
  int nsid=1;
  int slba;
endclass

covergroup x (int nsid, input conf cfg) with function sample(int slba);
option.per_instance = 1;
  a : coverpoint slba
  {
    bins range[3] = {[32'h0000_0000 : cfg.num_ns[nsid].ns_size]};
  }
endgroup

class c;
  pac p;
  conf cfg;
  x cg[];

  function new(input conf ca);     
    p = new();
    cfg = ca;
    cg = new[cfg.num_ns_supported];
    foreach(cfg.num_ns[i])
      cg[i] = new(i, cfg);
  endfunction

  function void sample(input pac p1);
    p = p1;
    cg[p.nsid-1].sample(p.slba);
  endfunction
endclass

program p1;
  conf cfg = new(6);
  pac p = new();
  c co = new(cfg);

  initial
  begin
    p.nsid = 1;
    p.slba = 550;
    co.sample(p);
    p.nsid = 2;
    co.sample(p);
  end  
endprogram
Другие вопросы по тегам