Пытаюсь найти Fmax в VHDL, но получаю лишний цикл задержки

Я хочу увидеть скорость моего проекта VHDL. Насколько мне известно, в программе Quartus II это обозначается Fmax. После компиляции моего дизайна он показывает Fmax 653,59 МГц. Я написал тестовый стенд и провел несколько тестов, чтобы убедиться, что дизайн работает должным образом. Проблема, с которой я столкнулся при разработке, заключается в том, что на переднем фронте тактового сигнала входы установлены правильно, но выход приходит только после еще одного цикла.

Мой вопрос: как я могу проверить скорость моей конструкции (самая длинная задержка между входными портами и выходным портом), а также получить вывод сложения одновременно с загрузкой входов/в том же цикле?

Результаты моего тестового стенда следующие:

a: 0001 и b: 0101 дает XXXX
a: 1001 и b: 0001 дает 0110 (ожидаемый результат предыдущего вычисления)
a: 1001 и b: 1001 дает 1010 (ожидаемый результат предыдущего вычисления )
и т. д.

Код:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity adder is 
    port( 
        clk : in STD_LOGIC; 
        a : in unsigned(3 downto 0); 
        b : in unsigned(3 downto 0); 
        sum : out unsigned(3 downto 0)
    );  
end adder; 

architecture rtl of adder is 

signal a_r, b_r, sum_r : unsigned(3 downto 0); 

begin 
    sum_r <= a_r + b_r; 
    process(clk) 
    begin 
        if (rising_edge(clk)) then 
            a_r <= a;
            b_r <= b;
            sum <= sum_r;
        end if; 
    end process;
end rtl; 

Испытательный стенд:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity testbench is
end entity;

architecture behavioral of testbench is
    component adder is
        port( 
            clk : in STD_LOGIC; 
            a : in unsigned(3 downto 0); 
            b : in unsigned(3 downto 0); 
            sum : out unsigned(3 downto 0)
        ); 
    end component;
    signal a, b, sum : unsigned(3 downto 0);
    signal clk : STD_LOGIC;
begin
    uut: adder
        port map(
            clk => clk,
            a => a,
            b => b,
            sum => sum
        );
    stim_process : process
    begin
        wait for 1 ns;
        clk <= '0';
        wait for 1 ns;
        clk <= '1';
        a <= "0001";
        b <= "0101";
        wait for 1 ns;
        clk <= '0';
        wait for 1 ns;
        clk <= '1';
        a <= "1001";
        b <= "0001";
        wait for 1 ns;
        clk <= '0';
        wait for 1 ns;
        clk <= '1';
        a <= "1001";
        b <= "1001";
    end process;
end behavioral;

person gilianzz    schedule 26.07.2016    source источник
comment
Возможный дубликат: electronics.stackexchange.com/questions/247566/   -  person Paebbels    schedule 26.07.2016
comment
Тривиально легко исключить либо входные, либо выходные регистры, ИЛИ и то, и другое, сэкономив 1 или 2 цикла, но это будет за счет гораздо более низкого Fmax (большего времени цикла). Это неизбежно.   -  person user_1818839    schedule 26.07.2016
comment
При удалении регистров Fmax не отображается.   -  person gilianzz    schedule 26.07.2016
comment
Конечно. Затем вы должны вывести Fmax из задержек распространения.   -  person user_1818839    schedule 26.07.2016
comment
Где я могу найти задержку распространения? В Quartus II, когда я сообщаю время в анализаторе timequest от a[0] до sum[0], он говорит: нечего сообщать.   -  person gilianzz    schedule 26.07.2016


Ответы (1)


есть ли проблема с использованием sum_r в качестве вывода?

Вам не нужны входные и выходные регистры, если вы рассматриваете это АЛУ как чистую комбинаторную логику. Fmax после того, как вы их удалили, исчезнет, ​​затем будет зависеть от того, от чего он подключен и к чему он подключен, и только если входящий - из регистров, а исходящий - в регистры. Если это только логика, идущая от входа к выходу и от входного контакта к выходному контакту, я думаю, что чрезвычайно сложно сказать, какова задержка распространения, и программное обеспечение поставщиков, таких как Altera и другие современные поставщики, не имеет инструментов, которые адекватны для такого рода анализ.

