Вопрос или проблема
Если у меня есть N-битный coverpoint, и я хочу сгенерировать N ячеек, каждая из которых соответствует 1 биту моего coverpoint, так чтобы каждая ячейка охватывала переход 0->1 для каждого бита сигнала, как мне поступить? Я знаю, что могу сказать bins[] = {8’b00000000 => 8’b11111111}, и другой способ – определить coverpoint для 1 бита и инстанцировать его 8 раз для 8-битного сигнала coverpoint, но это не то, что я хочу. Это функциональное покрытие, и требуется отдельная ячейка для охвата каждой линии сигнала, что она утверждена. Это можно решить с помощью покрытия переключений (да), но мне нужно сделать функциональное покрытие здесь.
У меня есть intrpt, определенный как logic [63:0] intrpt глубоко в дизайне. И затем фрагмент моего класса покрытия выглядит следующим образом
covergroup xyz;
option.per_instance = 1;
option.get_inst_coverage = 1;
coverpoint top.abc.intrpt {
bins asserted[] = {0=>1};
}
Идея здесь состоит в том, чтобы иметь покрытие для каждой входной линии прерывания, например
bin[0] hit соответствует тому, что intrpt[0] был утвержден
bin[1] hit соответствует тому, что intrpt[1] был утвержден
......
bin[63] hit соответствует тому, что intrpt[63] был утвержден
Ответ или решение
Для генерации N переходных функциональных охватов (coverage bins) для N-битного покрывающего сигнала (coverpoint) вам необходимо разработать механизм, который будет отслеживать переходы каждого бита отдельно, если вы хотите охватить ситуации, когда каждый бит меняется с 0 на 1. В данном примере, вы хотите отследить переходы для 64-битного сигнала intrpt
.
Вот как можно это реализовать в SystemVerilog, используя covergroup
и coverpoint
:
class InterruptCoverage;
// Объявляем covergroup
covergroup cg;
option.per_instance = 1;
option.get_inst_coverage = 1;
// Объявляем coverpoint с использованием inline bins
coverpoint top.abc.intrpt {
// Генерируем бины для отслеживания переходов 0 -> 1 для каждого бита
for (int i = 0; i < 64; i++) begin
bins asserted[i] = {i => 1};
end
}
endgroup
// Конструктор, который создает экземпляр covergroup
function new();
cg = new();
endfunction
endclass
// В основной тестовой среде, вы должны экземпляр класса и вызывать его
initial begin
InterruptCoverage cov = new();
// Имитация сигналов intrpt для тестирования
// Обычно вы будете это делать в вашем тесте или в рамках отдельной функции
end
Объяснение:
-
Определение класса: Мы определяем класс
InterruptCoverage
, который будет содержать необходимую намcovergroup
. -
Covergroup: В классе мы объявляем
covergroup cg
. Опцииoption.per_instance = 1
иoption.get_inst_coverage = 1
позволяют нам отслеживать охват по отдельным экземплярам. -
Coverpoint и бины: Внутри
coverpoint top.abc.intrpt
мы генерируем бины с помощью цикла, который создает для каждого битаintrpt
бин, отслеживающий его переходы с 0 на 1. Это достигается с помощью конструкции{i => 1}
, гдеi
– это индекс, который соответствует номеру бита. -
Создание экземпляра: При инициализации теста (в блоке
initial
), мы создаем экземпляр классаInterruptCoverage
, который автоматически настроит охват. -
Тестирование сигналов: В вашем тестовом окружении вы должны имитировать изменения в сигнале
intrpt
(например, установка значений, которые вызывают переход бита с 0 на 1), чтобы ваши бины смогли "захватить" эти переходы.
Таким образом, вы получаете функциональный охват, который целенаправленно отслеживает каждую линию сигнала, чтобы гарантировать, что все переходы от 0 к 1 фиксируются в ваших покрытиях, соответствуя вашим требованиям.