32bit_me (32bit_me) wrote,
32bit_me
32bit_me

Categories:

Таблица умножения

Ни один проект на Verilog не может быть использован и запущен в железе до тех пор, пока он не пройдёт полную верификацию с 100% тестовым покрытем.

Для верификации используется множество методов и инструментов, однако для своих простых проектов я использую простые тестбенчи на обычном же Verilog (даже не на System, хотя следовало бы).

Обычно нужно проверить все "corner cases", т.е. разные максимальные и минимальные значения переменных, а затем проверить по возможности большое количество случайных комбинаций сигналов и команд, подаваемых на тестируемый модуль. По-научному это называется CRT, Constrained Random Testing, то есть тестирование случайными сигналами, на которые наложены некоторые ограничения.

Хороший тест бывает очень непросто придумать. Главное при верификации цифрового дизайна, чтобы в тестируемой схеме (DUT, device under test) при прохождении теста было проверено срабатывание каждой цепи хотя бы один раз. Тогда такой тест будет иметь покрытие 100%, чего и нужно добиваться. Не зря в серьёзных местах разработкой тестов занимаются специально обученные люди, инженеры по верификации.



Вот, например, кусок из тестового файла, который тестирует модуль умножения:


0000000000000000 0000000000000000 0000000000000000 //0 * 0 = 0
0000000000000000 8000000000000000 8000000000000000 //0 * -0 = -0
0000000000000000 7ff8000000000000 7ff8000000000000 //0 * nan = nan
0000000000000000 fff8000000000000 fff8000000000000 //0 * nan = nan
0000000000000000 7ff0000000000000 fff8000000000000 //0 * +inf = nan
0000000000000000 fff0000000000000 fff8000000000000 //0 * -inf = nan
8000000000000000 0000000000000000 8000000000000000 //-0 * 0 = -0
8000000000000000 8000000000000000 0000000000000000 //-0 * -0 = 0
8000000000000000 7ff8000000000000 7ff8000000000000 //-0 * nan = nan
8000000000000000 fff8000000000000 fff8000000000000 //-0 * nan = nan
8000000000000000 7ff0000000000000 fff8000000000000 //-0 * +inf = nan
8000000000000000 fff0000000000000 fff8000000000000 //-0 * -inf = nan
7ff8000000000000 0000000000000000 7ff8000000000000 //nan * 0 = nan
7ff8000000000000 8000000000000000 7ff8000000000000 //nan * -0 = nan
7ff8000000000000 7ff8000000000000 7ff8000000000000 //nan * nan = nan
7ff8000000000000 fff8000000000000 7ff8000000000000 //nan * nan = nan
7ff8000000000000 7ff0000000000000 7ff8000000000000 //nan * +inf = nan
7ff8000000000000 fff0000000000000 7ff8000000000000 //nan * -inf = nan
fff8000000000000 0000000000000000 fff8000000000000 //nan * 0 = nan
fff8000000000000 8000000000000000 fff8000000000000 //nan * -0 = nan
fff8000000000000 7ff8000000000000 fff8000000000000 //nan * nan = nan
fff8000000000000 fff8000000000000 fff8000000000000 //nan * nan = nan
fff8000000000000 7ff0000000000000 fff8000000000000 //nan * +inf = nan
fff8000000000000 fff0000000000000 fff8000000000000 //nan * -inf = nan
7ff0000000000000 0000000000000000 fff8000000000000 //+inf * 0 = nan
7ff0000000000000 8000000000000000 fff8000000000000 //+inf * -0 = nan
7ff0000000000000 7ff8000000000000 7ff8000000000000 //+inf * nan = nan
7ff0000000000000 fff8000000000000 fff8000000000000 //+inf * nan = nan
7ff0000000000000 7ff0000000000000 7ff0000000000000 //+inf * +inf = +inf
7ff0000000000000 fff0000000000000 fff0000000000000 //+inf * -inf = -inf
fff0000000000000 0000000000000000 fff8000000000000 //-inf * 0 = nan
fff0000000000000 8000000000000000 fff8000000000000 //-inf * -0 = nan
fff0000000000000 7ff8000000000000 7ff8000000000000 //-inf * nan = nan
fff0000000000000 fff8000000000000 fff8000000000000 //-inf * nan = nan
fff0000000000000 7ff0000000000000 fff0000000000000 //-inf * +inf = -inf
fff0000000000000 fff0000000000000 7ff0000000000000 //-inf * -inf = +inf



Это, как можно заметить, и есть corner cases, пограничные случаи, использующие значения +-inf, +-0, и nan. А дальше идут рандомные пары чисел, десятки тысяч. Тестировать такой модуль на ста тестах, или даже на тысяче тестах нельзя, слишком много нюансов, которые проявляются только в одном случае из тысяч. Ошибка может появиться, например, на 5000-м тесте, и она произойдёт из-за такой комбинации чисел, что её трудно как-то заранее предугадать.
Tags: fpga, verilog
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments