Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Языки VHDL и VERILOG в проектировании цифровой аппаратуры

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Глава 4. Функциональная верификация HDL-описаний 91
Тестирующая программа (testbench)
VHDL VERILOG
entity TB_F is module NOT_STRUCT_TB ();
-- у теста порты отсутствуют
end TB_F;
USE STD.TEXTIO.all;-- ввод-вывод
architecture NOT_STRUCT_TB of TB_F is
component F port
(A1, A2: in bit; B1, B2: out bit); end component; signal I1, I2, O1, O2: bit; reg I1, I2;
begin wire O1,O2;
GEN_V1 :process begin initial begin :GEN_V1
I1<='0'; I2<='0' ; I1=0;I2=0; wait for 10 ns; I1<='1'; #10; I1=1; wait for 20 ns; I1<= '0' ; I2<='1'; #20; I1=0;I2=1; wait for 10 ns; I1<='1' ; #10; I1=1;
wait for 10 ns; #10; wait; -- бесконечное ожидание $finish;//останов модели
end process GEN_V1; end// GEN_V1
-- ниже связи компонент объекта TB_F C2: F port map (I1, I2, O1, O2); F_CASE C2 (I1, I2, O1, O2);
WRITER1 : process (O1,O2) always @(O1 or O2);
variable L:LINE;-- из пакета TEXTIO
begin begin :WRITER1
write (L,NOW); $display("t=%t",$time);
$display("I1=%bI2=%b",I1,I2); write (L,I1); write (L,I2); write (L,O1); write (L,O2); $display("O1=%b",O1);
$display("O2=%b",O2);
writeline (output,L);
end process; end //WRITER1
end NOT_STRUCT_TB; endmodule //NOT_ STRUCT_TB
B VHDL-описании процесса вывода WRITER_1 использован стандартный па­кет TEXTIO, содержащий декларацию текстового файла OUTPUT и стандартную процедуру записи строки WRITELINE. Каждый раз, когда один из сигналов (O1 или O2) изменяет свое значение, процесс запускается и выполняет оператор запи­си значений модельного времени NOW и значений сигналов I1, I2, O1, O2 в стан­дартный текстовый файл OUTPUT.
B VERILOG-описании первый оператор форматируемого вывода $display вы­водит время, второй — значения входных сигналов, третий и четвертый выводят значения выходов.
Обратите внимание на останов моделирования в момент времени 50 наносе­кунд.
В VHDL-модели процесс GEN_V1 попадает в оператор wait — вариант безусловного ожидания — и зависает в нем. В модели пропадает источник событий.
В VERILOG системный оператор $finish останавливает моделирование.
92 Глава 4. Функциональная верификация HDL-описаний
VHDL-описание объекта проекта TB_F для модельного эксперимента можно не дополнять конфигурационным описанием, так как имя компоненты F совпада­ет в нашем случае с именем объекта проекта F (когда оно совпадает, то конфигу­рирование происходит по умолчанию).
На рис. 4.4 представлен экран системы моделирования ACTIVE_HDL после прогона VHDL-модели TB_F.
В нижней части экрана видны результаты вывода на консоль значений сигна­лов и моментов времени, когда выходы объекта проекта F изменялись.
В левой верхней части экрана видны временные диаграммы сигналов.
Справа виден состав файлов и библиотек проекта. По результатам печати и временным диаграммам видно, что поведение моделируемого объекта совпадает с его табличной спецификацией.
Heтрудно ввести в тестирующую программу модуль автоматического сравне­ния выходных сигналов с эталоном, например с файлом, содержащим исходную таблицу (см. рис. 4.1), использованную при проектировании объекта F. Можно улучшить описание TB_F за счет его структуризации путем выделения в отдель­ные модули генератора входных сигналов и блока вывода (это упростит в дальней­шем их повторное использование и модификацию), вместо константных значений использовать параметры или именованные константы (упрощение проведения эк­спериментов на различных частотах) и т. д. Эти вопросы будут рассмотрены позд­нее. Сначала рассмотрим вопросы полноты тестов.
Рис. 4.4. Экран системы моделирования
Глава 4. Функциональная верификация HDL-описаний 93
4.2. Стратегия функциональной верификации
4.2.1. Типы тестов
Для проверки правильности функционирования проектируемых систем в основном используются методы детерминистского (deterministic), случайного (ran­dom) и транзакционного (transaction level) тестирования.
Детерминистский тест проверяет обычные режимы работы системы, а также ее функционирование в граничных условиях c помощью фиксированного набора входных воздействий.
Метод случайного тестирования предполагает наличие генератора случайных входных воздействий.
Метод транзакционного тестирования предполагает фиксацию внимания на проверке интерфейсов блоков системы и проверке прохождения пакетов данных через нее.
Различают тестирование объекта как:
— «черного ящика» — инженер-верификатор при разработке теста не исполь­зует знаний о внутренней организации описания объекта;
— «серого ящика» — инженер-верификатор частично использует знание внут­ренней организации описания объекта;
— «прозрачного ящика» — инженер-верификатор базируется на знании внут­ренней структуры описания объекта.
4.2.2. Полнота теста
Целью процесса верификации проекта является проверка его соответствия спецификации на всех уровнях проектирования.
Имитационная верификация — трудоемкий процесс. Обычно в реальных случаях полный перебор невозможен (например, для такой проверки 16-разряд­ного сумматора требуется пeребрать 2 ченное множество входных наборов теста. Например, для того же сумматора сна­чала при тестировании его как «серого ящика» проверяют простейшие случаи (0+0=0,2+2=4,11111111111+0,0+ 111111111111 и т. п.), затем пробег пере­носов (111111111+1,1+111111111 и т. д.) а затем, рассматривая его как «черный ящик», используют выборку из случайных чисел.
Требуется оценить полноту таких тестов с учетом минимизации цены тестиро­вания и максимизации вероятности обнаружения возможных ошибок в проекте.
32
степени наборов!) и используется ограни-
4.3. Оценка полноты функциональных тестов
4.3.1. Эвристические метрики
Эвристические метрики основаны на текущей статистике обнаружения оши­бок в проекте. Подобные метрики включают:
— календарное время между моментами обнаружения ошибок проекта (к кон цу процесса верификации оно увеличивается);
-
94 Глава 4. Функциональная верификация HDL-описаний
— общее количество промоделированных тактов работы проектируемого устройства;
— общее число обнаруженных ошибок в проекте и т. д.
В свое время, когда автор работал в компании Raycer Graphics над проектом мощного профессионального графического ускорителя, состоящего из трех функ­циональных блоков-кристаллов, шеф верификационной команды Рик Авра (Rick Avra) оценил вероятное число ошибок в 3000, и, когда этот рубеж был достигнут в условиях успешной работы всех трех RTL-моделей блоков на сотнях тестов (от изображения простого голубого треугольника до изображений автомобиля с тек­стуровкой, тенями и полутонами), все вздохнули с облегчением. Психологический барьер был пройден и стал виден конец работы, так как темп обнаружения оши­бок коллективом из десятков человек стал менее одной ошибки в день. Однако такие метрики весьма необъективны, и возможно, что часть функций проектируе­мого устройства осталась бы неверифицированной.
4.3.2. Программные метрики
В настоящее время большинство коммерческих систем оценки полноты фун­кциональных тестов COVERSCAN, COVERMETER и т. п., а также развитые сис­темы моделирования типа SILOS, ACTIVE-HDL, MODELSIM, VSS базируются на метриках, используемых для верификации программ (программо-метрический подход).
В числе таких метрик можно указать, например, такие:
— полнота покрытия тестом строк кода модели — количество исполнений каждой строки описания;
— полнота покрытия переходов — число исполнений ветвей операторов if и case;
— полнота покрытия путей — число исполнений всех возможных путей в гра­фе программы;
— полнота покрытия выражений — низкоуровневая метрика, основанная на оценке числа вычислений выражений на различных наборах данных;
— полнота переключений (0 ->1 и 1 ->0) каждого бита данных.
Пример подобных статистических данных, получаемых системой SILOS-demo при прогоне VERILOG-варианта вышеприведенного теста описания объекта про­екта F, представлен на рис. 4.5. Видно, что все строки кода тест-программы ис­полнялись, однако тест представляется неполным, так как выход В2 не перебра­сывался из1в0,аB1из0в1.
Ясно, что, если после прогона теста собранная статистика говорит, что часть операторов модели вообще ни разу не исполнялась или некоторые сигналы ни разу не переключались, имеет смысл попытаться понять причину этого явления и при необходимости дополнить тест. Несмотря на очевидную полезность и объек­тивность этих метрик, никто не может гарантировать, что достижение, допустим, 100% покрытия тестом программного кода позволяет обнаружить все ошибки проекта устройства.
Следует вспомнить о понятиях управляемости (controllability) и наблюдаемо­сти (observability) тестируемых объектов и их блоков. То, что тест создал условия, когда некоторая строка кода (оператор) исполняется (управляемость), не гаранти рует, что результат этого исполнения будет влиять на выход моделируемой схемы (наблюдаться на выходе и сравниваться с эталоном — наблюдаемость).
-
Глава 4. Функциональная верификация HDL-описаний 95
Рис. 4.5. Экран системы моделирования SILOS-3 demo: покрытие строк кода
модели объекта проекта F
Статистика говорит, что 100%-ное покрытие тестом строк HDL-кода функци­ональной модели дает примерно 70% наблюдаемости этого покрытия.
Второй недостаток программо-метрик в том, что они не имеют прямой связи с оценкой функциональной корректности модели исследуемой системы и ее спе­цификации.
4.3.3. Автоматно-метрический подход
Если проектируемое устройство является конечным автоматом, то можно ис­пользовать для оценки полноты теста статистику о числе достижений автоматом различных состояний (вершин) и переходов (дуг на графе автомата). Однако, так же как и для программо-метрик, автомато-метрическая полнота — это необходи­мое (управляемость), но не достаточное (наблюдаемость) условие полноты теста. Более мощные результаты дают системы формальной верификации автоматов, об­наруживающие зависания, недостижимые состояния и т. п.
4.3.4. Моделирование неисправностей
Эти методы базируются на идее обнаружения тестом множества возможных неисправностей в моделируемой схеме (система моделирования SILOS 3 и др.).
96 Глава 4. Функциональная верификация HDL-описаний
В модель вносится неисправность, и если выходы неисправной системы не от­личаются от эталона, т. е. на всем времени моделирования неисправность не обнаруживается тестом, то тест неполный. Эти методы хорошо зарекомендовали себя в моделях вентильного уровня (неисправности типа тождественный 0 или 1 на входе/выходе вентиля), но для моделей функционального уровня они недо­статочны. Неясно, например, как моделировать неисправности оператора CASE, и трудно представить, что все возможные неисправности в микросхеме процес­сора INTEL сводятся к установке одного из внешних контактов микросхемы в 0 или 1.
4.3.5. Мониторинг событий и проверка контрольных соотношений в модели
Эти верификационные методики базируются на том, что для разработчика модели устройства она является «прозрачным ящиком» и он имеет возможность включить в модель дополнительные фрагменты текста (assertion — мониторы и утверждения), контролирующие соблюдение функциональных ограничений.
Пример некорректных режимов — запрет одновременного прихода сигналов сброса и установки на вход триггера или наличия двух открытых буферов на трис­табильной шине и т. п.
Пример обязательного режима для протокола «рукопожатие» — за фронтом сигнала запрос (req) должно следовать подтверждение (фронт ack), после чего запрос снимается (срез req), после среза req должен следовать срез ack. Это уже более сложное утверждение, содержащее последовательность событий во времени.
В VHDL-моделях для контроля можно использовать оператор утверждения — assert, реагирующий на ложность условия.
VERILOG не имеет подобного встроенного средства, и его приходится созда­вать с помощью обычных операторов.
Пример VHDL-утверждения о запрете одновременной 1 на двух входах set, reset:
signal set, reset : bit;
assert ((set and reset) / = '1') report "wrong set_reset condition"
severity level error;
Eго VERILOG-эквивалент:
//пусть assert_on — переменная периода компиляции, управляющая включением
контроля,`ifdef и `endif — директивы компиляции. Если в модели есть строка
`define assert-on то в модель включается текст блока always.
`ifdef assert_on
always @(set or reset) begin
if (set && reset) $display ("assert set && reset, %b, %b, time= %t",
set, reset, $time);
end
`endif
Второй вариант организации VERILOG-утверждений — оформление соответ ствующего утверждения в виде процедуры (task) или модуля, включение его в биб лиотеку исходных модулей (процедур) и использование в тексте модели.
-
-
Глава 4. Функциональная верификация HDL-описаний 97
Пример такого модуля:
`define assert_on 1
module assert_set_reset (clk, set, reset, assert_id); input clk, set, reset; input [7:0] assert_id;
`ifdef assert_on
always @(posedge clk) begin
if (set && reset)
$display
("assert set_reset, set = %b, reset = %b, assert_id = %d, time = %t",
set, reset, assert_id, $time);
end
`endif
endmodule
Рассмотрим пример использования подобного VERILOG-модуля в тексте описания устройства. Из-за соображений эффективности контроль включается только при определении (`define assert_on) переменной периода компиляции as­sert_on, а для пропуска утверждения синтезатором (см. главу 5) применяются прагмы-комментарии rtl_synthesis on и off.
// rtl_synthesis off
`ifdef assert_on
assert_set_reset ff1_assert (clk, set, reset, 1); `endif
// rtl_synthesis on
В библиотеке модулей-утверждений (ряд фирм поставляет библиотеки из 100—300 подобных модулей) обязательно имеются утверждения типа «всегда», «никогда», «при определенных условиях», «только один разряд» и т. п. Система OpenVera 2 (www.open_vera.com) включает специальный язык утверждений и ве­рификационные среды на этой базе.
4.4. Компоненты тестирующей программы
В типичной тестирующей программе (testbench) мы обычно имеем:
— генератор тактовых сигналов (clk);
— генератор сигнала сброса (reset);
— генератор (источник) векторов тестовых данных (test-vectors);
— вызов модели тестируемого устройства (Unit Under Test-UUT);
— компаратор — сравнение выходов устройства с эталоном;
— диагностическую печать (if (debug =1) $display(););
— проверку контрольных соотношений (assert);
— описание условий останова модели и печать итоговых сообщений.
При необходимости в этот список включаются: сохранение результатов моде­лирования в файле, средства реконфигурации модели для регрессионных экспери­ментов и т. п. Развитые системы создания верификационных сред типа SPEC­MAN фирмы VERYSITY включают библиотеки сложных типовых верификацион ных компонент (например, шины PCI, Gigabit Ethernet и др.).
Ниже приведены примеры типичных простых компонент тестовых программ.
-
98 Глава 4. Функциональная верификация HDL-описаний
4.4.1. Тактовый генератор
В разделе дан пример генератора сигналов с периодом 10 ns и неравной дли­тельностью сигнала1и0:
VHDL VERILOG
`timescale 1 ns/1 ns signal Y: bit:='0'; reg Y; initial Y=1'b0; GEN1:process always begin begin: GEN1
wait for 3 ns; #3; Y<= '1'; Y<=1; wait for 7 ns; #7; Y<= '0'; Y<=0;
end process; end //GEN1
Пример типичной ошибки при описании генератора (программа зациклится,
так как процесс не содержит оператора задержки):
VHDL VERILOG
WRONG_GEN1:process always
begin begin: WRONG_GEN1
Y<= '1' after 3 ns, Y<= #3 1;
'0' after 7 ns; Y<=#7 0;
end process WRONG_GEN1; end // WRONG_GEN1
4.4.2. Генератор сигнала сброса
Пример генератора сигналов сброса длительностью 10 тактов:
VHDL VERILOG
signal RST: bit:='1'; reg RST;
initial begin RST=1'b1;
r1:process variable I:integer; repeat( 10) @(posedge clk);
begin
for I in 1 to 10 loop RST<=0;
wait until clk='1' and clk'event;
end loop; RST<= '0'; wait;
end process; end
4.4.3. Входные векторы
Источник входных воздействий на тестируемый объект может быть реализо­ван в виде алгоритма (детерминированный или псевдослучайный) или набора данных, считываемых из файла. Работа с файлом существеннее медленнее.
4.4.3.1. Cлучайные входные наборы и задержки
VERILOG
Наиболее просто случайные процессы реализуются в языке VERILOG, имею щем встроенный датчик равномерного случайного распределения 32-разрядных случайных чисел — системную функцию $random.
-
Глава 4. Функциональная верификация HDL-описаний 99
Пример генерации случайных адресов и данных длиной до 64 bit:
always @(posedge clk) begin
data ={$random, $random); addr={$random, $random);
end
Пример случайной задержки данных:
initial begin
#($random % Max_del) data =($random);
end
VHDL
Случайные функции VHDL реализованы в пакетах.
Приводим фрагмент использования одного из них - DISTRIBUTION.
Пример генерации случайных вещественных адресов (0:255) и данных (0:1023) процедурой uniform (потом их надо преобразовать в целые):
Library Synopsys; use Synopsys.distribution.all;
-- в теле архитектуры---------------------
Rnd:process (clk)
Variable NN:real:= 20.0; begin
if (clk'event and clk ='1')then
Uniform(NN, 0.0,1023.0, data);Uniform (NN,0.0,255.0,addr);
end if;
4.4.3.2. Входные наборы из файла
VERILOG
Integer I;
reg [width-1:0]pat_mem[0:depth-1];//буферная память векторов
initial begin
readmemh ("test_pat.dat", pat_mem);//считывание из файла в буфер
for (I=0; I< Max_pat_num; I=I+1) begin @(posedge clk);
#(pat_del) in_vec=pat_mem[I];// подача вектора на входы end end
VHDL
Пример cм. в разделее 4.6.
4.4.4. Cравнение выходов модели с эталоном (VERILOG)
Для сравнения в условии оператора if следует использовать операцию
===(тождественно), а не ==(равенство), так как, например:
I1= ( 4'b10xz !=4'b1011 ); // дает 1'bx (не истинно) I2= (4'b10xz ==4'b1011) ;//дает 1'bx (не истинно) I3= (4'b10xz ===4'b1011);// дает 1'b0 (ложно) I4= (4'b10xz !==4'b1011);// дает 1'b1 (истинно)
100 Глава 4. Функциональная верификация HDL-описаний
4.5. Быстродействие и расход памяти инструментальной ЭВМ
Кроме полноты тестирования, одними из важных характеристик тестирующей
программы являются требуемая память è расход машинного времени.
4.5.1. Расход памяти
Расход памяти зависит от числа данных в программе, их размера (особенно
больших векторов и массивов), а также количества и сложности операторов.
Например, объем памяти инструментальной ЭВМ, необходимый для хране­ния VHDL-данных вида signal, на порядок превышает объем для variable, и объяв­лять модель блока памяти лучше с помощью variable.
Пример фрагмента упрощенной модели асинхронной RAM (адрес — целое!).
entity OZU is
generic (width:positive:=10; depth:positive := 1024);
port (rw,CS:in bit;
DI,Do:inout bit_vector(width-1 downto 0); addr:in integer );
end;
architecture BEH of OZU is
type mem_arr is array (0: depth-1) of bit_vector( width-1 downto 0);
begin
process read_write(rw,CS,DI)
variable Ram:mem_arr;
begin
if CS='1' then
if rw='1' then Do<=Ram(addr); else Ram(addr) :=DI; end if;
end if;
end process;
end;
VERILOG расходует обычно в 4 раза меньше памяти на хранение одного бита данных, чем VHDL. Данные вида переменные в этом смысле всегда лучше, чем вида сигналы и соединения.
4.5.2. Быстродействие тестирующей программы
Уменьшить время модельного эксперимента можно различными способами, среди которых:
1. Эффективная организация тестирующей программы (профилирование — выявление наиболее часто исполняемых фрагментов модели и их оптимизация, исключение ненужных печатей и т. п.).
2. Использование систем поддержки верификации и языков программирова ния для создания верификационной среды (это часто не только сокращает время разработки и отладки теста, но и повышает его быстродействие).
-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]