Как избежать проблем с синхронизацией в процессоре - PullRequest
3 голосов
/ 21 марта 2009

Я пишу симуляцию (очень медленного и примитивного) процессора.

Например: допустим, тактовая частота равна 1 Гц. Я предполагаю, что это означает, что 1 инструкция может / будет обрабатываться каждую секунду. Некоторые инструкции занимают больше времени, чем другие. Добавление 1 + 0 занимает меньше времени, чем 1 + 7. (Последнее вызывает пульсацию битов переноса, которая занимает ненулевое количество времени.)

Мне нужно выполнять инструкции только после того, как все остальные инструкции завершены.

Нужно ли:

  1. сколько времени занимает самая длинная инструкция и установить тактовую частоту больше этой?
  2. создать наблюдателя с состоянием, который не позволит в будущем выполнять инструкцию до тех пор, пока предыдущая не будет завершена
  3. Я неправильно понимаю проблему?

В # 1 кажется, что я все еще рискую, что условие гонки не завершено до начала следующего. В # 2 кажется, что я рискую непредсказуемой / переменной тактовой частотой, которая может вызвать проблемы позже.

Как я могу решить это? Есть ли какие-либо советы о том, как реальный процессор решает эту проблему?

Ответы [ 4 ]

3 голосов
/ 21 марта 2009

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

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

Обычно, когда вы моделируете цифровую электронику, вы используете модель, основанную на событиях, поскольку электронные системы являются параллельными, но также имеют задержки распространения, которые необходимо смоделировать. Я помню, как использовал такие инструменты, как PSpice и MicroSim в Uni, которые сделали это очень хорошо.

3 голосов
/ 21 марта 2009

Вы знакомы с конвейером команд ?

2 голосов
/ 21 марта 2009

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

Поскольку вы говорите, что это простой и примитивный процессор, вам не нужно беспокоиться о кэшах, конвейерной обработке, неправильном выполнении, предсказании ветвлений и т. Д. (Хотя было бы полезно узнать об этом).

Вы можете просто установить тактовый интервал, равный интервалу самой длинной инструкции. Или вы можете объединить все более короткие инструкции в одну группу, найти самые длинные в этой группе и установить интервал часов на это значение. Теперь оставшимся длинным инструкциям может быть назначен интервал, равный кратному тактовому интервалу.

Повторюсь, нет единого способа сделать это.

1 голос
/ 21 марта 2009

(1) - это то, что часы. У вас не должно быть состояния гонки; требуется x ns для выполнения добавления; часы у нс. х

Конечно, если ты сделаешь слишком маленьким, случится что-то плохое. Но это вполне реально; это происходит при разгоне фишек. Они становятся нестабильными при повышении тактовой частоты.

...