Отчеты о мощности и времени двух разных конструкций VHDL

Предположим, у меня есть две схемы (описанные в vhdl), первая из которых выполняет следующий алгоритм в цикле (псевдокод):

C<=A+B;
D<=C+F;
RES <= D;

Я представляю этот алгоритм, применяя логику конечного автомата (FSM). Таким образом:

State1:C<=A+B;
       out_ready<='0';--the result is not ready yet
       nextstate<=State2;
State2:D<=C+F;
       nextstate<=S_out;
S_out: RES<=D;
       out_ready<='1';--the result is ready
       nextstate<=State1;

Второй алгоритм также является последовательным и представлен через автоматную логику. Имейте в виду, что CSA — это Carry Save Adder, имеющий 3 входа (A, B, C) и мгновенно генерирующий два результата S и C:

S <= '0'&(A xor B xor C);
C <= (A and B) or (A and C) or (B and C) & '0';

Если мы суммируем S и C, мы получаем результат суммы

RES <= S+C;

Преимущество заключается в том, что в некоторых случаях вы можете работать только с векторами S и C (генерирует за один такт) без необходимости их добавления. Хорошо, вернемся к моему второму алгоритму:

(S,C)=(A,B,Carry_in);
(S,C)=(S,C,F);
RES_S=S;
RES_C=C;

Также это представляло применение FSM:

State_CSA_1:
   S <= '0'&(A xor B xor 0);
   C <= (A and B) or (A and 0) or (B and 0) & '0';
   out_ready<='0';--the result is not ready yet
   nextstate<=State_CSA_2;
State_CSA_2:
   S <= '0'&(S xor C xor F);
   C <= (S and C) or (S and F) or (C and F) & '0';
   nextstate<=S_out;
S_out:
   RES_S<=S;
   RES_C<=C;
   out_ready<='1';--the result is ready
   nextstate<=State_CSA_1;

Итак, если я выполняю симуляцию (я использовал modelsim) с файлом тестового стенда, который меняет полярность тактового сигнала каждые 0,5 нс, я получаю, что в обоих случаях результат генерируется после 3 тактовых циклов. Но очевидно, что второй алгоритм гораздо быстрее. Учитывая, что я должен написать отчет о различиях между двумя схемами, у меня есть следующие вопросы:

1) Я хочу знать время, необходимое для выполнения двух алгоритмов. Если я проведу временной анализ, например, с помощью Xilinx ISE, будут ли различия между производительностью двух схем? Или и в этом случае время будет выводиться по 3 тактам?

2) Я должен сообщить время, потребляемую мощность и занимаемую площадь (площадь). Какое программное обеспечение вы рекомендуете? Поскольку у меня не так много времени, что-то простое в использовании или хорошо документированное (учебники и т. д.).

PS Два алгоритма были придуманы, пока я писал этот пост, я занимаюсь другими скучными вещами.


person LyB8899    schedule 07.06.2015    source источник


Ответы (1)


Характеристики цифровых цепей измеряются с точки зрения: пропускной способности, максимальной рабочей частоты, задержки, площади и мощности.

Ваши 3 такта - это задержка, которую довольно легко вывести из вашего VHDL, поскольку ваш FSM составляет 3 цикла от ввода до вывода. Максимальная рабочая частота и площадь задаются инструментом синтеза. Мощность можно оценить всеми инструментами синтеза (у ISE есть XPower), она может быть очень точной, если вы правильно вводите данные.

Наконец, пропускная способность — это мера того, сколько данных вы можете обработать. В обеих архитектурах ваш выход доступен 1/3 цикла, поэтому ваша пропускная способность составляет 1/3. Сравните с этим описанием:

process(clk)
    if rising_edge(clk) then
        s_0 <= a + b;
        v_0 <= in_valid;
        f_0 <= f;

        s_1 <= s_0 + f_0;
        v_1 <= v_0;

        res <= s_1;
        out_ready <= v_1;
    end if;
end process;

В моем описании задержка также равна 3, но я могу получать вывод каждый цикл, поэтому моя пропускная способность составляет 1/цикл, что в 3 раза больше, чем в ваших описаниях. Теоретически площадь должна быть больше, чем ваши схемы, но, вероятно, нет, поскольку накладные расходы меньше. В более сложном примере будет больше различий, добавление довольно просто, особенно в ПЛИС.

По моему опыту, задержка редко является проблемой, за исключением интерфейсов и отдельных приложений. Нам нужна максимальная пропускная способность и минимальная площадь, иногда мощность (хотя ПЛИС в этом не очень хороши). Максимальная рабочая частота связана с пропускной способностью: схема 1/такт, которая может работать на частоте 200 МГц, имеет вдвое большую общую пропускную способность, чем схема, работающая на частоте 100 МГц.

