Перейти к содержанию

    

Глупый вопрос про Setup and Hold

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

Прошу люто тапками не кидаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Но внезапно стало непонятно, а почему не возникает проблем с setup and hold в конструкции ниже?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Потому, что существует такой параметр, как Tco (Clock to Output) :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно хорошо помогает следующая методика:

1. Прочитать про все временные параметры триггера.

2. Взять листок бумаги.

3. Вручную нарисовать диаграммы.

И тогда будет сразу видно и понятно что:

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

И отсюда сразу становится понятно, прочему работа по двум фронтам одного клока хуже чем по одному :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
И отсюда сразу становится понятно, прочему работа по двум фронтам одного клока хуже чем по одному :smile3046:

Просто времени в 2 раза меньше. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда должен ли работать такой код? (У нас не работает).

always @ (posedge clk) 
  begin 
    in <= in + 8'd1; 
  end

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

Мне не ясны различия в двух представлениях: 1 - когда все в одном aways; 2 - в разных always.

Разве эта структура не должна преобразоваться в конструкцию ниже?

247d2adf1d86.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Вы нарисовали:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
То, что вы описали и то, что нарисовали - это разные вещи.

Действительно, не то нарисовал.

 

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

При временном моделировании после синтеза возникают неопределенные состояния, которые не устраняются даже понижением тактовой частоты.

 

Я вроде начал понимать. Поправьте если не так. В первом посте я немного слукавил (сам того не осознавая). В нашем примитивном эксперименте часть кода располагалась в 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?

 

 

Поделиться сообщением


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

для этого ещё необходимы условия:

1. Заданные ограничения (constraints)

2. Успешное закрытие после "топологии" (не могу вспомнить, как это в ПЛИС называется).

 

Кстати, для Gate Level Simulation очень удобно использовать в тестбенче clocking blocks, но это уже в SystemVerilog: при использовании clocking block'ов очень удобно задавать setup и clock-to-output, так, что тестбенч будет считывать сигнал, установленный за setup до прихода идеального тестбенчного клока, а устанавливать сигналы на своих выходах через clock-to-output после.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Если же хочется разобраться в вопросе более подробно, стоит прочитать это https://habr.com/post/302806/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Просто времени в 2 раза меньше. :rolleyes:

Если бы только, а то ведь еще и требования к стабильности формы клока.

По одному фронту - важен наклон активного фронта и период. Наклон второго фронта не важен, форма строго 50/50 тоже не важна.

А по двум? :crying:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация