День 1.
Была начата разработка контроллера памяти:
- Создан модуль контроллера memory_controller;
- Сделан расчёт параметров (модуль параметризирован):
- ширины адресного пространства для банок (BANK_ADRESS),
- для строк (ROW_ADRESS), колонн (COLUMN_ADRESS),
- определена ширина шины данных (4 бита).
Определены:
- время одного такта (CAS_LATENCY - 7 нс (для CAS = 3)),
- задержка для перезарядки линии слов (RP_TIME = 15 нс (для CAS = 3, -7)),
- задано время рефреша ячеек памяти (REFR_TIME = 64 мс);
CAS - количество тактов и соответственно время, которое необходимо для того что бы защёлкнулся адрес колонны и был выдан результат (CAS = 3 такта = 22,5 нс) (RAS аналогично для строк);
- Объявлены все (или почти все, надо ещё разобраться входы/выходы);
- Создан каркас конечного автомата: добавлены состояния INIT_HOLD, PRECHARGE, IDLE, AUTO_REFR, переходы и выходные состояния для них в рамках инициализации памяти;
- Реализована инициализация памяти до шага заполнения внутренних регистров;
- Добавлен флаг для инициализации init_flag;
День 2.
-
Параметры для задержек (REFR_TIME, RP_TIME, RC_TIME) были переведены из секунд в количество циклов для упрощения условий и для того, чтобы эти условия были более специфичными для данного по условию контроллеру;
-
Выходы пришлось сделать регистрами reg, иначе ModelSim ругается
-
Добавлено состояние MRS - для записи параметров burst во внутренний регистр при инициализации памяти, так как эти данные не определены при запуске платы. Параметры для burst заданные по умолчанию:
-
Full page,
-
Sequential,
-
CAS = 3,
-
Standard operation Mode,
-
Programmed Burst Length;
Данное состояние описывает команду MRS памяти. Переход из этого состояния сразу в IDLE, чтобы контроллер подавал NOP и память ушла в IDLE тоже.
- Переходы между состояниями при инициализации были обыграны через использование двух флагов init_flag и MRS_flag. Первый необходим для того, чтобы контроллер выполнял порядок действий по маршруту инициализации (по факту был в состоянии инициализации), а второй флаг нужен для того, чтобы было возможным двойной переход к refresh_all, сначала при неактивном флаге MRS_flag переход к рефрешу, потом когда случился переход флаг выставляется активным и переход уже будет к MRS. Все команды нужные для инициализации игнорируются без флага, которой снимается при переходе в последнее состояние MRS. Чтобы установка обоих флагов не была противоречивой, было принято решение вынести установку флага в последовательностную часть, где установка происходит синхронно.
- Так же для отсчёта, прошедшего времени нужно было отсчитать количество тактов, для этого был создан второй счётчик counter_db (дублирующий счётчик). В последовательностной части проверяется является ли следующие состояние таким, которое нуждается в подсчёте тактов и если да, то выставляется маркер времени от которого идёт отсчёт тактов. Но при этом, чтобы он не обновлялся постоянно (ведь состояние может не меняться много тактов, но при этом next_state будет состоянием, которое нуждается в подсчёте), проверяется не является ли текущее состояние этим же самым состоянием.
- Получилось запустить симуляцию и разобраться в параметрах симуляции. Создан модуль тестбенча.
- План на следующие дни:
Сделать рефреш, чтение и запись
и
Сделать тестбенч для проверки работы инициализации, проверить правильность отправки команд при инициализации
(В любом порядке)
↓
Сделать тестбенч для рефреша, чтения и записи
↓
Оформить документацию
↓
Разработать доп.функции
- Показана схема переходов контроллера памяти (стрелочкой показаны безусловные переходы по окончанию операции). И соответствующие этим состояниям команды для памяти (или их состояния, кажется что это одно и то же, но не совсем).
Рисунок 1 - Состояния контроллера и соответствующие иму команды для памяти