ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Journal influence

Higher Attestation Commission (VAK) - К1 quartile
Russian Science Citation Index (RSCI)

Bookmark

Next issue

4
Publication date:
09 December 2024

The article was published in issue no. № 2, 2007
Abstract:
Аннотация:
Authors: (osipa68@yahoo.com) - , Ph.D, Zakharov A.V. (zaharov@niisi.msk.ru) - SRISA RAS, Moscow, Russia, Koltsov P.P. (koltsov@niisi.msk.ru) - SRISA RAS, Moscow, Russia, Ph.D, Kotovich N.V. (kotovich@niisi.msk.ru) - SRISA RAS, Moscow, Russia, (osipa68@yahoo.com) - , Ph.D, (osipa68@yahoo.com) - , Ph.D, (osipa68@yahoo.com) - , Ph.D, (osipa68@yahoo.com) -
Ключевое слово:
Page views: 12396
Print version
Full issue in PDF (1.17Mb)

Font size:       Font:

Сложность современных микропроцессорных систем выдвигает на передний план задачу верификации проектов. В иерархической структуре проекта на каждом уровне обычно используются все доступные средства верификации. Одним из наиболее популярных средств является стохастическое тестирование. За последние 20 лет было создано большое число генераторов случайных тестов от специализированных, ориентированных на проверку отдельных компонентов проекта, до универсальных, предназначенных для тестирования архитектуры проекта. В отличие от тестов с самопроверкой для использования случайных тестов требуется минимум две модели (или образца) целевого устройства. Например, при верификации модели процессора, написанной на языке VHDL, результаты выполнения случайного теста сравниваются с результатами, полученными на эталонной модели, с целью выявления и анализа большинства возможных расхождений.

В отличие от ручной подготовки тестов автоматическая генерация почти не имеет ограничений по производительности. Это позволяет повысить степень покрытия тестов. Для повышения эффективности случайных тестов используются все более содержательные модели целевых устройств. Однако полная автоматизация создания случайных тестов пока является сложной задачей.

Более простой подход – разработка шаблонов и генераторов случайных тестов, позволяющих намеренно повышать вероятность состояний целевого устройства, в которых ожидаются ошибки. Подход заложен в основу интегрированной системы INTEG, предназначенной для верификации микропроцессоров архитектуры MIPS64 и разработанной в НИИ системных исследований (НИИСИ) РАН (Москва).

Для создания шаблонов в системе INTEG используется графический интерфейс пользователя (GUI), делающий работу максимально наглядной. Генератор вырабатывает тесты, ориентированные на выявление ошибок. Управляющая оболочка осуществляет прогон тестов на имеющихся симуляторах и сохраняет результаты прогона. Затем модуль сравнения результатов анализирует полученные результаты и выявляет существенные различия.

Условия генерации тестов

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

Случайные тесты должны отвечать характерным требованиям. Они должны быть корректными, то есть их выполнение должно быть полностью определено спецификацией проверяемой системы. Высококачественный тест расширяет покрытие проверяемой системы и способен выявлять возможные ошибки. Для содержательного сравнения результатов выполнения тестового кода на разных моделях он не должен использовать случайные данные времени выполнения. При выполнении не должно возникать незапланированных запрещенных ситуаций. Эти условия обеспечивает генератор тестов.

В ходе генерации теста желательно иметь информацию о состоянии целевого устройства, то есть моделировать выполнение одновременно с генерацией. Данная возможность полезна, но сложна в реализации и имеет ограничения (например для циклов). В то же время полное моделирование выполнения программы на этапе генерации кода нужно не всегда. В системе INTEG принят упрощенный подход, при котором содержимое регистров может быть либо известно, либо не определено (в результате арифметической операции или в точках начала цикла и некоторых других). При необходимости генератор тестов неявно обновляет содержимое регистров, а также обеспечивает защиту от записи в регистры с часто используемым содержимым.

Генератор тестов должен предоставлять максимальную свободу случайного выбора. Это означает, что при случайном выборе параметра используется вся область его допустимых значений с учетом требований к коду. Область может быть разбита на интервалы, имеющие заданные вероятности выбора. Таким образом, распределение параметров кусочно-равномерное.

При наличии ошибок в шаблоне генератор должен выдавать диагностику, и если ошибка устранима, исправить ее (обычно просто отменяя некорректное назначение).

Техника случайной генерации тестов