Наконец, вы, кажется, запутались в использовании CSA. Преимущество в том, что это постоянная задержка. Выполнение CSA для 1024-битного кода занимает столько же времени, сколько для 4-битного. Заставляя CSA запускаться один раз за такт, вы сводите на нет преимущество, поскольку теряется более быстрое время; окончательная максимальная рабочая частота в любом случае будет определяться полным сумматором.

Вы также должны знать, что технология Xilinx LUT6 (Spartan-6 и новее) может выполнять сложение с 3 входами по той же цене (время и площадь), что и сложение с 2 входами. Он использует LUT6 для выполнения CSA и быструю логику переноса для окончательного добавления. В дополнении с двумя входами также используется LUT6 (в качестве сквозного маршрута) и логика быстрого переноса. Таким образом, использование 3-входовых сумматоров на Xilinx не является недостатком.

person Jonathan Drolet    schedule 07.06.2015
comment
Спасибо за подробный ответ. Но теперь у меня возник вопрос: как сделать мой второй алгоритм с меньшей задержкой? Я использую CSA вместо обычного сумматора, чтобы получить более быструю схему. Но, как вы говорите, если я использую FSM, задержка останется прежней. - person LyB8899; 07.06.2015
comment
Вы бы делали CSA+FA в одном цикле вместо двух последовательных. Вы получите более медленную максимальную рабочую частоту (максимальная задержка CSA+FA вместо FA), но ваша задержка будет ниже. Там вы увидите определенное преимущество перед FA+FA в одном цикле, где задержка будет больше, особенно при большой ширине. - person Jonathan Drolet; 07.06.2015
comment
А в случае, когда FA не нужен? В моем проекте у меня есть цикл от N до 0, и FA используется только тогда, когда цикл цикла завершается (только один раз за все время выполнения). Предположим, int i=N-1; while(i>0){ (S,C)=CSA(A,B,D); (S,C)=CSA(S,C,E); (S,C)=CSA(S,C,F); i--; } RES= S+C; Как я могу извлечь выгоду из использования CSA? Есть ли другие способы реализовать это в vhdl без ожидания одного такта для каждой инструкции? - person LyB8899; 07.06.2015
comment
Вам всегда нужен FA для окончательного добавления (RES = S+C). Вы можете заглянуть в дерево гадюк, это поле само по себе. Если вы хотите сделать a+b+d+e+f как можно быстрее за один такт, я думаю (это не совсем моя специальность), вы должны использовать компрессор 4:2, за которым следуют CSA и FA. Обратите внимание, что эти арифметические оптимизации обычно не выполняются в FPGA. Задержка маршрутизации в FPGA очень значительна, а быстрый перенос практически свободен от задержки маршрутизации и очень-очень быстр. Если ширина вашего сумматора не является необычно большой, задержка маршрутизации, вероятно, будет больше, чем распространение пульсаций. - person Jonathan Drolet; 07.06.2015
comment
Я не хочу делать a+b+d+e+f, это просто пример того, что между тремя CSA существуют зависимости, и они должны выполняться в правильном порядке. Единственный способ соблюдать этот порядок - выполнять одну инструкцию за часы? или есть другие методики? - person LyB8899; 07.06.2015
comment
Google для дерева гадюки. Если вы хотите сделать это как можно быстрее, вы должны использовать CSA/компрессоры как можно больше параллельно. Например, если вы хотите сложить вместе 18 значений, этап 1 будет состоять из 6 CSA, преобразующих сложение 18 в сложение 12. Второй этап будет использовать 4 CSA для преобразования его в 8-сложение. Вы продолжаете эту логику до тех пор, пока все, что у вас есть, не будет равным 2 значениям, которые вы добавляете с помощью FA. Если вам нужна минимальная задержка, вы должны сделать это за один цикл. Если вам нужна максимальная пропускная способность, вы должны добавить регистры на каждом этапе или 2. - person Jonathan Drolet; 07.06.2015
comment
Если я напишу эту инструкцию за один такт (в состоянии FSM): (S,C)=CSA(A,B,D); (S,C)=CSA(S,C,E); (S,C)=CSA(S,C,F); . Это работает, и я получу правильный результат? - person LyB8899; 07.06.2015
comment
Зависит от того, используете ли вы сигнал или переменные. Используя сигнал, это будет (S0,C0)=CSA(A,B,D); (S1,C1)=CSA(S0,C0,E); (S2,C2)=CSA(S2,C2,F); - person Jonathan Drolet; 07.06.2015