Версия для печати темы
Форум разработчиков электроники ELECTRONIX.ru _ Разработка цифровых, аналоговых, аналого-цифровых ИС _ Глупый вопрос про Setup and Hold
Автор: STAR_IK May 16 2018, 10:19
Запутался в основах. Разбираюсь с setup and hold. Очевидно, что защелкивание данных по клоку должно производиться в момент времени, когда данные уже установились.
В этом примитивном примере входные данные устанавливаются по фронту, а защелкиваются и обрабатываются по спаду. Проблем никаких нет.
Код
always @ (posedge clk)
begin
in <= in + 8'd1;
end
always @ (negedge clk)
begin
out <= in « 3;
end
Но внезапно стало непонятно, а почему не возникает проблем с setup and hold в конструкции ниже? Здесь все выполняется по фронту. В один момент времени в регистр in записываются данные, и считываются из него
Код
always @ (posedge clk)
begin
in <= in + 8'd1;
out <= in « 3;
end
Прошу люто тапками не кидаться.
Автор: Stewart Little May 16 2018, 10:30
Цитата(STAR_IK @ May 16 2018, 13:19)
Но внезапно стало непонятно, а почему не возникает проблем с setup and hold в конструкции ниже?
Потому, что существует такой параметр, как Tco (Clock to Output)
Автор: ViKo May 16 2018, 10:36
Цитата(Stewart Little @ May 16 2018, 13:30)
Потому, что существует такой параметр, как Tco (Clock to Output)
И это Tco больше, чем Th. Поэтому выход предыдущего триггера еще не успевает измениться, как его захватит следующий триггер.
Автор: Flip-fl0p May 16 2018, 12:53
Обычно хорошо помогает следующая методика:
1. Прочитать про все временные параметры триггера.
2. Взять листок бумаги.
3. Вручную нарисовать диаграммы.
И тогда будет сразу видно и понятно что:
Цитата
И это Tco больше, чем Th. Поэтому выход предыдущего триггера еще не успевает измениться, как его захватит следующий триггер.
И отсюда сразу становится понятно, прочему работа по двум фронтам одного клока хуже чем по одному
Автор: ViKo May 16 2018, 13:13
Цитата(Flip-fl0p @ May 16 2018, 15:53)
И отсюда сразу становится понятно, прочему работа по двум фронтам одного клока хуже чем по одному
Просто времени в 2 раза меньше.
Автор: STAR_IK May 17 2018, 06:47
Тогда должен ли работать такой код? (У нас не работает).
Код
always @ (posedge clk)
begin
in <= in + 8'd1;
end
always @ (posedge clk) // negedge сменил на posedge
begin
out <= in « 3;
end
Мне не ясны различия в двух представлениях: 1 - когда все в одном aways; 2 - в разных always.
Разве эта структура не должна преобразоваться в конструкцию ниже?
Автор: one_eight_seven May 17 2018, 07:02
В каком смысле "не работает"?
То, что вы описали и то, что нарисовали - это разные вещи.
Вы нарисовали:
Код
always @ (posedge clk)
begin
in <= in + 8'd1;
temp <= in + 8'd1;
end
always @ (posedge clk) // negedge сменил на posedge
begin
out <= temp « 3;
end
И второй комбинаторный "прямоугольник" - это не in << 3, а temp <<3
Автор: STAR_IK May 17 2018, 07:58
Цитата(one_eight_seven @ May 17 2018, 13:02)
То, что вы описали и то, что нарисовали - это разные вещи.
Действительно, не то нарисовал.
Цитата(one_eight_seven @ May 17 2018, 13:02)
В каком смысле "не работает"?
При временном моделировании после синтеза возникают неопределенные состояния, которые не устраняются даже понижением тактовой частоты.
Я вроде начал понимать. Поправьте если не так. В первом посте я немного слукавил (сам того не осознавая). В нашем примитивном эксперименте часть кода располагалась в testbecnh:
Код
always
#3333 clk=!clk;
begin
always @ (posedge clk)
begin
in <= in + 8'd1;
end
А другая часть в синтезируемом модуле:
Код
always @ (posedge clk)
begin
out <= in « 3;
end
И получается, что в testbecnh сигнал in выставлялся мгновенно с клоком, и попадал в интервал Ts - Th, вызывая неопределенное состояние.
Т.е. разбивание одного блока always на несколько в пределах одного синтезируемого модуля не должно приводить к конфликтам Setup and Hold?
Автор: one_eight_seven May 17 2018, 08:52
Цитата
Т.е. разбивание одного блока always на несколько в пределах одного синтезируемого модуля не должно приводить к конфликтам Setup and Hold?
для этого ещё необходимы условия:
1. Заданные ограничения (constraints)
2. Успешное закрытие после "топологии" (не могу вспомнить, как это в ПЛИС называется).
Кстати, для Gate Level Simulation очень удобно использовать в тестбенче clocking blocks, но это уже в SystemVerilog: при использовании clocking block'ов очень удобно задавать setup и clock-to-output, так, что тестбенч будет считывать сигнал, установленный за setup до прихода идеального тестбенчного клока, а устанавливать сигналы на своих выходах через clock-to-output после.
Автор: Shivers May 17 2018, 12:18
Главное, что надо знать про холд и сетап, это то, что холд проверяется в текущем такте, а сетап в следующем. Из чего следует, что при нарушении сетапа надо просто понизить частоту, а при нарушении холда - можно выбросить микросхему(эсик) в помойку.
Если же хочется разобраться в вопросе более подробно, стоит прочитать это http://electronix.ru/redirect.php?https://habr.com/post/302806/
Автор: honinbo May 18 2018, 09:10
Цитата(ViKo @ May 16 2018, 16:13)
Просто времени в 2 раза меньше.
Если бы только, а то ведь еще и требования к стабильности формы клока.
По одному фронту - важен наклон активного фронта и период. Наклон второго фронта не важен, форма строго 50/50 тоже не важна.
А по двум?
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)