Тестирование модулей арифметики с плавающей точкой микропроцессоров на соответствие стандарту IEEE 754
А. С. Камкин, М. М. Чупилко {kamkin, chupilko}@ispras.ru
Аннотация. В работе рассматривается методика функционального тестирования модулей арифметики с плавающей точкой микропроцессоров (FPUs, Floating Point Units) на соответствие стандарту IEEE 754. Методика основана на технологии тестирования UniTESK, но дополнена методами генерации тестов для операций над числами с плавающей точкой. Большое внимание в статье уделяется операциям деления и извлечения квадратного корня. Важной частью работы является описание опыта применения предлагаемой методики.
1. Введение
Модули арифметики с плавающей точкой (FPUs, Floating Point Units) являются важной составной частью микропроцессоров. Они используются в научно-технических расчетах и задачах обработки мультимедиа-данных, без них редко обходятся бортовые системы самолетов и космических спутников, они входят в состав станков с программным управлением и медицинского оборудования. Ошибки в таких системах могут стоить жизней или здоровья людей, поэтому не удивительно, что к модулям арифметики предъявляют очень строгие требования.
Большое влияние на формирование жестких требований оказывают также экономические факторы. В отличие от программного обеспечения, в котором исправление ошибки стоит сравнительно дешево, ошибка в аппаратном обеспечении, обнаруженная несвоевременно, может потребовать перевыпуск и замену продукции, а это сопряжено с очень высокими затратами. Так, известная ошибка в реализации инструкции деления чисел с плавающей точкой микропроцессора Pentium1 [1] (FDIV bug) обошлась компании Intel в 475 миллионов долларов [2,3].
1 РеШіит — торговая марка нескольких поколений микропроцессоров семейства х86, выпускаемых компанией Ігиеі с 22 марта 1993 года.
Модули арифметики, как и любая цифровая аппаратура, разрабатываются на специальных языках описания аппаратуры (HDLs, Hardware Description Languages), например, Verilog или VHDL [4]. Такие языки позволяют описать функциональность электронной схемы, абстрагируясь от деталей расположения и соединения ее элементов. Использование языков описания аппаратуры значительно повышает продуктивность разработки аппаратуры, но не страхует от ошибок, поэтому функциональное тестирование по-прежнему остается актуальной и востребованной задачей.
Формат и правила действий над числами с плавающей точкой определены в стандарте IEEE 754 [5] (он же — IEC 60559 [6]). Стандарт описывает операции сложения, умножения, вычитания, деления, вычисления остатка от деления, извлечения квадратного корня и преобразований между различными типами чисел — это базовый набор операций, реализуемых в FPU микропроцессоров. Для всех операций требуется, чтобы их результат получался из точного путем приведения к представимому числу согласно установленному режиму округления.
В идеале, чтобы убедиться в том, что операция над числами с плавающей точкой реализована корректно, необходимо проверить ее результат на всех возможных значениях операндов. Огромное пространство входных данных не позволяет это сделать за разумное время2, поэтому необходимы методики построения тестов, которые при приемлемом размере тестового набора обеспечивают высокое качество тестирования.
В работе рассматривается методика построения тестов для FPU микропроцессоров, которая основана на технологии тестирования UniTESK [7], использующей формальные спецификации требований к системе для автоматизированного построения тестов на соответствие им [8]. Основные элементы технологии UniTESK применительно к модулям арифметики таковы. Требования на тестируемые операции представляются формально в виде эталонных реализаций. Чтобы сделать спецификации независимыми от конкретного интерфейса модуля, разрабатывается прослойка медиаторов, связывающих спецификации операций с тестируемым модулем.
Рассматриваемая методика дополняет технологию UniTESK методами генерации тестов для операций над числами с плавающей точкой. В рамках предлагаемого подхода используются несколько типов тестов: сложные случаи округления, тесты на исключительные ситуации, особые случаи (специальные значения операндов, граничные значения и другие) и тесты с определенной битовой структурой операндов. Подход был успешно апробирован в проектах по тестированию Verilog-моделей FPU, реализующих операции деления и извлечения квадратного корня.
2 Исключение составляют унарные операции над числами однократной точности. (Определение чисел однократной точности дается во втором разделе.)
Статья состоит из шести разделов, включая введение и заключение. Второй раздел посвящен стандарту IEEE 754. В этом разделе описываются основные положения стандарта касательно представления чисел с плавающей точкой, режимов округления и исключений, вызываемых операциями. В третьем разделе описаны предлагаемые методики построения тестов. Четвертый раздел описывает архитектуру разработанной тестовой системы, предназначенной для тестирования Verilog-моделей FPU. В пятом разделе приведены результаты апробации тестовой системы.
2. Обзор стандарта IEEE 754
Стандарт IEEE 754 определяет представление двоичных чисел с плавающей точкой, а также режимы округления операций и исключения — специальные флаги, сигнализирующие либо о некорректности значений операндов, либо об особенностях результата операции.
В дальнейшем будем называть двоичные числа с плавающей точкой просто числами с плавающей точкой, а действительные числа, точно представимые в виде чисел с плавающей точкой — представимыми.
2.1. Представление чисел с плавающей точкой
Согласно стандарту IEEE 754, битовое представление чисел с плавающей точкой содержит три составляющие: знак, порядок и мантиссу. Под знак отводится один бит (значение О соответствует положительным числам, 1 — отрицательным); число бит, отводимое под порядок и мантиссу, зависит от типа чисел.
Пусть под порядок отводится п бит. Число В = 2" 1 - 1 называется смещением порядка (bias). Знаковый бит S, порядок Е и мантисса М числа х определяют его значение по следующим правилам: х = (-l)s • 2е • m, где:
• если Е Ф О, то е = Е - В; иначе, е = -В + 1;
• если 0<Е<2п-1, то m имеет двоичное представление 1.М, то есть целая часть m равна 1, а последовательность цифр дробной части совпадает с последовательностью бит М; если Е = 0, то m имеет двоичное представление О.М, такие числа (с нулевым порядком) называются денормализованными.
Заметим, что среди чисел с плавающей точкой существует число -0, которое стандарт требует считать равным 0.
Стандартом определены особые комбинации значений порядка и мантиссы:
• бесконечности (+х) — все разряды порядка равны единице, мантисса равна нулю (Е = 2П - 1, М = 0);
• не-число (NaN, Not-a-Number) — все разряды порядка равны единице, мантисса отлична от нуля (Е = 2П - 1, М Ф 0).
Значения NaN подразделяются на тихие (QNAN, Quiet NaN) и сигнальные (SNaN, Signaling NaN), которые отличаются старшим битом мантиссы: если он равен единице, это QNaN; в противном случае — SNaN.
Стандарт IEEE 754 определяет несколько возможных типов чисел с плавающей точкой (отличающихся числом бит, отводимых под порядок и мантиссу), среди которых чаще всего используются числа однократной точности (singles, single precision numbers) и числа двойной точности (doubles, double precision numbers).
Числа однократной точности — это числа с плавающей точкой, для представления которых используется 32 бита: 1 бит на знак, 8 бит на порядок и 23 бита на мантиссу.
знак порядок мантисса
II 1
Рис. 1. Представление числа однократной точности.
Числа двойной точности — это числа с плавающей точкой, для представления которых используется 64 бита: 1 бит на знак, 11 бит на порядок и 52 бита на мантиссу.
2.2. Режимы округления
Стандарт ШЕЕ 754 описывает операции сложения, умножения, вычитания, деления, вычисления остатка от деления, извлечения квадратного корня и преобразований между различными типами чисел. Общий принцип всех операций заключается в том, что результат получается из точного путем приведения к представимому числу согласно установленному режиму округления.
В стандарте определены четыре режима округления:
• округление к ближайшему представимому числу;
• округление к—ос,
• округление к +оо,
• округление к 0.
В режиме округления к ближайшему представимому числу, как следует из названия, результатом операции является представимое число, ближайшее к точному значению. Когда точное значение одинаково удалено от двух представимых чисел, выбирается то, у которого младший бит мантиссы равен нулю.
При округлении к -оо результатом является ближайшее представимое число, не превосходящее точного значения; при округлении к +оо — ближайшее
представимое число, которое не меньше точного значения; при округлении к О
— ближайшее представимое число, не превосходящее по абсолютной величине точного значения.
Три последних режима называют режимами направленного округления (idirected rounding).
Для иллюстрации режимов округления рассмотрим примеры. В первом примере требуется округлить число к ближайшему представимому числу однократной точности:
• исходная мантисса:
1010101010101010101010101111111b
• округленная мантисса:
10101010101010101010101000000000,
В следующем примере требуется округлить число с заданной мантиссой в сторону 0:
• исходная мантисса:
1010101010101010101010111111111b
• округленная мантисса:
101010101010101010101010000000009
2.3. Исключения
Стандартом IEEE 754 определены пять типов исключений:
• invalid operation — некорректная операция;
• division by zero — деление на нуль;
• overflow — переполнение;
• underflow — потеря значимости;
• inexact — потеря точности.
В стандарте приводится список ситуаций, в которых выставляется исключение invalid operation. Ниже представлены некоторые из них:
• любые операции над SNaN;
• сложение бесконечностей с разными знаками или вычитание бесконечностей с одинаковыми знаками;
• умножение 0-да;
• деление 0/0 ИЛИ со/со;
• взятие остатка от деления х гет у, где у = 0 или х = оо;
• извлечение квадратного корня из отрицательного числа.
Рассмотрим остальные исключения на примере деления чисел двойной точности в режиме округления к 0.
Исключение division by zero выставляется, когда делитель равен нулю. Обязательное условие возникновения исключения — не равное нулю или
бесконечности делимое. В случае возникновения исключения division by zero результат равен бесконечности:
делимое: 7FEFFFFFFFFFFFFF16 (1.797693е+308)
делитель: 0000000000000000i6 (+0)
частное: 7FF000000000000016 (+00)
исключения: division by zero
Исключение overflow возникает, когда результат операции превышает (по абсолютной величине) наибольшее представимое число:
делимое: 7FEFFFFFFFFFFFFF16 (1.797693е+308)
делитель: 0003A6B50B0F27BB16 (5.077619е-309)
частное: 7FEFFFFFFFFFFFFF16 (1.797693е+308)
исключения: overflow и inexact
Исключение underflow возникает, когда результат операции настолько мал (по абсолютной величине), что он может быть представлен только денормализованным числом:
делимое: 001000000000000016
делитель: 7FEFFFFFFFFFFFFF
частное: 0000000000000000i6
исключения: underflow и inexact
16
(2.225074е-308)
(1.797693е+308)
(+0)
Исключение inexact возникает, когда результат операции отличается от точного значения:
делимое: 27E83F0F3FFC953816 (1.78643 le+000)
делитель: FBAF43813FFFFFFF 16 (2.000000е+000)
частное: 2BC3037F3FEC953816 (8.932153е-001)
исключения: inexact
3. Методика построения тестовых данных
Для качественного тестирования модулей арифметики с плавающей точкой тесты должны затрагивать различные аспекты их функциональности: выполнение операций, округление результата, выставление исключений и так далее. В связи с этим мы используем несколько типов тестов: сложные случаи округления, тесты на исключительные ситуации, особые случаи (специальные значения операндов, граничные значения и другие) и тесты с определенной битовой структурой операндов.
Помимо перечисленных типов тестов мы также используем случайные тесты, которые бывают полезны на ранних стадиях тестирования.
3.1. Сложные случаи округления
Сложным случаем округления (hard-to-round case, extremal rounding boundary case) называется ситуация, когда значения операндов таковы, что результат операции очень близок к числу, представимому в форме числа с плавающей 12
точкой заданной точности, но отличается от него на величину значительно меньшую единицы последнего разряда мантиссы (ulp, unit in the last place). Очевидно, что значения операндов для сложных случаев округления зависят как от операции, так и от режима округления.
В сложных случаях округления возникает так называемая дилемма составителя таблиц (table maker’s dilemma). Дилемма состоит в том, что для выбора правильно округленного числа с плавающей точкой следует вычислить много дополнительных бит мантиссы результата, значительно больше, чем имеется в рассматриваемом типе чисел с плавающей точкой [8].
Для более точного определения сложных случаев округления введем понятие остаточных бит результата. Под остаточными битами будем понимать последовательность битов точно вычисленного результата, начинающуюся с бита, следующего за младшим битом мантиссы. В общем случае последовательность остаточных бит может быть бесконечной.
Сложным случаем для режима округления к ближайшему представимому числу (RN-hard, hard to round to nearest) называется ситуация, когда остаточные биты результата начинаются на 100...О или 011...1, где число нулей или, соответственно, единиц в конце последовательности достаточно велико. Сложным случаем для режима направленного округления (RD-hard, hard to round for directed rounding) называется ситуация, когда остаточные биты результата начинаются на 00...01 или 11...10, где число нулей или, соответственно, единиц в начале последовательности достаточно велико. Построению сложных случаев округления для различных операций, режимов и точности посвящено большое число исследований [9-16]. Используемый нами метод генерации таких чисел для операции деления основан на работах [9-14]. Для операции извлечения квадратного корня мы использовали метод, описанный в работе [15].
Важно отметить, что тесты на сложные случаи округления для операции деления (по крайней мере, для режимов округления к +оо) должны содержать как ситуации, в которых операнды имеют одинаковый знак, так и ситуации, в которых знаки операндов различны, поскольку знак результата (в этих режимах) влияет на округление. Такого рода ошибка была обнаружена нами в одной из реализаций FPU. Более подробное описание этой ошибки содержится в разделе “Практическая апробация подхода”.
3.2. Исключительные ситуации
Как было сказано выше, стандарт IEEE 754 определяет пять типов исключений. Не каждая операция вызывает все перечисленные исключения, однако, если тестируемая операция может вызвать некоторое исключение, тесты, в которых соответствующие ситуации реализуются, должны обязательно входить в тестовый набор. Также в тестовый набор целесообразно
включать тесты, в которых создаются ситуации “близкие” к исключительным, но таковыми не являющиеся.
Заметим, что для проверки правильности выставления исключения inexact можно использовать тесты на сложные случаи округления. Остановимся на операциях деления и извлечения квадратного корня. В силу своей природы операция извлечения квадратного корня никогда не вызывает исключений overflow и underflow. Тесты на исключение division by zero разрабатываются очевидным образом (они должны содержать деление конечных ненулевых чисел на +0). Рассмотрим подробнее тесты на исключение invalid operation (для обеих операций) и тесты на исключения overflow и underflow (для операции деления).
IEEE 754 требует, чтобы любая операция, использующая в качестве хотя бы одного операнда значение SNaN вызывала исключение invalid operation. Использование в качестве операндов SNaN и других особых значений реализуется в так называемых тестах на особые значения, которые будут описаны в соответствующем разделе.
Операция деления вызывает исключение invalid operation в случае неопределенности вида 0/0 или оо/оо. Тесты для операции деления должны включать обе неопределенности с различными знаками операндов.
Операция извлечения квадратного корня вызывает исключение invalid operation в случае, если операнд является отрицательным числом (исключение составляет значение -0, для которого значение квадратного корня определено и равно -0). Тесты для операции извлечения квадратного корня должны включать отрицательные числа, включая -0.
Пусть Mi и М2 — мантиссы первого и второго операндов, Е| и Е2 — их порядки. Обозначим через В смещение, а через Етах — максимальное значение порядка нормализованного числа3. Для наглядности рассмотрим случай, когда оба операнда являются нормализованными числами. Операция деления вызывает исключение overflow, если выполнено одно из следующих условий:
• Mi < М2 => В + (Ei - Е2) - 1 > Етах:
Если Mi < М2, результат деления мантисс лежит в интервале (0.5, 1). В этом случае для нормализации результата необходимо удвоить мантиссу и уменьшить порядок на единицу. Отсюда следует, что исключение возникает, если выполнено условие В + (Ei - Е2) - 1 > Етах.
3 Значения В и Етах зависят от точности рассматриваемого типа чисел с плавающей точкой: для чисел ординарной точности В равно 1¥и=\21. Етах — РЕ|,=254: для чисел двойной точности — В равно 3ррі6=1023, Етах — 7РЕі6=2046.
14
• Mi > М2 => В + (Ei - Е2) > Emax:
Если Mi > М2, результат деления мантисс лежит в полуинтервале [1,2). В этом случае нормализация результата не требуется, поэтому условие на исключение имеет вид В + (Ei - Е2) > Етах.
Пусть, как и прежде, Мь М2 — мантиссы первого и второго операндов,
Ei и Е2 — их порядки, В — смещение. Обозначим через Emm минимальное
значение порядка нормализованного числа4. Для наглядности рассмотрим случай, когда оба операнда являются нормализованными числами. Исключение underflow возникает, если выполнено одно из следующих условий:
• Mi < М2 => В + (Ei - Е2) - 1 < Emm;
• Mi > М2 => В + (Ei - Е2) < Emm.
Тесты должны включать ситуации как первого, так и второго типа, а также ситуации “близкие” к ним. Такие ситуации могут быть получены ослаблением приведенных выше условий. Так, для исключения overflow можно использовать значение Етах, уменьшенное на единицу, а для исключения underflow — значение Етт, увеличенное на единицу.
3.3. Особые случаи
Под особыми случаями мы понимаем числа с плавающей точкой, которые имеют специальную, определенную стандартом IEEE 754 семантику (оо, NaN), либо числа, в которых порядок и/или мантисса имеют граничные значения. Основные особые случаи для чисел однократной и двойной точности представлены в Таблице 1.
Граничные значения: наименьшие (по абсолютной величине) представимые числа и наибольшие (по абсолютной величине) представимые числа приведены в Таблице 2.
3.4. Числа с определенной битовой структурой
Использование чисел с определенной битовой структурой нацелено на тестирование следующих особенностей FPU микропроцессоров. Во-первых, для реализации операций над числами с плавающей точкой часто применяются табличные алгоритмы. Такие алгоритмы используют таблицу начальных приближений результата операции, которая индексируется с помощью определенных битов операндов. Поскольку таблица начальных приближений может содержать ошибочные данные, необходимо чтобы тесты покрывали все элементы этой таблицы. Во-вторых, результат операции часто вычисляется не полностью, а составляется из небольших частей путем сложения, конкатенации или с помощью других простых операций. В этом
4 Етш всегда равно 1 независимо от точности рассматриваемого типа чисел с плавающей точкой.
случае необходимо проверить правильность вычисления частей и правильность составления из них окончательного результата.
однократная точность двойная точность
знак порядок мантисса знак порядок мантисса
+0 0 ООіб 0 0 000i6 0
-0 1 ООіб 0 1 ОООіб 0
денорм. Числа {ОД } ООіб любая Ф 0 {0,1} ОООіб любая Ф 0
+00 0 FF16 0 0 7FF16 0
—00 1 FF16 0 1 7FF16 0
SNaN {ОД } FF16 любая Ф 0, старший бит = 0 {0,1} 7FF16 любая Ф 0, старший бит = 0
QNaN {ОД } FF16 любая Ф 0, старший бит = 1 {0,1} 7FF16 любая Ф 0, старший бит = 1
Таблица 1. Основные особые случаи.
Рассмотрим известную ошибку в FPU микропроцессора Pentium (1994 г.), связанную с неправильными данными в таблице начальных приближений результата [1-3]. Тим Коу (Tim Сое) и Пинг Так Петер Танг (Ping Так Peter Tang), а также Алан Эдельман (Alan Edelman) провели детальный анализ этой ошибки [17,18]. Они определили, что ошибка возникает, только в том случае, если мантисса делителя имеет вид M = mim2 ..., где биты с 5-го по 10-ый включительно равны единице. Более того, биты п^тг ... т4 при этом должны принимать одно из пяти определенных значений. Вероятность возникновения подобных ошибок на случайных тестах очень мала. Более того, такие ошибки можно не обнаружить, используя тесты на сложные случаи округления или другие типы тестов, описанные выше.
однократная точность двойная точность
знак порядок мантисса знак порядок мантисса
наибольшее норм. Число {ОД} FE16 7FFFFF16 {ОД} 7FE16 FF...F16
наименьшее норм. Число {ОД} Оііб 000000м {ОД} OOlie о о о
Наибольшее денорм. Число {ОД} О О 7FFFFFi6 {ОД} 000i6 FF...Fi6
Наименьшее денорм. Число {ОД} о о 00000І16 {ОД} ОООіб О о
Таблица 2. Наибольшие и наименьшие представимые числа.
В идеале, тестирование должно учитывать алгоритмы и схемы, использованные для реализации тестируемых операций. Если по каким-нибудь причинам это сделать не удается, например, когда не доступны исходные коды модуля и документация к нему, для перебора значений
операндов (или только их мантисс) можно использовать следующую эвристику. В операндах полностью перебираются только N последовательных бит, значения остальных бит при этом остаются фиксированными. После полного перебора положение бит меняется. Процесс продолжается до тех пор, пока не будут использованы все возможные положения перебираемых бит. Число N должно быть не слишком маленьким, чтобы обеспечить приемлемое качество тестирования, и не слишком большим, чтобы позволить перебрать операнды (и их комбинации, если операндов несколько) за разумное время. Подобную эвристику можно использовать и применительно к битам результата. В этом случае, чтобы получить значения операндов необходимо разрешить уравнение Г(\|. ...,хп)=у, где f — тестируемая операция, у — требуемое значение результата, а XI, ..., хп — искомые значения операндов.
11111111...11111111
11011110...10101101
11111111...11111111
фиксированные
биты
фиксированные
биты
Рис. 2. Схема построения чисел с определенной битовой структурой.
Следует отметить, что использование таких простых эвристик позволило нам обнаружить и локализовать критическую ошибку в операции вычисления квадратного корня для чисел двойной точности в FPU промышленного микропроцессора. Более подробное описание этой ошибки содержится в разделе “Практическая апробация подхода”.
Рис. 3. Архитектура тестовой системы.
4. Архитектура тестовой системы
В соответствии с описанным подходом нами была разработана тестовая система для тестирования Verilog-моделей FPU микропроцессоров. Разработка
велась на языке программирования С. В качестве основы построения тестовой системы мы использовали технологию UniTESK [7,19]. Архитектура тестовой системы показана на Рис. 3.
Verilog-окружение (testbench) содержит экземпляр тестируемой Verilog-модели FPU. В начале тестирования окружение инициализирует тестируемую модель, после чего в цикле принимает от тестовой системы тестовые воздействия (код операции и значения операндов), подает их на тестируемую модель, ожидает реакции (результат операции и флаги исключений) и передает их тестовой системе для проверки. Прием тестовых воздействий и передача реакций осуществляются через VPI-медиатор.
VPI-медиатор связывает тестируемую модель с медиатором тестовой системы. Он реализует установку значений входных сигналов тестируемой модели в соответствии текущим тестовым воздействием, а также съем значений выходных сигналов. VPI-медиатор реализован с помощью интерфейса VPI (Verilog Procedural Interface) [20].
Медиатор преобразует значения операндов операции из внутреннего представления тестовой системы в представление, описанное в стандарте, и наоборот — значение результата операции из стандартного представления во внутреннее.
Тестовый оракул оценивает правильность поведения тестируемой модели в ответ на единичное тестовое воздействие. В основе тестового оракула лежат эталонные реализации операций над числами с плавающей точкой. Тестовый оракул записывает в трассу теста тестовые воздействия, на которых тестируемая модель FPU выдает ошибочный результат (результат, расходящийся с эталонной реализацией).
Генератор тестовых воздействий реализует построение тестов описанных выше типов: сложные случаи округления, тесты на исключительные ситуации, особые случаи, тесты с определенной битовой структурой операндов и случайные тесты. Выбор того или иного сценария генерации осуществляется на основе параметров теста, которые также задают точность чисел, режим округления и ограничения на число тестов.
4.1. Эталонные реализации операций
Для эталонной реализации операций используется расширенное представление чисел с плавающей точкой, в котором число бит, отводимое под мантиссу, достаточно для корректного округления результата реализуемых операций5.
5 Для корректного округления результата сложения, вычитания, умножения, деления и извлечения квадратного корня достаточно, чтобы размер расширенного представления мантиссы был равен 2 • |М|, где |М| — это число 18
Эталонные реализации операций над числами с плавающей точкой описывают формально требования стандарта ШЕЕ 754. Они вычисляют корректные результаты операций (с учетом установленного режима округления) и устанавливают флаги исключений. Рассмотрим кратко используемые нами эталонные реализации операций деления и извлечения квадратного корня без учета обработки исключительных ситуаций.
4.1.1. Эталонная реализация деления
Эталонная реализация операции деления основана на известном алгоритме деления двоичных чисел с фиксированной точкой. Перед использованием алгоритма вычисляется знак результата (исключающее ИЛИ знаков операндов) и порядок (разность порядков делимого и делителя). После этого операнды приводятся к специальному виду 01М, где М — это биты мантиссы.
Полученные значения операндов заносятся в переменные N (делимое) и Б (делитель). Значения старших бит переменных будем называть знаками. Вычисление происходит последовательно от старшего к младшему биту мантиссы результата:
• если знак N равен нулю, в текущий разряд результата записывается единица, иначе — нуль;
• если знак N равен единице, N присваивается результат сложения N и Б; иначе — результат сложения N и дополнения Б;
• значение N сдвигается на один разряд влево.
Полученный результат преобразуется в форму мантиссы, для этого он сдвигается влево. Величиной сдвига является минимальное число, при котором старший единичный разряд оказывается за пределами разрядной сетки мантиссы. Заметим, что при сдвиге необходимо корректировать порядок результата.
4.1.2. Эталонная реализация извлечения квадратного
корня
Извлечение квадратного корня реализовано следующим образом. Знак результата совпадает со знаком операнда (отрицательный знак операнда возможен только в случае, когда его значение равно -0), порядок равен половине порядка операнда6. Мантисса результата вычисляется с помощью
бит, отводимое под мантиссу в рассматриваемом типе чисел с плавающей точкой [21].
6 Если быть точнее, используются следующие правила вычислений:
• если Е < В, то Еге8 <— В - ((В - Е) » 1)
о если Е тоё 2 = 0, то Еге8 <— Еге8 - 1
• если Е > В, то Еге8 <— В + ((Е - В) » 1)
алгоритма, в основе которого лежит возведение в квадрат. Последовательно от старшего к младшему биту мантиссы производятся следующие действия:
• текущий бит мантиссы результата устанавливается в единицу;
• полученная мантисса возводится в квадрат и сравнивается с исходным числом;
• если исходное число меньше, установленная единица сбрасывается в нуль.
5. Практическая апробация подхода
Разработанная тестовая система была успешно применена для тестировании двух различных Verilog-моделей FPU с одинаковым интерфейсом (будем обозначать их FPUi и FPU2), реализующих операции деления и извлечения квадратного корня для чисел однократной и двойной точности.
В результате тестирования FPU | была найдена критическая ошибка в реализации операции извлечения квадратного корня для чисел двойной точности. Ошибка была обнаружена на тестах с определенной битовой структурой операнда. Такие тесты позволили нам найти значения, на которых операция возвращала ошибочный результат. Анализ обнаруженных значений показал — если извлечь из них квадратный корень, то мантиссы результата имеют определенную структуру: младшие 36 бит являются единичными, а 16 старших — “случайные”. Мы перебрали все числа с описанной структурой (при некотором фиксированном порядке) — числа возводились в квадрат и подавались в качестве операнда. В результате было найдено большое число (около 6000 для каждого фиксированного порядка) “ошибочных” значений. Рассмотрим примеры (округление осуществляется в сторону 0):
операнд: 64300800FFFFFFFE16 (3.965019е+174)
полученный результат: 52100403FFFFFFFF16 (1.991243е+087)
корректный результат: 521003FFFFFFFFFF16 (1.991236е+087)
операнд: 2CB01687E8FFFFFE16 (1.928163е-093)
полученный результат: 36500B43FFFFFFFF16 (4,391102е-047)
корректный результат: 36500B3FFFFFFFFF16 (4.391085е-047)
В результате тестирования FPU2 были найдены ошибки, связанные с неточностями в округлении и выставлении флагов исключений. Например, была обнаружена ошибка, возникающая при округлении к +оо отрицательного результата (ошибка проявлялась как на числах однократной точности, так и двойной).
Рассмотрим примеры:
делимое:
делитель:
полученный результат: корректный результат:
делимое:
делитель:
полученный результат: корректный результат:
68CDCD2C16
A8B5F04C16
FF80000016
FF7FFFFF16
(7.774959е+024)
(-2.019925Є-014)
(-оо)
(-3.402823Є+038)
983FFFFFBD72729216 (-7.013789е-192)
581000007B4947AD16 (1.57608ІЄ+116)
801FFFFEC6DFECA516 (-4.450145е-308) 801FFFFEC6DFECA416 (-4.450145е-308)
Тестовая система также использовалась для тестирования Уепк^-модели модуля деления чисел однократной точности, доступной на сайте [22]. Следует отметить, что адаптация тестовой системы под эту реализацию заняла около 30 минут. Изменения касались компонентов тестовой системы наиболее приближенных к тестируемой модели, а именно Уепк^-окружения и УР1-медиатора (это около 10% от общего объема исходного кода тестовой системы). Ошибок обнаружено не было.
6. Заключение
В работе была рассмотрена методика функционального тестирования модулей арифметики с плавающей точкой микропроцессоров на соответствие стандарту IEEE 754. Методика основана на технологии тестирования UniTESK, но дополнена методами генерации тестов для операций над числами с плавающей точкой, которые позволяют осуществить разностороннее систематичное тестирование FPU. Разработанная согласно описанной методике тестовая система была использована для тестирования нескольких Verilog-моделей FPU, реализующих операции деления и извлечения квадратного корня для чисел однократной и двойной точности. В результате тестирования было найдено несколько серьезных ошибок.
Литература
[1] Statistical Analysis of Floating Point Flaw in the Pentium Processor. Intel Corporation, November 1994.
[2] B. Beizer. The Pentium Bug —An Industry Watershed. Testing Techniques Newsletter (TTN), TTN Online Edition, September 1995.
[3] A. Wolfe. For Intel, It’s a Case of FPU All Over Again. EE Times, May 1997.
[4] A.K. Поляков. Языки VHDL и VERILOG в проектировании цифровой аппаратуры.
— М.: СОЛОН-Пресс, 2003.
[5] IEEE Standart for Binary Floating-Point Arithmetic 754, 1985.
[6] IEC 60559:1989. Binary Floating-Point Arithmetic for Microprocessor Systems.
Geneve: ISO, 1989.
[7] http://www.unitesk.com.
[8] B.B. Кулямин. Формальные подходы к тестированию математических функций. ИСП РАН, 2006.
[9] D. Matula, L. McFearin. Number Theoretic Foundations of Binary Floating Point Division with Rounding. Real Numbers and Computers, 2000.
[10] D. Matula, L. McFearin. Generation and Analysis of Hard to Round Cases for Binary Floating Point Division. Symposium on Computer Arithmetic, 2001.
[11] D. Matula, L. McFearin. Selecting a Well Distributed Hard Case Test Suite for IEEE Standard Floating Point Division. International Conference on Computer Design, 2001.
[12] D. Matula, L. McFearin. A pxp Bit Fraction Model of Binary Floating Point Division and Extremal Rounding Cases. Theoretical Computer Science, 2003.
[13] D. Matula, L. McFearin. A Formal Model and Efficient Traversal Algorithm for Generating Testbenches for Verification of IEEE Standard Floating Point Division. Conference on Design, Automation and Test in Europe, 2006.
[14] D. Matula, L. McFearin. Generating a Benchmark Set of Extremal Rounding Boundary Instances for IEEE Standard Floating Point Division. http://engr.smu.edu/~matula/single/paper.ps.
[15] W. Kahan. A Test for Correctly Rounded Square Root. Computer Science Department, Berkeley, 1994.
[16] M. Parks. Number-Theoretic Test Generation for Directed Rounding. IEEE Transactions on Computers, Vol. 49. 2000.
[17] Т. Coe, P. T. P. Tang. It Takes Six Ones to Reach a Flaw. Chinese University of Hong Kong. Technical Report 95-5(61), 1995.
[18] A. Edelman. The Mathematics of the Pentium Division Bug. 1995. http://www-math.mit.edu/~edelman/homepage/papers/pentiumbug.ps.
[19] В. П. Иванников, А. С. Камкин, В. В. Кулямин, А. К. Петренко. Применение технологии UniTesK для функционального тестирования моделей аппаратного обеспечения. Препринт Института системного программирования РАН, 2005. http://citforum.ru/SE/testing/unitesk_hard/.
[20] S. Sutherland. The Verilog PLI Handbook: A User's Guide and Comprehensive Reference on the Verilog Programming Language Interface. Springer, 2002.
[21] D. Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. Computing Surveys. March, 1991.
[22] http://www.opencores.org.