4. Создание тестового окружение
На уровне SystemVerilog-описания тестовое окружение состоит из набора классов и модулей (см. рис. 9).
Рис. 9. Архитектура тестового окружения на уровне модулей и классов
В модуле верхнего уровня иерархии (tb_top) объявляются старый и новый варианты RTL-модулей для проверки идентичности. С помощью интерфейсов модули подключаются к программному блоку (testcase). Программный блок отделяет тестовое окружение от RTL-описания и является некой входной точкой для выполнения тестовой программы. В нем создается экземпляр (объект) основного класса тестового окружения (Environment) и вызывается метод, запускающий процесс симуляции. В классе Environment описываются методы для управления процессом симуляции, создаются необходимые средства коммуникации и экземпляры используемых классов. Согласно разработанной архитектуре первого варианта тестового окружения, необходимо два экземпляра почтового ящика, экземпляр класса Driver, два экземпляра класса Receiver и экземпляр класса Scoreboard. Второй вариант тестового окружения отличается тем, что не использует классы Receiver и Scoreboard, а также почтовые ящики. Их заменяет модуль Checker. На рис. 9 экземпляры, создающиеся классом, нарисованы внутри прямоугольника с именем класса.
Создание тестового окружения разобьем на несколько этапов, как это сделано на testbench.in:
1) Описание программного блока и интерфейсов, и их объявление вместе с тестируемыми схемами в модуле tb_top.
2) Описание класса Environment, содержащего методы для управления процессом симуляции.
3) Описание класса Transaction, который описывает данные, посылаемые на тестируемую модель и принимаемые от нее.
4) Описание класса Driver, который генерирует транзакции и посылает их на входы тестируемых схем.
5) Описание класса Receiver, который принимает транзакции с выходов тестируемых схем.
6) Описание класса Scoreboard, который сравнивает транзакции, полученные от приемника старого и нового варианта схемы.
7) Описание класса Coverage, который реализует механизм оценки функционального покрытия.
Примечание
Обратите внимание на первые две и последнюю строки каждого файла проекта:
`ifndef _CLASS_NAME_ `define _CLASS_NAME_ ... `endifДиректива `ifndef начинает блок так называемой условной компиляции, который заканчивается директивой `endif. Блок условной компиляции – это кусок текста, который будет компилироваться, только если выполнено определенное условие. В данном случае условие заключается в том, что символ _CLASS_NAME_ не определен. Если этот символ определен, текст между `ifndef и `endif не будет компилироваться. В самом начале символ _CLASS_NAME_ не определен, и блок условной компиляции обрабатывается. В нем определяется символ _CLASS_NAME_. Теперь условие для второго блока условной компиляции уже не выполняется, и он будет пропущен. Таким образом модули и классы защищаются от повторной компиляции.

Комментарии (0)