Jump to content

    

Глупый вопрос про 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

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

Share this post


Link to post
Share on other sites
Но внезапно стало непонятно, а почему не возникает проблем с setup and hold в конструкции ниже?

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

Share this post


Link to post
Share on other sites
Потому, что существует такой параметр, как Tco (Clock to Output) :)

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

Edited by one_eight_seven

Share this post


Link to post
Share on other sites
То, что вы описали и то, что нарисовали - это разные вещи.

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

 

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

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

 

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

 

 

Share this post


Link to post
Share on other sites
Т.е. разбивание одного блока always на несколько в пределах одного синтезируемого модуля не должно приводить к конфликтам Setup and Hold?

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
Просто времени в 2 раза меньше. :rolleyes:

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

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

А по двум? :crying:

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this