Как сгенерировать N переходных функциональных охватов для N-битной контрольной точки?

Вопрос или проблема

Если у меня есть 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

Объяснение:

  1. Определение класса: Мы определяем класс InterruptCoverage, который будет содержать необходимую нам covergroup.

  2. Covergroup: В классе мы объявляем covergroup cg. Опции option.per_instance = 1 и option.get_inst_coverage = 1 позволяют нам отслеживать охват по отдельным экземплярам.

  3. Coverpoint и бины: Внутри coverpoint top.abc.intrpt мы генерируем бины с помощью цикла, который создает для каждого бита intrpt бин, отслеживающий его переходы с 0 на 1. Это достигается с помощью конструкции {i => 1}, где i – это индекс, который соответствует номеру бита.

  4. Создание экземпляра: При инициализации теста (в блоке initial), мы создаем экземпляр класса InterruptCoverage, который автоматически настроит охват.

  5. Тестирование сигналов: В вашем тестовом окружении вы должны имитировать изменения в сигнале intrpt (например, установка значений, которые вызывают переход бита с 0 на 1), чтобы ваши бины смогли "захватить" эти переходы.

Таким образом, вы получаете функциональный охват, который целенаправленно отслеживает каждую линию сигнала, чтобы гарантировать, что все переходы от 0 к 1 фиксируются в ваших покрытиях, соответствуя вашим требованиям.

Оцените материал
Добавить комментарий

Капча загружается...