реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Глупый вопрос про Setup and Hold
STAR_IK
сообщение May 16 2018, 10:19
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 136
Регистрация: 10-04-09
Из: Омск
Пользователь №: 47 461



Запутался в основах. Разбираюсь с 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

Прошу люто тапками не кидаться.
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение May 16 2018, 10:30
Сообщение #2


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(STAR_IK @ May 16 2018, 13:19) *
Но внезапно стало непонятно, а почему не возникает проблем с setup and hold в конструкции ниже?

Потому, что существует такой параметр, как Tco (Clock to Output) sm.gif


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 16 2018, 10:36
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Stewart Little @ May 16 2018, 13:30) *
Потому, что существует такой параметр, как Tco (Clock to Output) sm.gif

И это Tco больше, чем Th. Поэтому выход предыдущего триггера еще не успевает измениться, как его захватит следующий триггер.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение May 16 2018, 12:53
Сообщение #4


В поисках себя...
****

Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Обычно хорошо помогает следующая методика:
1. Прочитать про все временные параметры триггера.
2. Взять листок бумаги.
3. Вручную нарисовать диаграммы.
И тогда будет сразу видно и понятно что:
Цитата
И это Tco больше, чем Th. Поэтому выход предыдущего триггера еще не успевает измениться, как его захватит следующий триггер.

И отсюда сразу становится понятно, прочему работа по двум фронтам одного клока хуже чем по одному smile3046.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 16 2018, 13:13
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Flip-fl0p @ May 16 2018, 15:53) *
И отсюда сразу становится понятно, прочему работа по двум фронтам одного клока хуже чем по одному smile3046.gif

Просто времени в 2 раза меньше. rolleyes.gif
Go to the top of the page
 
+Quote Post
STAR_IK
сообщение May 17 2018, 06:47
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 136
Регистрация: 10-04-09
Из: Омск
Пользователь №: 47 461



Тогда должен ли работать такой код? (У нас не работает).
Код
always @ (posedge clk)
  begin
    in <= in + 8'd1;
  end

always @ (posedge clk)  // negedge сменил на posedge
  begin
    out <= in « 3;
  end

Мне не ясны различия в двух представлениях: 1 - когда все в одном aways; 2 - в разных always.
Разве эта структура не должна преобразоваться в конструкцию ниже?
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение May 17 2018, 07:02
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



В каком смысле "не работает"?

То, что вы описали и то, что нарисовали - это разные вещи.

Вы нарисовали:
Код
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

Сообщение отредактировал one_eight_seven - May 17 2018, 07:04
Go to the top of the page
 
+Quote Post
STAR_IK
сообщение May 17 2018, 07:58
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 136
Регистрация: 10-04-09
Из: Омск
Пользователь №: 47 461



Цитата(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?

Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение May 17 2018, 08:52
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
Т.е. разбивание одного блока always на несколько в пределах одного синтезируемого модуля не должно приводить к конфликтам Setup and Hold?

для этого ещё необходимы условия:
1. Заданные ограничения (constraints)
2. Успешное закрытие после "топологии" (не могу вспомнить, как это в ПЛИС называется).

Кстати, для Gate Level Simulation очень удобно использовать в тестбенче clocking blocks, но это уже в SystemVerilog: при использовании clocking block'ов очень удобно задавать setup и clock-to-output, так, что тестбенч будет считывать сигнал, установленный за setup до прихода идеального тестбенчного клока, а устанавливать сигналы на своих выходах через clock-to-output после.
Go to the top of the page
 
+Quote Post
Shivers
сообщение May 17 2018, 12:18
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



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

Если же хочется разобраться в вопросе более подробно, стоит прочитать это https://habr.com/post/302806/
Go to the top of the page
 
+Quote Post
honinbo
сообщение May 18 2018, 09:10
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 19-03-08
Пользователь №: 36 039



Цитата(ViKo @ May 16 2018, 16:13) *
Просто времени в 2 раза меньше. rolleyes.gif

Если бы только, а то ведь еще и требования к стабильности формы клока.
По одному фронту - важен наклон активного фронта и период. Наклон второго фронта не важен, форма строго 50/50 тоже не важна.
А по двум? crying.gif
Go to the top of the page
 
+Quote Post
baumanets
сообщение May 29 2018, 21:06
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 398
Регистрация: 30-12-09
Из: Москва, Зеленоград
Пользователь №: 54 579











--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 07:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016