5 / 24 · Теория
Читайте регистровые передачи на тактовых фронтах
Разделяйте старое и следующее состояние и прослеживайте сохранение значений сигналами разрешения.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Все регистры читают старое состояние
Сначала определите информацию, которая должна сохраняться между тактами. Аккумулятор, захваченные операнды, счётчик цикла и выходной valid — это состояние. Сумма текущего аккумулятора и операнда — комбинационное значение. Запись переменной сама по себе не объясняет хранение; задайте событие, фиксирующее её значение.
Этот аккумулятор добавляет x только на передних фронтах при установленном en. При низком en значение сохраняется. Девятибитное промежуточное значение явно определяет сложение; выбор младших восьми бит задаёт поведение по модулю 256. Неблокирующие присваивания в always_ff планируют следующее состояние по значениям, прочитанным на текущем фронте. Интерпретация блока как немедленных программных присваиваний ошибочна при наличии нескольких регистров.
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 означает удержание регистра. Отсутствие присваивания на комбинационном пути, напротив, может привести к непреднамеренной защёлке. В комбинационной логике следующего состояния задавайте значения по умолчанию, затем переопределяйте их для конкретных условий.
| Фронт | rst | en | x | Старое acc | Новое acc |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 9 | Неизвестно | 0 |
| 1 | 0 | 1 | 7 | 0 | 7 |
| 2 | 0 | 0 | 100 | 7 | 7 |
| 3 | 0 | 1 | 250 | 7 | 1 |
На фронте 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 не проходит через оба регистра за один фронт.