Шаблоны и случайный выбор. По шаблону теста генератор может создать множество хорошо распределенных экземпляров тестового кода. Различие между экземплярами достигается вследствие большого числа случайных решений, принимаемых в ходе генерации. Результатом этого является повышение покрытия тестов и вероятности обнаружения ошибок.

Шаблон создается разработчиком, подобно прикладной программе, и описывает распределение памяти, начальные данные, а также схему генерации кода и назначения параметров теста. Однако если прикладная программа должна выполнять осмысленные действия над входными данными, то шаблон должен порождать тестовый код, который должен воспроизводить проверяемые ситуации при выполнении. Поэтому свойства тестового кода должны быть заложены в шаблон. Средства описания шаблонов ориентированы на достижение этой цели.

В процессе генерации теста проходится постоянно делать случайный выбор. Генератор случайных тестов использует последовательность псевдослучайных чисел, которая полностью определяется одним начальным значением, так называемым "зерном". По умолчанию при каждом запуске генератора автоматически выбирается новое зерно. Явное задание зерна в шаблоне позволяет повторить генерацию тестового кода с идентичным результатом, чтобы хранить шаблоны, а не экземпляры тестового кода.

При случайном выборе возможностей и параметров можно выделить следующие типичные ситуации.

·     Выбор целого числа в заданных границах. Большинство границ явно задаются в шаблоне. Если границы не совпадают, вырабатывается одно псевдослучайное число с равномерным распределением и приводится к нужному интервалу.

·     Выбор элемента из линейного списка. Каждый элемент в списке имеет неотрицательный вес. Вероятность выбора элемента пропорциональна его весу. Для выбора вырабатывается одно псевдослучайное число.

·     Выбор элемента из иерархического списка. Каждый узел в иерархии имеет неотрицательный вес. Вероятность выбора узла на каждом уровне пропорциональна его весу. На каждом уровне выбор делается независимо от остальных, пока не будет выбран конечный узел.

Язык описания программы. Генератор случайных тестов строит тестовый код в процессе интерпретации операторов, составляющих программу построения теста, определяющую общие свойства тестового кода. К этим свойствам относятся последовательность фрагментов тестового кода, состав входящих в них инструкций и заданные для них аргументы. Все параметры, оставленные свободными, генератор тестов выбирает случайно, в соответствии с заданными для них вероятностями.

Операторы языка описания программы позволяют описать добавление отдельных инструкций, выборочное задание аргументов инструкций и управляющие конструкции на основе синтаксиса языка С.

Операторы вставки инструкций выполняют добавление инструкций в тестовый код. Они позволяют задать как фиксированную, так и случайную последовательность инструкций, входящую в тестовый код. Количество добавляемых инструкций выбирается случайно, в индивидуально заданных границах. В зависимости от оператора инструкции могут задаваться своим именем или кодом, последовательно выбираться из списка, а также случайно выбираться из иерархического списка. К операторам вставки инструкций относятся Code, Random, InsItem, Group и оператор-инструкция.

Задание аргументов инструкций. В программе построения теста можно задать часть или все аргументы инструкции. Для оператора-инструкции можно применять оператор Args. Для определения порядка задаваемых аргументов в нем используется ассемблерный синтаксис инструкции. Более универсальным является оператор XArgs, который использует обозначения аргументов, принятые в ассемблере. Последний позволяет задать аргументы любой инструкции, добавляемой следующим оператором. Из списка заданий оператора XArgs выбираются только те аргументы, которые есть у определяемой инструкции.

В зависимости от типа аргумента (регистр или число) оба оператора используют числовые константы, имена регистров или имена, имеющие соответствующее значение. Для регистров можно задать исходное значение, которое будет загружено в регистр перед выполнением инструкции. Для этого генератор тестов добавляет в тестовый код дополнительные инструкции. Например, оператор XArgs (rs=$reg =0x100) задает для инструкций, добавляемых следующим оператором, значение имени $reg в качестве аргумента-регистра, обозначаемого rs, причем перед выполнением в регистр загружается число 0x100.

Управляющие конструкции включают циклические конструкции (итераторы), вставку цикла времени выполнения и подстановку макроса.

Итераторы дают возможность выполнять последовательный перебор с подстановкой инструкций (итератор ForIns), числовых значений (ForVal), регистров (ForReg), а также простую циклическую обработку без подстановки (Repeat). Каждый итератор имеет вложенную последовательность операторов, или тело. Итератор выполняет несколько проходов по телу. Число проходов для Repeat задается явно, а для остальных итераторов зависит от длины списка инструкций, значений или регистров. Итераторы могут иметь любую вложенность.

