Как получить синтезируемую задержку в Verilog

Я сделал код контроля ошибок в Verilog, в котором я получил декодированные данные с некоторой задержкой в ​​18000 нс. Мне нужно сравнить декодированные данные с исходными данными, но мои исходные данные начинаются примерно со 100 нс, поэтому как провести сравнение этих двух сигналов.

Как отложить ввод моих данных в Verilog, чтобы их можно было синтезировать?

Мне нужно реализовать это оборудование.


person meghana MN    schedule 29.05.2017    source источник
comment
Я думаю, вам, возможно, придется исправить свои основы, см. здесь   -  person Emman    schedule 29.05.2017
comment
Обычно тестовые программы не синтезируются? В любом случае, для аппаратной задержки вы используете счетчик, который обновляется при каждом положительном фронте ваших часов. Таким образом, вы можете отслеживать задержку, подсчитывая количество циклов.   -  person Rahul Behl    schedule 29.05.2017
comment
Задержки не могут быть синтезированы. После внутреннего процесса задержки будут включены в стандартные задержки ячеек и сетевые задержки маршрутизации.   -  person Karan Shah    schedule 29.05.2017
comment
Как насчет создания задержек с помощью счетчиков? Они должны быть синтезируемыми.   -  person Rahul Behl    schedule 29.05.2017


Ответы (2)


Один из вариантов - создать вручную одну или несколько буферных ячеек. Для этого вам нужно будет знать имя ячейки, относящейся к вашей технической библиотеке, и ваш код RTL будет зависеть от технологии. Если вы этого не хотите, вы также можете создать свой собственный буферный модуль (например, с инверторами) и использовать его.

Вот пример создания экземпляра Verilog. BUFX1 - это имя ячейки в произвольной библиотеке.

BUFX1 my_buffer (.in(my_signal), .out(my_delayed_signal));

Обычно инструменты синтеза и P&R оптимизируют эту ячейку, но вы можете сказать инструменту, что хотите сохранить ее. Пример ограничения ниже представлен в формате Synopsys Design Constraints (SDC). Большинство поставщиков инструментов поддерживают его.

set_dont_touch <path to my_buffer>

Вы должны знать, что задержка ячейки будет разной для каждого угла (например, медленная, типичная, быстрая). Так что задержка не постоянная, а в диапазоне.

person Community    schedule 12.06.2017

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

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

Используйте свой инструмент синтеза, чтобы сгенерировать желаемую задержку. Например, с компилятором дизайна Synopsys: set_min_delay delay_value_in_ns -from startpoint -to endpoint будет указывать инструмент, который, чтобы быть правильным, вы хотите, по крайней мере, delay_value_in_ns между startpoint и endpoint. Вы также можете установить значение, ограничивающее максимальное значение: set_max_delay

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

person Krouitch    schedule 29.05.2017