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

Полностью синхронный дизайн

Многие умудрённые опытом разработчики часто пользуются термином "полностью синхронный дизайн", при этом никто особо не вдаётся в подробности, по каким отличительным чертам можно распознать "полностью синхронный" от "неособо синхронного" или "чуть-чуть несинхронного", как будто термин "синхронный дизайн" и так всем понятен и особых сомнений не вызывает.

Поделитесь, пожалуйста, опытом, давайте сведём знания в едином месте: Что такое синхронный дизайн? В чём его плюсы и, особенно важно, минусы? До какой меры нужно дробить комбинаторику и вставлять регистры на выходе каждого модуля? Всегда ли вы придерживаетесь подобной техники или есть ситуации когда целесообразно от неё отступить?

Интересна в первую очередь практика применения данной техники.

Заранее благодарю всех откликнувшихся!

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


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

Это дизайн, в котором не применяется асинхронных способов управления триггерами (т.е. асинхронных загрузок, сбросов, предустановок, и т.д.), а также комбинаторных циклов, синтезируемых в защелки и прочие асинхронные элементы памяти. За исключением сигнала глобального сброса. Не применяется логики управления тактовых сигналов (clock gating), а также минимизировано количество клок-доменов, в идеале один.

 

Отступать от этого целесообразно тогда, когда без этого не возможно реализовать устройство, соответствующее заданию. Или при переходе от FPGA к заказной ИМС (ASIC), где асинхронные элементы памяти и clock gating могут существенно уменьшить стоимость кристалла, а средства разработки позволяют корректно и полностью обконстрейнить эти элементы. Причем не только обконстрейнить, а и выдержать эти констрейны на этапе разводки.

 

ЗЫ А чисто комбинаторные блоки к этому делу не относятся, и имеют полное право на существование.

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


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

Это дизайн, в котором не применяется асинхронных способов управления триггерами (т.е. асинхронных загрузок, сбросов, предустановок, и т.д.), а также комбинаторных циклов, синтезируемых в защелки и прочие асинхронные элементы памяти. За исключением сигнала глобального сброса. Не применяется логики управления тактовых сигналов (clock gating), а также минимизировано количество клок-доменов, в идеале один.

 

Отступать от этого целесообразно тогда, когда без этого не возможно реализовать устройство, соответствующее заданию. Или при переходе от FPGA к заказной ИМС (ASIC), где асинхронные элементы памяти и clock gating могут существенно уменьшить стоимость кристалла, а средства разработки позволяют корректно и полностью обконстрейнить эти элементы. Причем не только обконстрейнить, а и выдержать эти констрейны на этапе разводки.

 

ЗЫ А чисто комбинаторные блоки к этому делу не относятся, и имеют полное право на существование.

 

BTW глобальный сброс тоже полезно делать синхнронным. За исключением пожалуй выходов кристалла. Все равно бывает нужно снятие глобального сброса синхронизировать с клоком во избежание непредсказыемых побочных эффектов :)

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


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

Не совсем в тему ответа, но IMHO слово дизайн лучше оставить всяким Юдашкиным. Более употребимо ведь слово проектирование.

 

А касаемо основного вопроса, Я бы ответил в первом приближении примерно так - полностью синхронным можно считать проект, ВСЕ элементы памяти которого изменяют свое состоянии (точнее имеют возможность изменять) одновременно под управлением тактового сигнала (clock). В идеале очередное значение ячейки памяти должно сформироваться на комбинационной схеме до прихода очередного импульса clock.

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


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

А касаемо основного вопроса, Я бы ответил в первом приближении примерно так - полностью синхронным можно считать проект, ВСЕ элементы памяти которого изменяют свое состоянии (точнее имеют возможность изменять) одновременно под управлением тактового сигнала (clock).

 

С этой формулировкой не согласен. Этого же можно легко добиться с использованием асинхронных элементов памяти, сигналов разрешенеия клока (clock gating) для управления ими, и т.п., которые приведут ко всем проблемам асинхронных схем в FPGA, но согласно Вашему определению (возможность смена состояния одновременно исключительно по клоку) останутся синхронными.

 