Вот почему вы услышите, как люди говорят о трудностях проектирования асинхронной логики.

Я думаю, что такой тонкий анализ трудно выполнить с уверенностью и точностью. Так как для вас задержка распространения будет в пикосекундах. Даже в литературе трудно найти какие-либо количественные ответы на задержку распространения.

Почему это сложно? помните, что задержка распространения определяется общей емкостью пути, есть способ оценить задержку распространения для транзисторов, но я не знаю глубоких деталей внутренней конструкции LUT, поэтому я не могу дать вам хорошую оценку. Так что это сильно зависит от семейства, процесса производства, конструкции FPGA и того, подключена ли нагрузка к IO.

Однако вы можете сделать свои собственные оценки, перейдя к логическому планировщику, посмотреть на путь и предположить задержку распространения около 20-100 пс на LUT, через которую он проходит.

См. изображение ниже.

введите здесь описание изображения

То, что вы пытаетесь разработать, - это ALU. По определению, ALU теоретически должен быть просто комбинаторной логикой.

Поэтому, строго говоря, ваш код сумматора должен быть только таким.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity adder is 
    port( 
        a : in unsigned(3 downto 0); 
        b : in unsigned(3 downto 0); 
        sum : out unsigned(3 downto 0)
    );  
end adder; 

architecture rtl of adder is 
begin 
    sum <= a + b; 
end rtl; 

Где часы не требуются, так как эта функция действительно является комбинаторным процессом.

Однако, если вы хотите, чтобы ваш ALU перешел на стадию, как я описал, то, что вы должны сделать, это на самом деле это

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity adder is 
    port( 
        clk : in STD_LOGIC; 
        a : in unsigned(3 downto 0); 
        b : in unsigned(3 downto 0); 
        sum : out unsigned(3 downto 0)
    );  
end adder;

architecture rtl of adder is 

signal a_r, b_r, sum_r : unsigned(3 downto 0); 
signal internal_sum : unsigned(3 downto 0);

begin 
    sum <= sum_r;
    internal_sum <= a_r + b_r; 

    process(clk) 
    begin 
        if (rising_edge(clk)) then 
            a_r <= a;
            b_r <= b;
            sum_r <= internal_sum;
        end if; 
    end process;
end rtl; 

Вы не упомянули о выполнении, поэтому я не буду обсуждать это здесь.

Наконец, если вы используете Altera, у них есть очень хорошая программа просмотра RTL, которую вы можете посмотреть, чтобы увидеть свой синтезированный дизайн. В разделе Инструменты->Просмотр списка соединений->Просмотрщик RTL.

