Altifigence Academy

5 / 24 · Теория

Читайте регистровые передачи на тактовых фронтах

Разделяйте старое и следующее состояние и прослеживайте сохранение значений сигналами разрешения.

Все регистры читают старое состояние

Сначала определите информацию, которая должна сохраняться между тактами. Аккумулятор, захваченные операнды, счётчик цикла и выходной valid — это состояние. Сумма текущего аккумулятора и операнда — комбинационное значение. Запись переменной сама по себе не объясняет хранение; задайте событие, фиксирующее её значение.

Этот аккумулятор добавляет x только на передних фронтах при установленном en. При низком en значение сохраняется. Девятибитное промежуточное значение явно определяет сложение; выбор младших восьми бит задаёт поведение по модулю 256. Неблокирующие присваивания в always_ff планируют следующее состояние по значениям, прочитанным на текущем фронте. Интерпретация блока как немедленных программных присваиваний ошибочна при наличии нескольких регистров.

SystemVerilog
logic [7:0] acc;
logic [8:0] next_sum;
assign next_sum = {1'b0, acc} + {1'b0, x};
always_ff @(posedge clk) begin
  if (rst) acc <= 8'd0;
  else if (en) acc <= next_sum[7:0];
end

Сброс синхронный и имеет приоритет над разрешением. Отсутствие присваивания в последовательностном блоке при низком en означает удержание регистра. Отсутствие присваивания на комбинационном пути, напротив, может привести к непреднамеренной защёлке. В комбинационной логике следующего состояния задавайте значения по умолчанию, затем переопределяйте их для конкретных условий.

ФронтrstenxСтарое accНовое acc
0119Неизвестно0
101707
20010077
30125071

На фронте 2 видимое входное значение 100 не было принято. На фронте 3 сумма 7+250=257 сужается до 1. Различать предъявление и приём по-прежнему необходимо, когда en позднее станет valid AND ready.

Для a<=x; b<=a; старое a=5 и x=9 дают новые a=9 и b=5. Если b должно получить 9, соедините его вход с x. Сначала заполните столбец старого состояния, затем вычислите все значения следующего состояния вместе; так выявляются расхождения данных и управления на один такт.

Попробуйте сами

Изначально a=4 и b=0. Входы x равны 8, затем 12, а на каждом фронте выполняются a<=x; b<=a. Чему равны a и b после второго фронта?

Прочитать объяснение

После первого фронта a=8 и b=4. После второго a=12 и b=8. Каждое обновление b использует старое a, поэтому x=12 не проходит через оба регистра за один фронт.

Выбор действует в этом браузере. Его можно изменить внизу страницы.