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.