Представление бесконечно вещественных чисел с конечным числом бит требует приближения. Это приближение может привести к ошибкам округления при расчетах с плавающей точкой. Чтобы измерить ошибки округления, стандарт с плавающей точкой использует относительную погрешность и ошибку ULP (Units in the Last Place). Чтобы узнать об относительной погрешности, см. «Относительная точность» и «Факторы ULP».
Если экспонентная область значений не ограничена выше, Модули в Last Place (ULP) числа с плавающей запятой x являются расстоянием между двумя близкими трансграничными числами с плавающей запятой a и b ближайшими к x. Стандарт IEEE-754 требует, чтобы результат элементарной арифметической операции, такой как сложение, умножение и деление, был правильно округлым. Правильно округленный результат означает, что округленный результат находится в пределах 0,5 ULP от точного результата.
Нативная технология с плавающей точкой в HDL- Coder™ соответствует стандарту IEEE арифметики с плавающей точкой. Основные арифметические операции, такие как сложение, вычитание, умножение, деление и взаимное, уполномочены IEEE иметь нулевую ошибку ULP. Когда вы выполняете эти операции в нативном режиме с плавающей точкой, числовые результаты, полученные из сгенерированного HDL-кода, совпадают с исходным Simulink® модель.
Некоторые расширенные математические операции, такие как экспоненциальные, логарифмические и тригонометрические операторы, имеют специфическое для машины поведение реализации, потому что эти операторы используют повторяющиеся реализации на основе рядов тейлоров и ремезов. Когда вы используете эти операторы в нативном режиме с плавающей точкой, могут быть относительно небольшие различия в числовых результатах между моделью Simulink и сгенерированным HDL-кодом.
Можно измерить различие в числовых результатах как относительная погрешность или ULP. Ненулевое ULP для этих операторов не означает несоответствия стандарту IEEE. ULP единицы эквивалентен относительной погрешности 10^-7
. Можно игнорировать такие относительно небольшие ошибки, задавая пользовательское значение допуска для ULP при генерации HDL- испытательного стенда. Например, можно задать пользовательский допуск с плавающей точкой одного ULP, чтобы игнорировать ошибку при проверке сгенерированного кода. Для получения дополнительной информации см. раздел «Параметры допуска с плавающей точкой».
Таблица перечисляет ULP операторов с плавающей точкой, которые имеют ненулевое ULP. В сложение к этим операторам блок HDL Reciprocal имеет ULP из пяти.
Математические функции
Для определенных входных значений с плавающей точкой некоторые блоки могут получить результаты симуляции, которые варьируются от MATLAB® результаты симуляции. Чтобы увидеть различие в результатах, прежде чем вы сгенерируете код, включите генерацию модели валидации. В диалоговом окне Параметры конфигурации на панели HDL Code Generation установите флажок Generate validation model.
Если вы выполняете расчеты, которые включают комплексные числа и исключение, такое как Inf
или NaN
Результат HDL-симуляции с собственной плавающей точкой может потенциально отличаться от результата симуляции Simulink. Для примера, если вы умножаете комплексный вход с Inf
, результат симуляции Simulink Infi
тогда как результатом моделирования HDL является NaN+Infi
.
Если вы вычисляете квадратный корень или логарифм отрицательного числа, результат симуляции с собственной плавающей точкой 0
. Этот результат совпадает с результатом симуляции при проверке проекта с помощью испытательного стенда SystemVerilog DPI. В Simulink полученный результат NaN
. Согласно IEEE-754 стандарту, если вычислить квадратный корень или логарифм отрицательного числа, то результатом будет само это число.
Если вход в Direct Lookup Table (n-D) имеет тип данных с плавающей точкой, но элементы таблицы используют меньший тип данных, сгенерированный HDL-код может быть потенциально неправильным. Для примера вход имеет значение single
type и элементы используют uint8
тип. Чтобы получить точные результаты симуляции HDL, используйте совпадающий тип данных для входного сигнала и элементов интерполяционной таблицы.
Если вы используете блок Cosine с входами -7.729179E28
или 7.729179E28
, сгенерированный HDL-код имеет ULP 4. Для всех других входов ULP равен 2.
Когда вы используете Math Function блок для вычисления mod(a,b)
или rem(a,b)
, где a
- дивиденды и b
является делителем, результат симуляции в собственном режиме с плавающей точкой изменяется от результата симуляции MATLAB в этих случаях:
Если , результат симуляции в собственном режиме с плавающей точкой равен нулю. Для такого значительного различия в величине между числами a
и b
эта реализация сохраняет область на целевом устройстве FPGA.
Если результат симуляции в собственном режиме с плавающей точкой может потенциально отличаться от результатов симуляции MATLAB.