"Си как HDL, или Verilog без always".
Любой синхронный дизайн FPGA сводится к куче регистров(триггеров) с комбинационной логикой на входах, см. рис.
Порт данных регистра в общем случае многоразрядный, сигнал разрешения клока всегда одноразрядный.
В общем случае только сигналы разрешения клока не защелкиваются в конечном итоге в регистре, все остальные данные в конечном итоге защелкиваются в регистре (не считая промежуточных данных).
Получается, для полного описания синхронного дизайна достаточно различать "комбинационный" и "регистровый" тип данных, и иметь условный оператор присваивания вместе с арифметико-логическими операциями.
Комбинационная логика без проблем описывается и в обычных ЯВУ, остается только найти максимально удобный способ различать "комбинационный" и "регистровый" тип данных.
Различать эти типы данных можно разными способами, например:
1) по месту присваивания - указанием типа операции,
2) по объявлениям переменных - указанием типа данных.
Verilog/SystemVerilog использует первый способ - по месту присваивания, причем не типом операции присваивания (блокирующее/неблокирующее), а типом блока (always_comb/always_ff), в котором выполняется присваивание. Такой подход приводит к вынужденному дроблению целостного алгоритма, и разнесению логически связанных частей в логически несвязанные блоки. Если отказаться от такого способа различения типов, надобность в always-блоках отпадает, как и необходимость различать блокирующее/неблокирующее присваивание. По синтаксису получится - почти Си, с различением типов по объявлениям переменных.
Зачем все это? Затем, что будущее не за процессорами, а за реконфигурируемыми вычислениями. И составил для себя такой план практической проверки этой идеи:
1) Проработать методику использования одного из распространенных языков программирования для низкоуровневого описания схем. Выбор пал на Си: "Си как HDL, или Verilog без always". Текущий этап.
2) Перейти к высокоуровневому описанию схем. Для этого в первую очередь надо обеспечить возможность описывать FSM в стиле структурного программирования. Следующий этап, есть некоторые наработки.
3) Кардинально ускорить синтез и верификацию. Это самое сложное, и самое главное, и возможно только при помощи реконфигурируемых вычислений - замкнутый круг, однако...