Хорошо, теперь я могу ответить на свой вопрос. Мне удалось собрать работающую реализацию SHA1 в Verilog.
https://github.com/ekuznetsov139/fpga
Это фактически генератор PMK WPA2, а не просто SHA1 (SHA1 выполняется в цикле 8192 раза для одних и тех же данных.)
Я бы не стал утверждать, что он идеально оптимизирован или даже особенно хорошо закодирован - я узнал все, что знаю о Verilog за последние две недели, в промежутке между другими проектами, и половина этого времени была потрачена на сбор данных и из нескольких экземпляров ядра через PCI-Express. Но я получил корректную работу в симуляторе и успешно запустил реальную ПЛИС, и показатели производительности близки к моим первоначальным прогнозам. С целью Cyclone V я последовательно вижу около 7000 ALM на ядро, причем каждое ядро способно выполнять один хэш на такт. Один ALM - это, по сути, 2 LUT (1 большая или 2 маленьких) плюс некоторое оборудование для переноса сумматора Итак, 14 000 ЛУТ. Fmax, кажется, составляет около 300 МГц для быстрого кремния и ближе к 150 МГц для медленного кремния.
Одна вещь, которую я не учел в своих первоначальных оценках, - это потребность в большом количестве памяти для внутреннего состояния. 21 32-разрядные переменные, умноженные на 80 шагов, равны 53760 битам, и при 4 регистрах на ALM для этого потребуется больше ресурсов, чем для всех вычислений. Но компилятор может упаковать большую часть этого в ячейки памяти, даже если я не проинструктирую его делать это явно.
Маршрутизация / компоновка - довольно большая проблема. У меня есть чип с 113K ALM (301K LE). Максимум, что я смог вписать в него - 5 копий. Это менее 40% использования. И это заняло ~ 8 часов примерки. Попробую возиться с LogicLock, чтобы посмотреть, смогу ли я сделать лучше.
При одновременном запуске 5 копий на частоте 300 МГц пропускная способность будет равна 1,5 Гхаш / с SHA1 или 90 Кхаш / с WPA2. Что несколько меньше, чем я ожидал (около 1/3 пропускной способности GeForce 980 Ti). Но, по крайней мере, эффективность использования энергии намного лучше.
РЕДАКТИРОВАТЬ: Один взгляд на Планировщик разделов дизайна в стандартной версии Quartus выявил проблему. Компилятор, слишком умный для собственной пользы, объединял массивы внутренних хранилищ каждого ядра, создавая тонны ненужных соединений между ядрами.
Даже без полного LogicLock, просто с «Разрешить объединение регистров сдвига по иерархиям», установленным на «выкл», у меня есть успешное совпадение с 10 копиями. Посмотрим, смогу ли я сделать 12 ...