Итераторы ForVal и ForReg имеют переменную цикла – имя, которое на каждом проходе заменяется очередным значением или именем регистра из списка итератора. Это имя можно использовать в теле итератора для задания аргументов инструкций. Итератор ForIns также имеет переменную цикла, но она используется для связи с оператором ForIns, который добавляет очередную инструкцию из списка ForIns. Задавать связь необходимо, так как итераторы ForIns могут быть вложенными. Оператор InsItem может относиться к любому содержащему итератору ForIns, что позволяет организовать перебор вида "каждая инструкция за каждой инструкцией". Пример перебора с вложенными итераторами:

ForIns ($i1, 0, ADD, ADDU, SUB, SUBU) {

   ForIns ($i2, 0, SLL, SRL, SRA, SLLV, SRLV) {

      InsItem ($i3)

      InsItem ($i2)

   }

}

Для организации в тестовом коде циклов времени выполнения используется оператор Loop. Этот оператор имеет тело. Из его операторов генерируются инструкции тела цикла. Число повторений цикла выбирается случайно в заданных границах. Для цикла генератор тестов выбирает один регистр, значение которого не меняется в теле цикла. Как и итераторы, циклы времени выполнения могут быть вложенными.

Макросы представляют собой обычные шаблоны, разработанные для выполнения определенных действий или для создания определенного состояния целевой системы. Чаще всего макрос добавляет заданную цепочку инструкций. Для подстановки макроса используется оператор MCall, в котором указывается имя макроса или файла. Подстановки макросов могут быть вложенными.

Важным свойством макроса является наличие собственного контекста. Как всякий шаблон, он может определять вероятности случайного выбора и другие параметры генерации.

Установки и их использование. Установки генератора случайных тестов задают параметры и режимы его работы. Набор установок довольно велик, поскольку в него включены весовые коэффициенты для всех вариантов случайного выбора. Для эффективного управления набор установок имеет иерархическую структуру с доступом по именам установок.

Набор установок является составной частью контекста шаблона или макроса. При подстановке макроса установки шаблона не влияют на контекст.

Общие установки генератора: к ним можно отнести ограничение числа инструкций в тестовом коде и несколько других, отладочного характера.

Генерация целых чисел. При случайном выборе 32-битовых и 64-битовых целых чисел используется один и тот же набор весов. Среди выбираемых вариантов – псевдослучайное число, равномерно распределенное по интервалу изменения, а также границы интервала и несколько битовых "узоров".

Генерация чисел с плавающей точкой. При случайном выборе чисел одинарной и двойной точности используется один и тот же набор весов, однако характерные значения зависят от точности. Мантисса выбирается первой, и в большинстве случаев требуется дополнительный выбор свободных бит. Порядок либо определяется видом числа, либо выбирается случайно в заданных границах. Среди выбираемых вариантов – нули, бесконечности, NaN, границы интервала, нормализованные и денормализованные числа.

Адреса и условия передачи управления. Передача управления возможна только в незанятую часть области памяти, отведенной для кода. Для выбора целевой адрес представляется в виде N*B+D, где байтовый размер блока B=2n и смещение D

Адреса данных в основном отличаются от адресов передачи управления возможностью (и необходимостью) повторного использования адресов данных, а также способами адресации. В MIPS64 исполнительный адрес данных получается двумя способами: содержимое регистра базы складывается либо с непосредственным байтовым смещением (16 бит со знаком), либо с содержимым регистра индекса. Адрес нужно вырабатывать случайно, если в инструкции не задано значение хотя бы одного из аргументов, составляющих адрес, или если адрес не выдержал проверку. Корректный адрес данных должен задавать расположение объекта в области памяти данных, для которой разрешена нужная операция чтения или записи. Кроме того, желательно соответствие типа объекта в инструкции и типа данных, связанного с областью.

Повторное использование адресов данных полезно при тестировании страничной организации памяти и кэшей. Генератор тестов хранит очередь использованных адресов, в которой задано окно доступа. Выработка адреса начинается со случайного выбора между адресами из очереди и новыми. Процесс выбора нового адреса напоминает выбор адреса кода, с той разницей, что подходящих кандидатур много, и окончательный выбор делается среди них.

Регистры. При случайном выборе аргумента-регистра учитывается тип регистра и назначение (чтение или запись) Например, регистр read-only не может быть случайно выбран в качестве приемника, хотя явное задание допускается. Для регистров также представляет интерес выбор недавно использованного регистра. Генератор тестов хранит очередь использованных регистров и окно доступа в ней. Выбор регистра начинается со случайного выбора между регистрами из очереди и новыми. Новый регистр выбирается из всех допустимых. Для регистров из очереди случайно выбирается фильтр "источники/приемники/все".

Специальные макросы. В большинстве ситуаций, в которых требуются ответные действия, удобно не фиксировать эти действия, а связывать ситуацию с макросом. Это повышает гибкость системы.

Условные пересылки. Предоставлен режим со случайным выбором условия и коррекцией содержимого регистра. Если он отключен, используется текущее содержимое регистров.

Управляющие регистры. Для каждого регистра управления можно заданием установок индивидуально разрешить или запретить его случайный выбор для чтения и/или записи. По умолчанию: чтение разрешено, запись запрещена.

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

Макрос может определить собственные области памяти кода и/или данных. При подстановке макроса они могут дополнять или замещать память шаблона. Это позволяет разрабатывать макросы, использующие специальные виды памяти.

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

Общая иерархия, используемая оператором Random, может быть задана в шаблоне.

Компоненты системы тестирования

Для практического использования описанных возможностей тестирования в НИИСИ РАН была разработана интегрированная система INTEG, снабженная управляющей оболочкой и редактором шаблонов с графическим интерфейсом. Система позволяет готовить шаблоны, генерировать тестовый код и запускать его выполнение на симуляторе VMIPS и RTL-модели. Система включает следующие компоненты: оболочку INTEG; графический редактор шаблонов GUI INTEG; генератор случайных тестов Tergen; симулятор целевого процессора Vmips (так называемый Golden Model); симулятор RTL-модели, написанный на языке Verilog; программу сравнения результатов симуляторов.

Каждый из компонентов системы может запускаться автономно, однако запуск в составе управляющей оболочки обеспечивает остальным программам определенный уровень корректности. Управляющая оболочка предоставляет естественный интерфейс с использованием меню, кнопок, диалоговых окон и окон просмотра каталогов. Главное окно оболочки представляет основные параметры запуска программ, в то время как вспомогательные параметры устанавливаются в дополнительных окнах.

Наряду с интерактивным тестированием управляющая оболочка дает возможность оформить пакетное задание для выполнения серии тестов в фоновом режиме. Программа сравнения результатов запуска автоматически сохраняет тесты, в которых обнаружено расхождение в поведении моделей.

Программы в составе системы INTEG позволяют указывать достаточно большое количество опций, составляющих среду тестирования. В управляющей оболочке предусмотрены загрузка и сохранение среды тестирования между сеансами.

Графический редактор шаблонов GUI INTEG предоставляет визуальные средства создания и редактирования шаблонов с широким использованием механизма "тащить и отпустить". Редактор предо- ставляет доступ ко всем возможностям шаблона, а также удобное иерархическое представление исходного материала.

Генератор случайных тестов Tergen выполняет преобразование шаблона в тестовый код, то есть образ оперативной памяти целевого процессора.

В системе использован симулятор целевого процессора Vmips. RTL-модель целевого процессора на языке Verilog является частью проекта процессора.

Программа сравнения результатов выполнения тестов сравнивает протоколы и в случае расхождения пытается определить его первоисточник.

Опыт использования системы INTEG в НИИСИ РАН показал ее полезность при верификации проекта 64-разрядного микропроцессора с архитектурой MIPS64, а также направления дальнейшего развития.

К достоинствам системы относятся:

·     высокая производительность генерации тестового кода;

·     обеспечение корректности тестового кода и воспроизводимости результатов;

·     использование сведений о состоянии целевого процессора;

·     регулирование вероятностей выбора особых ситуаций с использованием очередей регистров и адресов;

·     удобный интерфейс, облегчающий создание шаблонов и выполнение тестирования.

Дальнейшее развитие системы INTEG будет направлено на поддержку углубленного тестирования иерархии памяти с многоуровневым кэшем. Планируется также добавление средств работы с базой данных для сбора и использования накопленного опыта тестирования.


Permanent link:
http://swsys.ru/index.php?id=379&lang=en&page=article
Print version
Full issue in PDF (1.17Mb)
The article was published in issue no. № 2, 2007

Perhaps, you might be interested in the following articles of similar topics: