Вообще, впечатление такое, что в ARM пишут, мягко говоря, неаккуратно, а зачастую и попросту неэффективно. Вот, наткнулся на такое, ковыряя NVIC (контроллер прерываний) в Cortex-M3:
Код:
assign int_pend_we = (opt_int_pend!=prev_int_pend);
always @ (posedge fclk or negedge hreset_n)
if (!hreset_n)
prev_int_pend <= {INTS{1'b0}};
else if (int_pend_we)
prev_int_pend <= opt_int_pend;
Как видно, значения с шины opt_int_pend (это линии запросов прерываний) сохраняются в регистре prev_int_pend только в случае, если установлен int_pend_we, а он, в свою очередь, установлен, если содержимое prev_int_pend не совпадает с opt_int_pend. Таким образом, если состояние линий запросов прерываний не изменилось, регистр не меняется, если изменилось -- меняется, а соответственно, данный сигнал абсолютно бессмысленен. Между тем, при синтезе он съедает энное количество ресурсов. Например, при синтезе данного модуля для Virtex-6 при 256 запросах прерываний (для Cortex-M3 оно заявлено как максимально возможное, хотя сама архитектура допускает до 512, из коих 16 всегда стандартные, а остальные -- внешние линии IRQ) получилась потребность в 769 триггерах и 1490 LUTах, а при выкидывании сигнала opt_int_pend и простом приёме в регистр каждый такт -- те же 769 триггеров, но 1150 LUTов, т.е. на 350 меньше.
UPD. Дооптимизировал сей модуль и получил в итоге 877 LUTов.