Динамические Точки прикрытия в Покрытии 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