Возможен ли однотактный ЦП при использовании асинхронных компонентов?

Я слышал термин ЦП с одним циклом и пытался понять, что на самом деле означает ЦП с одним циклом. Есть ли четкое согласованное определение и консенсус, а также что это значит?

Некоторые домашние процессоры с одним циклом, с которыми я сталкивался, похоже, используют как нарастающие, так и спадающие фронты тактовых импульсов для выполнения одной инструкции. Обычно передний фронт действует как выборка / декодирование, а задний фронт - как выполнение.

Однако, читая, я натолкнулся на разумную мысль, сделанную здесь ...
https://zipcpu.com/blog/2017/08/21/rules-for-newbies.html

"Do not transition on any negative (falling) edges. 
Falling edge clocks should be considered a violation of the one clock principle, 
as they act like separate clocks.".

Мне это кажется правдой.

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

Итак, можно ли утверждать, что проект представляет собой ЦП с одним циклом, когда для изменения состояния активно используются как нарастающий, так и спадающий фронт?

Казалось бы, настоящий однотактный ЦП должен выполнять все операции изменения состояния на единственном фронте тактового сигнала в единственном тактовом цикле.

Я могу представить, что такое возможно, если все данные будут храниться синхронно. Если у нас есть синхронная система, которая установилась, то на следующем фронте тактового сигнала мы можем синхронизировать результаты в синхронном хранилище данных и одновременно синхронизировать счетчик программы на следующий адрес.

Но если целевым хранилищем данных является, например, асинхронное ОЗУ, то линии управления наверняка будут меняться, пока эти данные хранятся, что приведет к непреднамеренному поведению.

Я ошибаюсь, есть ли примеры ЦП с одним циклом, которые включают в себя асинхронное хранилище?

Казалось бы, использование асинхронной ОЗУ в одной конструкции означает, что для изменения состояния необходимо использовать как минимум два логических тактовых цикла.

Конечно, с некоторой большей сложностью можно было бы добавить процессор, который использует единственное ребро, где инструкции используют только компоненты синхронизации, но полагаются на дополнительный цикл при сохранении в асинхронные данные; но тогда это все равно будет не однотактный ЦП, а, скорее, однотактный ЦП в основном.

Таким образом, ни один ЦП, который записывает в асинхронное ОЗУ (или другой асинхронный компонент), честно говоря, не может считаться ЦП с одним циклом, потому что вся инструкция не может быть выполнена на одном фронте тактовой частоты. Запись в ОЗУ требует двух фронтов (т. Е. Падающего и восходящего), и это нарушает принцип единой тактовой частоты.

Итак, существует ли общепринятый одноцикловый ЦП и применяем ли мы этот термин последовательно?

В чем дело?

(Также опубликовано в моем журнале hackday https://hackaday.io/project/166922-spam-1-8-bit-cpu/log/181036-single-cycle-cpu-confusion, а также в частной группе в hackaday)

=====

Обновление: глядя на простые MIP, кажется, что модели используют синхронную память и поэтому, вероятно, могут работать с одним краевым объявлением, возможно, так оно и есть - поэтому гарантируется один цикл категории. И, возможно, память FPGA всегда синхронна - я не знаю об этом.

Но используется ли этот термин непоследовательно в других местах - например, в большинстве Homebrew TTL Computers?

Или я просто ошибаюсь?

====

Обновлять :

Некоторые могли неправильно понять мою точку зрения.

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

Под одним циклом эти процессоры обычно означают, что они делают что-то вроде продвижения ПК на одном фронте тактовой частоты, а затем используют противоположный край тактовой частоты для обновления триггеров с результатом. ИЛИ они будут использовать другую фазу часов для обновления асинхронных компонентов, таких как защелки и sram.

Однако ссылка на ZipCPU, которую я предоставил, предполагает, что использование противоположного фронта тактовой частоты сродни использованию второго тактового цикла или даже второго тактового сигнала. Кстати, Бен Пожиратель в своих видео даже сравнивает перевернутые часы, которые он использует для обновления своего SRAM, с вторыми часами.

Мое возражение против использования одноциклового ЦП с такими ЦП (в основном, большинство / все домашние ЦП TTL, которые я видел, поскольку все они работают таким образом), заключается в том, что я согласен с ZipCPU, который использует противоположный край (или фазу) часов. для фиксации фактически то же самое, что и использование вторых часов, и это насмехается над утверждением одного цикла.

Если использование противоположного фронта фактически то же самое, что и использование одного фронта, но с двумя тактовыми циклами, тогда я думаю, что использование термина сомнительно. Так что я принимаю точку зрения ZipCPU близко к сердцу и сокращаю этот термин до обозначения использования единственного ребра.

С другой стороны, кажется вполне возможным построить ЦП, который использует только компоненты синхронизации (то есть триггеры, запускаемые по фронту) и который использует только один край, где на каждом краю мы синхронизируем все, что находится на шине, с любым устройством, выбранным для пишите и одновременно продвигайте ПК. Между одной кромкой и следующей кромкой того же направления происходит оседание.

Таким образом, мы получаем CPI = 1 и используем только один край, что очень сильно отличается от обычного шаблона ЦП TTL с использованием обоих фронтов тактовой частоты.

Кстати, мое впечатление от FPGA (о котором я здесь не говорю) заключается в том, что все элементы памяти в FPGA являются синхронными триггерами. Я не знаю, но это то, что подсказывает мое прочтение. В любом случае, если это правда, то тривиальный ЦП на базе FPGA, вероятно, имеет CPI = 1 и использует только, скажем, положительный край, и поэтому они вполне могут соответствовать моему узкому определению одноциклового ЦП. Кроме того, мое чтение предполагает, что различные имплименты MIP (вероятно, образовательные усилия), вероятно, соответствуют моему определению.


person johnlon    schedule 01.09.2020    source источник
comment
Логика запускается на фронте тактового сигнала, но с течением времени проходит через задержки на затворе со скоростью, которая зависит от электрических характеристик каждого затвора и задержек проводов. И завершается до начала следующего тактового цикла, даже в худшем случае (критический путь). Ваша фраза должна выполнять все операции изменения состояния на одном фронте одного тактового цикла. не учитывает задержку стробирования, но ваш следующий абзац действительно так ясно говорит об этом (урегулировании) Я просто придираюсь к мелочам. Может, начать, а не выполнять? Я не разбираюсь в логической терминологии, так что, может, это нормально.   -  person Peter Cordes    schedule 12.01.2021
comment
В любом случае, единственный способ получить какой-либо гарантированный стабильный интервал без фронта тактового сигнала - это управлять задержками ворот, например, намеренно использовать известную длинную цепочку задержек ворот для запуска записи в память, при этом эта цепочка длиннее критического пути входных данных. Но это кажется супер-нестабильным, потому что задержка гейта не постоянна, и одна сторона чипа, работающая сильнее, чем другая, может изменить относительную синхронизацию. Я не знаю, ответ ли это, но да, ваше беспокойство кажется обоснованным.   -  person Peter Cordes    schedule 12.01.2021
comment
NB Я сказал одинарные часы - край не без края. Использование задержек затвора для воссоздания импульса записи для асинхронного компонента, такого как sram, не лучше, чем наличие отдельных часов для этого или использование более одного тактового цикла для выполнения записи. Это примеры того, почему я не приемлю использование термина ЦП с одним циклом для ЦП домашнего приготовления; потому что кажется неизбежным, что если вы используете асинхронные компоненты (в отличие от flipflow и sync memory), тогда не будет возможности выполнять полезную работу за один такт и используя только один край.   -  person johnlon    schedule 12.01.2021
comment
Правильно, конечно, вы бы просто использовали еще один фронт тактовой частоты в реальном дизайне, если только вы не пытались намеренно сохранить философскую чистоту однотактного дизайна ЦП, но все же подавать сигнал на другую синхронизированную шину. Однако я не очень хорошо разбираюсь в том, что делает DRAM асинхронным; не могли бы вы начать запись в ОЗУ (установив какой-либо контакт или послав край тактовой частоты памяти), когда данные были готовы, и закончить запись на следующей правильной частоте процессора? Пока вы сохраняете задержки, ведущие к ОЗУ, достаточно низкими, вы можете убедиться, что тактовый интервал памяти достаточно длинный.   -  person Peter Cordes    schedule 12.01.2021
comment
В настоящий момент я создаю 8-битный ЦП TTL и, вероятно, для аргументов, теперь последую за ним с тривиальным ЦП, который имеет CPI = 1 и единственное ребро. Это будет означать отказ от использования SRAM (или защелок), что, конечно, сильно ограничивает его возможности, но это будет средство, чтобы подчеркнуть неуклонное использование одного цикла, когда это действительно многоцикл в овечьей шкуре. - hackaday.io/project/166922-spam-1-8-bit -cpu - github.com/Johnlon/spam-1   -  person johnlon    schedule 12.01.2021
comment
Хорошо, но основной смысл вашего вопроса, похоже, связан с терминологией, а не с построением вещей. Конвейерные конструкции иногда используют другой фронт тактовой частоты, чтобы что-то сделать за полупериод на одном из этапов конвейера, но мы все равно говорим, что это процессор 100 МГц, а не 200, например. например MIPS I (R2000) обрабатывает ветки следующим образом: Как MIPS I обрабатывает ветвление по предыдущей инструкции ALU без остановки?.   -  person Peter Cordes    schedule 12.01.2021
comment
Только если вы всегда полностью используете оба фронта тактовой частоты (например, ALU с двойной накачкой P4 / netburst), эта часть ЦП описывается с удвоенной частотой. Для этого потребуется определить процессор с одним циклом как использующий два полупериода. Если вы готовы это допустить, тогда все в порядке. В противном случае да, использование более одного фронта тактового сигнала будет означать, что один цикл отмечен звездочкой.   -  person Peter Cordes    schedule 12.01.2021
comment
ЦП с одним циклом может полностью выполнить любую инструкцию от выборки до фиксации за один такт. Ничего страшного, если вся работа разделена на два полупериода; ЦП по-прежнему однотактный. Таким образом, не обязательно выполнять всю работу на одном ребре, потому что цикл содержит два ребра, а не только одно, и можно разделить работу на два ребра. Теперь, если вы удвоите частоту для одного и того же ЦП с одним циклом, тогда определение того, что такое цикл, изменится, и это больше не будет ЦП с одним циклом.   -  person Hadi Brais    schedule 13.01.2021
comment
Его простая семантика: без дополнительных уточнений термин «единичный цикл» неоднозначен относительно того, используется ли одно ребро или оба ребра (переходы часов).   -  person Erik Eidt    schedule 13.01.2021


Ответы (2)


Это, по-видимому, в основном вопрос определений и терминологии, а не того, как на самом деле построить простые процессоры.

Если вы настаиваете на этом строгом определении одноциклового процессора, означающем, что по-настоящему использовать только тактовый фронт, чтобы привести все в движение для этой инструкции, тогда да, это исключит реальные игровые / хобби-процессоры, которые используют 2-й фронт тактовой частоты для обеспечения согласованности. интервал доступа к памяти.

Но они, безусловно, по-прежнему соответствуют духу ЦП с одним циклом, заключающемуся в том, что каждая инструкция выполняется за 1 такт, без конвейерной обработки и без многоциклового микрокода.

У целого тактового цикла есть 2 фронта тактовой частоты, и для реальных (не одноцикловых) процессоров в некоторых случаях нормально использовать другой край для внутренней синхронизации, но мы все еще говорим об их частоте в полных циклах, а не об их частоте. граничная частота, за исключением случаев, таких как память DDR, где мы говорим о скорости передачи = удвоенной тактовой частоте памяти. Что отличает это друг от друга, так это всегда использование обоих фронтов и для примерно одинаковых вещей, а не просто дополнительное время / синхронизация в тактовом цикле.


Теперь можно создать ЦП, который будет хранить значение на шине памяти в течение некоторого минимального времени без использования фронта тактовой частоты? Может быть.

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

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

person Peter Cordes    schedule 18.01.2021
comment
IDK, если это полезный ответ, но я не хотел, чтобы ваша награда закончилась, пока вы что-то не получили. Поэтому я переработал свои комментарии в этот ответ. Опять же, IDK, если вам нужен именно такой ответ. Но ТЛ: ДР: не беспокойтесь об этом. - person Peter Cordes; 19.01.2021

В определении говорится, что процессор с одним циклом занимает всего одну инструкцию за один цикл. Таким образом, теоретически можно сделать вывод, что есть другие процессоры, которые принимают больше или меньше инструкций за цикл. Вы можете проверить, что есть некоторые концепции, такие как многоцикловый процессор и конвейерный процессор (конвейерная обработка инструкций). Конвейерная обработка пытается занять каждую часть процессора какой-либо инструкцией, разделяя входящие инструкции на серию последовательных шагов. согласно Wiki. Я не знаю, как именно это работает, но, возможно, он просто использует доступные регистры (возможно, вместо использования, например, EAX, ECX используется как EAX или, может быть, он работает как-то иначе, но одно точно на 100% верно, что количество возрастает, поэтому, возможно, это одна из основных целей. Источник: https://en.wikipedia.org/wiki/Instruction_pipelining Я думаю, что ответ на вопрос: возможно ли использование асинхронных компонентов за один цикл, зависит от контроллера ЦП, который контролирует ЦП и ОЗУ с помощью кодов операций. I нашел интересную информацию об этом на сайте: http://people.cs.pitt.edu/%7Echo/cs1541/current/handouts/lect-pipe_4up.pdf https://ibb.co/tKy6sR2 ВЫВОД: На мой взгляд, если рассматривать термин однократный ЦП У него должна быть самая простая из возможных конструкций. Термин «асинхронный» реализует вывод, более сложный, чем синхронный. Таким образом, оба термина не эквивалентны. Это что-то вроде «Можно ли рассматривать базовый тип данных как структуру?». На мой взгляд, слово single означает простейшее возможное, а асинхронное означает некоторую модификацию, более сложную, поэтому просто подумайте, что это невозможно, но, возможно, термин используется, может быть обойден, когда используются - если какой-то переключатель, какой-то контроллер может отключите асинхронный режим и сделайте все это максимально простым. Но вообще просто думаю, что это невозможно

person SmilingMouse    schedule 18.01.2021
comment
OP использует асинхронный режим, чтобы говорить об ОЗУ с синхронизированным интерфейсом, а не просто вводить адрес и выводить данные после некоторых задержек шлюза (например, SRAM). IDK, если асинхронный - это даже правильный термин для этого, но ваша аналогия: Можно ли рассматривать базовый тип данных как структуру? вообще не кажется полезным. Дело не в том, чтобы разблокировать весь процессор. - person Peter Cordes; 19.01.2021
comment
Кроме того, вся первая половина о существовании конвейерных и микрокодированных процессоров не имеет отношения. Это как ответить на вопрос о разработке мотоциклов, указав на существование автомобилей и поездов. Но если вам интересно, см. 90-минутное руководство по современным микропроцессорам! и realworldtech.com/sandy-bridge для более глубокого погружения в сложный современный конвейер (суперскаляр / не по порядку, с большим файлом физического регистра, в который можно переименовать регистры архитектуры) - person Peter Cordes; 19.01.2021
comment
Ничего себе круто - просто имейте простое понимание сложных структур - добавил этот ответ, потому что хотел начать обсуждение архитектуры процессора - это очень интересно для меня. Я также ищу соответствующую тему о сопоставлении оборудования с неизвестным поведением - например, сопоставление поведения микроконтроллеров с удаленным именем. В общем - один большой вопрос - как мы узнаем, что документация, предоставленная Intel, на 100% верна в отношении всего поведения ЦП? Может быть, значение кодов операций отличается от описанного - просто нужно, чтобы кто-то рассказал об этом, как иррациональные коды операций, такие как mov edi, edi - person SmilingMouse; 19.01.2021
comment
mov edi,edi - это совершенно нормальный способ расширения EDI до RDI. Но для фактического поиска недокументированных кодов операций см. Нарушение набора инструкций x86 (видео-презентация конференции) / news.ycombinator.com/item?id=15209632. По сути, поместите байты в конец несопоставленной страницы и посмотрите, получите ли вы #UD ошибку недопустимой инструкции или ошибку страницы #PF при попытке выполнить выборку на следующую страницу после ее выполнения. Или если эти байты являются лишь частью более длинной инструкции. - person Peter Cordes; 19.01.2021