В идеале очередное значение ячейки памяти должно сформироваться на комбинационной схеме до прихода очередного импульса clock.

 

Ну это никакой не идеал, и даже совсем не обязательное требование. Многоцикловые пути не нарушают синхронности схемы (время прохода через комбинаторный блок меньше N тактов, и результат защелкивается через N тактов после подачи исходных данных. И в средствах проектирования FPGA есть соответствующие средства для описания этих multicycle зависимостей.

 

 

ЗЫ а слово "дизайн" я скорее бы заменил на "проект", а не на "проектирование" :) Это все таки существительное... И оригинальный англоязычный термин звучит как "fully synchronous design", а все таки не project.

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


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

Многоцикловые пути не нарушают синхронности схемы (время прохода через комбинаторный блок меньше N тактов, и результат защелкивается через N тактов после подачи исходных данных. И в средствах проектирования FPGA есть соответствующие средства для описания этих multicycle зависимостей.

 

Время прохода от тригера до другого через комбинаторный блок больше одного такта, по желанию проектировщика (если хотите дезайнера)? Я Вас правильно понял? Научите, для общего развития. Если можно с привязкой к Quartus, VHDL.

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


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

Время прохода от тригера до другого через комбинаторный блок больше одного такта, по желанию проектировщика (если хотите дезайнера)? Я Вас правильно понял? Научите, для общего развития. Если можно с привязкой к Quartus, VHDL.

 

Ну как сделать логически - чтобы сигнал с выхода блока записывался через N тактов после попадания на его вход - это сами ваяйте на чем угодно, хоть в HDL, схематике. Например при помощи конечного автомата. А что касается констрейна и задания таймингов - это "set_multicycle_path" (Quartus, включенный TimeQuest). Без таймквеста тоже какой-то констрейн есть - там целый раздел ассигментов в части "multicycle"

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


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

Ну как сделать логически - чтобы сигнал с выхода блока записывался через N тактов после попадания на его вход - это сами ваяйте на чем угодно, хоть в HDL, схематике. Например при помощи конечного автомата. А что касается констрейна и задания таймингов - это "set_multicycle_path" (Quartus, включенный TimeQuest). Без таймквеста тоже какой-то констрейн есть - там целый раздел ассигментов в части "multicycle"

Не понял. Поясните еще раз.

Пусть есть код

    process(clk)
    begin
        if(clk='1' and clk'event)then        
              a <= b;
        end if;        
    end process;

пусть b выход какого-нибудь счетчика : b=0,1,2,3,0,1,2,3..., тогда a=x,0,1,2,3...

Вы утверждаете, что при помощи Assigment Editor можно заставить Quartus сгенерить схему, такую что a=x,x,x,x,0,1,2,3,0,1... и при этом не будут задействованы дополнительные тригеры, а вся задержка будет за счет комбинаторики. Я Вас правильно понял?

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


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

Ну как сделать логически - чтобы сигнал с выхода блока записывался через N тактов после попадания на его вход - это сами ваяйте на чем угодно, хоть в HDL, схематике. Например при помощи конечного автомата. А что касается констрейна и задания таймингов - это "set_multicycle_path" (Quartus, включенный TimeQuest). Без таймквеста тоже какой-то констрейн есть - там целый раздел ассигментов в части "multicycle"

Не понял. Поясните еще раз.

Пусть есть код

    process(clk)
    begin
        if(clk='1' and clk'event)then        
              a <= b;
        end if;        
    end process;

пусть b выход какого-нибудь счетчика : b=0,1,2,3,0,1,2,3..., тогда a=x,0,1,2,3...

Вы утверждаете, что при помощи Assigment Editor можно заставить Quartus сгенерить схему, такую что a=x,x,x,x,0,1,2,3,0,1... и при этом не будут задействованы дополнительные тригеры, а вся задержка будет за счет комбинаторики. Я Вас правильно понял?

 

Как я понимаю, имеется в виду, что если данные обрабатываются комбинационной цепью дольше, чем один такт, то защелкивание результата происходит не каждый такт, а с задержкой на нужное количество тактов. Задержка, разумеется, формируется с помощью дополнительных триггеров. Например, строб действительности данных задерживается с помощью цепочки из нескольких последовательно включенных D-триггеров. А Assigment Editor используется для задания констрейнов для временного анализатора.

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


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

нет Вы меня неправильно поняли. Генерите схему Вы сами. А квартусу надо объяснить, что Вы задумали, чтобы он корректно все синтезировал и оптимизировал. Вот пример (сорри в VHDL настолько не смыслю, чтобы писать, да еще и сразу в конфу):

 

module twocycle (in, out, clock);

input clock;
input [7:0] in;
output reg [7:0] out;

reg [7:0] in_for_module;
wire [7:0] out_from_module;
long_time_module long_time_inst (.IN(in_for_module), .OUT(out_from_module));

reg two_cycle_reg;
always @(posedge clock)
  two_cycle_reg <= ~two_cycle_reg;

always @(posedge clock)
  if (two_cycle_reg) begin
    in_for_module <= in;
    out <= out_from_module;
  end

endmodule

 

Тут long_time_module это какой-то там модуль, который делает что-то медленное комбинаторное. Которое не укладывается по длительности в 1 такт, но укладывается в два такта. Для того, чтобы данные на него подавались раз в два такта, и считывались тоже раз в два такта, введен триггер "two_cycle_reg", который меняет свое состояние на противоположное с каждым фронтом клока. А выдача данных и прием производятся только при единице в этом триггере, т.е. раз в два клока. Это я так вот задумал.

 

Теперь надо объяснить квартусу, что все пути, проходящие через "long_time_inst", мультицикловые с коэффициентом два (он ведь не телепат, чтобы угадать Ваше желание). Вот тут и надо прописать set_multicycle_path -through long_time_inst.IN 2 - после чего квартус поймет, что данные с этого модуля нужны раз в два такта, и будет его оптимизировать, как будто он работает на пополамной частоте.

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


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

ЗЫ а слово "дизайн" я скорее бы заменил на "проект", а не на "проектирование" :) Это все таки существительное... И оригинальный англоязычный термин звучит как "fully synchronous design", а все таки не project.

Начнем с того, что фраза "fully synchronous design" (собственно как и само слово design) является контекстно-звисимым и имеет право быть переведенной как в форме существительного, так и в форме глагола. And also vice versa during translation to English language. Замечание по поводу слова project, честно сказать, не понял. Как звучит оригинальный термин "fully synchronous design" Я знаю, а слово project в общей лексике является синонимом слова design. Я то имел ввиду, что понятие "проектирование средств вычислительной техники" (именно проектирование, а не дизайн) Я встречал в книжках, изданных еще до моего рождения. А это, видимо, говорит о некоторых традициях и устоявшейся терминологии. Скажем, если бы Я увидел в литературе фразу Web-проектирование вместо Web-дизайна, то возмутился бы не меньше =)

 

Ну это никакой не идеал, и даже совсем не обязательное требование. Многоцикловые пути не нарушают синхронности схемы (время прохода через комбинаторный блок меньше N тактов, и результат защелкивается через N тактов после подачи исходных данных. И в средствах проектирования FPGA есть соответствующие средства для описания этих multicycle зависимостей.

Век живи - век учись. Признаюсь, про многоцикловые пути ничего раньше не слышал. Выглядит интересно, но вот так вот сходу смущает одно обстоятельство - если переходный процесс в комбинационной схеме (КС), выход с которой поступает на вход данных элемента памяти, не завершится за один такт, то в момент прихода очередного фронта clk возможно переключение на входе данных... другими словами - метастабильность. Или Timing Constraints, задаваемые в САПР как раз и призваны бороться с подобными эффектами?

 

С этой формулировкой не согласен. Этого же можно легко добиться с использованием асинхронных элементов памяти, сигналов разрешенеия клока (clock gating) для управления ими, и т.п., которые приведут ко всем проблемам асинхронных схем в FPGA, но согласно Вашему определению (возможность смена состояния одновременно исключительно по клоку) останутся синхронными.

Если Вы построите синхронный триггер на основе асинхронного (RS + логика некоторая), и будете использовать подобную конструкцию для построения "fully synchronous design", то какие конкретно возникнут пролемы? По-моему если в систему поступает с определенным периодом некоторый тактовый сигнал (clock), элементы памяти переключются в строго определенные моменты времени (задающиеся фронтом или уровнем сигнала clock), а КС обсчитывается за время пока clock "не активен", то все должно быть пучком.

 

P.S.: пока копался в Google, напоролся на термины GALS (Globally Asynchronous Localy Synchronous) и LAGS (Localy Asynchronous Globally Synchronous). Видимо с этой позиции fully synchronous design должен записываться как GSLS или LSGS...

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


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

Век живи - век учись. Признаюсь, про многоцикловые пути ничего раньше не слышал. Выглядит интересно, но вот так вот сходу смущает одно обстоятельство - если переходный процесс в комбинационной схеме (КС), выход с которой поступает на вход данных элемента памяти, не завершится за один такт, то в момент прихода очередного фронта clk возможно переключение на входе данных... другими словами - метастабильность. Или Timing Constraints, задаваемые в САПР как раз и призваны бороться с подобными эффектами?

 

Нет, констрейны с этим не призваны бороться. С этим призваны бороться сами разработчики, проектируя схему таким образом, чтобы сигнал разрешения записи в регистр, стоящий на выходе комбинаторного модуля никак не появился раньше N-ного такта после подачи данных на вход этого модуля. Что гарантирует неизменное состояние на входе элемента памяти на протяжении всех N тактов. А констрейн призван сказать синтезатору, чтобы он уложил времянку модулю в эти N тактов. И, кстати, объявляется мультицикловым путь только через "долгий" модуль, а путь сигнала разрешения - естественно остается обыкновенным.

 

Если Вы построите синхронный триггер на основе асинхронного (RS + логика некоторая), и будете использовать подобную конструкцию для построения "fully synchronous design", то какие конкретно возникнут пролемы? По-моему если в систему поступает с определенным периодом некоторый тактовый сигнал (clock), элементы памяти переключются в строго определенные моменты времени (задающиеся фронтом или уровнем сигнала clock), а КС обсчитывается за время пока clock "не активен", то все должно быть пучком.

 

Если Вы проектируете ASIC, и применяете защелки с логикой на клоке, делая из них "якобы синхронные элементы", то проблем не возникнет, так как при place&route и последующем IPO САПР вставляет где надо элементы задержки в цепи данных, выдерживая таким образом корректный hold time. Если Вы это применяете в FPGA, то возникнут (точнее могут возникнуть) проблемы с hold time, т.е. при снятии разрешения записи с защелки данные меняются на новые раньше необходимого времени. Средства P&R для FPGA не умеют (или плохо умеют) сами корректно выдерживать холды для асинхронных элементов. Т.е. с сетапами все ОК, соптимизировать разводку на минимальное время они способны, а вот наоборот, вставить доп. задержку - увы. С этим, кстати, я сам столкнулся, прототипируя ASIC в FPGA. Пришлось самому по условной компиляции для случая FPGA вставлять сопливые цепи задержки шины данных, без чего глюки были во всей красе (у меня разрабатывается микроконтроллер, и почти все регистры периферийных устройств построены из асинхронных элементов памяти в целях экономии площади). И еще, в FPGA физически нет возможности построить дерево тактовых сигналов с отключаемыми ветвями, поэтому тактовые сигналы, управляющие асинхронными элементами памяти, оказываются разведенными через общие пути, а не через сбалансированное дерево. Что тоже дает разброс сетапа-холда нале-напра.

 

 

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

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


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

Начнем с того, что фраза "fully synchronous design" (собственно как и само слово design) является контекстно-звисимым и имеет право быть переведенной как в форме существительного, так и в форме глагола. And also vice versa during translation to English language. Замечание по поводу слова project, честно сказать, не понял. Как звучит оригинальный термин "fully synchronous design" Я знаю, а слово project в общей лексике является синонимом слова design. Я то имел ввиду, что понятие "проектирование средств вычислительной техники" (именно проектирование, а не дизайн) Я встречал в книжках, изданных еще до моего рождения. А это, видимо, говорит о некоторых традициях и устоявшейся терминологии. Скажем, если бы Я увидел в литературе фразу Web-проектирование вместо Web-дизайна, то возмутился бы не меньше =)

 

Любопытно. Человек борется с использованием английской кальки в русскоязычном тексте, но сам пользуется английской традицией написания слова "я". :biggrin:

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


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

Тут long_time_module это какой-то там модуль, который делает что-то медленное комбинаторное. Которое не укладывается по длительности в 1 такт, но укладывается в два такта. Для того, чтобы данные на него подавались раз в два такта, и считывались тоже раз в два такта, введен триггер "two_cycle_reg", который меняет свое состояние на противоположное с каждым фронтом клока. А выдача данных и прием производятся только при единице в этом триггере, т.е. раз в два клока. Это я так вот задумал.

 

большой :a14: . Недавно закончил большой проект (если хотите дизайн), так две недели ушло на то чтобы заставить long_time_modul работать на имеющейся частоте. Знал бы о таком приёме, он бы меня очень выручил.

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


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

Нет, констрейны с этим не призваны бороться. С этим призваны бороться сами разработчики, проектируя схему таким образом, чтобы сигнал разрешения записи в регистр, стоящий на выходе комбинаторного модуля никак не появился раньше N-ного такта после подачи данных на вход этого модуля. Что гарантирует неизменное состояние на входе элемента памяти на протяжении всех N тактов. А констрейн призван сказать синтезатору, чтобы он уложил времянку модулю в эти N тактов. И, кстати, объявляется мультицикловым путь только через "долгий" модуль, а путь сигнала разрешения - естественно остается обыкновенным.

Ясно. Т.е. придерживаем сигнал enable пока переходный процесс на входе данных регистра не завершится. Таким образом нет необходимости снижать тактовую частоту всего проекта из-за "тормознутого блока". А на сколько оправдан подобный поход? Почему бы не раскрошить КС "долгого" модуля конвеером?

 

Если Вы проектируете ASIC, и применяете защелки с логикой на клоке, делая из них "якобы синхронные элементы", то проблем не возникнет, так как при place&route и последующем IPO САПР вставляет где надо элементы задержки в цепи данных, выдерживая таким образом корректный hold time. Если Вы это применяете в FPGA, то возникнут (точнее могут возникнуть) проблемы с hold time, т.е. при снятии разрешения записи с защелки данные меняются на новые раньше необходимого времени. Средства P&R для FPGA не умеют (или плохо умеют) сами корректно выдерживать холды для асинхронных элементов. Т.е. с сетапами все ОК, соптимизировать разводку на минимальное время они способны, а вот наоборот, вставить доп. задержку - увы. С этим, кстати, я сам столкнулся, прототипируя ASIC в FPGA. Пришлось самому по условной компиляции для случая FPGA вставлять сопливые цепи задержки шины данных, без чего глюки были во всей красе (у меня разрабатывается микроконтроллер, и почти все регистры периферийных устройств построены из асинхронных элементов памяти в целях экономии площади). И еще, в FPGA физически нет возможности построить дерево тактовых сигналов с отключаемыми ветвями, поэтому тактовые сигналы, управляющие асинхронными элементами памяти, оказываются разведенными через общие пути, а не через сбалансированное дерево. Что тоже дает разброс сетапа-холда нале-напра.

Понятно. Так глубоко копать мне на практике не приходилось. Собственно поэтому оценивать возможности САПР не довелось. Но тема ведь не ограничена только FPGA. И почему формулировка определения "fully synchronous design" должна страдать от несовершенства каких-то там программ и микросхем?

 

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

Фразу "полностью синхронный дизайн" не приходилось раньше встречать в литературе. Буду признателен если кините в меня ссылкой.

 

Любопытно. Человек борется с использованием английской кальки в русскоязычном тексте, но сам пользуется английской традицией написания слова "я". :biggrin:

К черту Англию. Пишу "Я" с заглавной буквы только из уважения к собственной личности.

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...