person CJC    schedule 09.08.2016
comment
Итак, регистры ввода-вывода здесь обязательны, потому что я хочу увидеть Fmax. Однако моя проблема заключается в дополнительном тактовом цикле. У меня должен быть такой цикл? Я неправильно тестирую свой дизайн? - person gilianzz; 10.08.2016
comment
Традиционная методология проектирования основана на синхронном проектировании, что означает, что реализация чего-либо разрабатывается с помощью этапов и конвейеров. Ожидается дополнительный тактовый цикл. это природа цифровой логики. Почему вы хотите увидеть Fmax? он значительно изменится, как только вы начнете вкладывать в свой дизайн больше логики. Даже в промышленности принято работать на тактовой частоте 50-100 МГц. Это уже достаточно быстро, чтобы сделать много вещей. Пожалуйста, задавайте больше вопросов, если у вас есть. И проголосуйте и поставьте мне галочку, если вы думаете, что я ответил на ваш вопрос! - person CJC; 10.08.2016
comment
Вы можете спросить, зачем нужен дополнительный такт? потому что вы синхронизируете свои данные по переднему фронту каждых часов. Таким образом, выход остается таким же, как и до следующего нарастающего фронта, отсюда и дополнительная задержка тактового сигнала. И регистры важны, потому что вам нужно предотвратить метастабильность. Что такое метастабильность? Это нарушение настройки и времени удержания. Как это происходит? Это происходит, когда в вашей системе происходит событие нарастающего фронта, но наблюдаемые сигналы изменяются, когда оно слишком близко к событию нарастающего фронта (время настройки) и слишком скоро после события нарастающего фронта (время удержания). - person CJC; 10.08.2016
comment
Я хочу увидеть Fmax, потому что я хочу спроектировать некоторые схемы и сделать их открытыми. Людям удобно знать, насколько быстро выполняется дизайн. Я действительно фиксирую свои данные на переднем фронте. Это неправильно? - person gilianzz; 10.08.2016
comment
Помните, что достижимый Fmax очень зависит от устройства, в котором он реализован, архитектуры и т. д. Например, устройства Altera имеют 3 типа семейства: high-end stratrix, mid-range arria, low-end cyclone, если это открытый исходный код. , то достижимая Fmax не является существенной деталью. На самом деле, я бы сказал, что эта информация почти бессмысленна. Что важно, так это переносимость. Если в вашем коде есть какое-то жестко закодированное значение, которое зависит от конкретной тактовой частоты, то следует приложить усилия, чтобы сделать это жестко запрограммированное значение универсальным для всех тактовых частот. - person CJC; 10.08.2016
comment
Хорошо, я понимаю, что упоминание Fmax не очень полезно. Но я все еще в замешательстве: 1) люди, которые запускают мой код, должны сразу же видеть Fmax для своего устройства, поэтому мне все равно понадобятся регистры ввода-вывода, даже если мой Fmax бесполезен, верно? 2) Вы сказали Итак, вы можете спросить, зачем нужен дополнительный такт? потому что вы синхронизируете свои данные по переднему фронту каждых часов. Таким образом, выход остается таким же, как и до следующего нарастающего фронта, отсюда и дополнительная задержка тактового сигнала. Что-то не так с тем, как я это делаю? Нормально ли это и стоит ли вообще стремиться к такому поведению? - person gilianzz; 10.08.2016
comment
@gilianzz Действительно, они должны видеть. И на самом деле я обнаружил, что вы сделали ошибку. Пожалуйста, смотрите мой обновленный комментарий. И, пожалуйста, проголосуйте за меня и отметьте, если вам нравится мой ответ! - person CJC; 10.08.2016
comment
Последний вопрос (надеюсь), прежде чем принять ваш ответ: я использовал ваш дизайн, и у него все еще есть проблема с 1 циклом. Это действительно проблема или это хорошо, ожидаемо, нормально, так и должно быть, ...? - person gilianzz; 10.08.2016
comment
@gilianzz, как я уже упоминал несколько раз, такова природа синхронного дизайна. Пожалуйста, посмотрите на изображение во вложении. Этот регистр является запоминающим устройством. Он содержит значение, значение загружается в этот регистр, например, на переднем фронте тактового сигнала. Это означает, что сигнал или данные этого сигнала распространяются поэтапно от одного этапа к другому по одному такту за раз. Можете ли вы представить себе, если бы у вас не было этого явления? Все происходило бы одновременно. Можете себе представить, как сложно было бы все контролировать, если бы все происходило одновременно. Этот.. - person CJC; 10.08.2016
comment
является асинхронным дизайном. Как я уже упоминал также. Опять же, что такое Fmax? Вы знаете, что это значит? Это означает максимальную тактовую частоту, с которой вы можете синхронизировать свои регистры. это означает, насколько быстро вы можете работать с распространением логики за 1 такт. Это не проблема. Вот как все работает. Так работает ваш процессор на вашем ПК. Так вращается мир. Вы должны спросить себя, почему вы вообще думаете, что существует проблема. Это задайте мне вопрос, который возникает из-за того, почему вы думаете, что это проблема. Помните, что Fmax — это то, насколько быстро вы можете работать с распространением в 1 такт. Не задержка. - person CJC; 10.08.2016
comment
возможно, идея Задержки имеет негативный оттенок. Я не знаю. - person CJC; 10.08.2016
comment
Теперь я это понимаю, большое спасибо за помощь. - person gilianzz; 10.08.2016
comment
не волнуйтесь. Пожалуйста, спросите меня, если у вас есть еще вопросы - person CJC; 11.08.2016