Как стать автором
Обновить

Комментарии 13

Везде блокирующие присвоения… negedge clk (уже молчу про отсутствие сброса), не, надо бы ещё поработать над кодом.

ЗЫ. И да:
>> Данная реализация интегрировалась в FPGA Altera Max 10, которая имеет 32 разрядную архитектуру, в связи с чем размер для данных и адреса(word_size) 32 бита.
Эм, как это ПЛИС может иметь 32-разрядную архитектуру?
Возможные конфигурации блоков памяти (из PDF про блоки памяти M9K на Макс 10):
8192 × 1
4096 × 2
2048 × 4
1024 × 8
1024 × 9
512 × 16
512 × 18
256 × 32
256 × 36

Но даже если вы попросите 48-бит или 64-ре то компилятор за вас объединит несколько в один блок.
Для старта очень полезно смотреть что же там нагородил компилятор в Technology Map и тогда будет например четко видно в чем разница в использовании блокирующего и не блокирующего присваивания в блоке always с posedge.
Меня тоже это сначала смутило, однако, статическая ячейка памяти содержит 2 инвертора и 2 ключа. Ни защелок, ни триггеров там не наблюдается. Более того, память со случайным доступом не инициализируют. Мы либо записали туда полезные данные, либо сами дураки, что полезли читать из незаписанной ячейки.

Здравствуйте, а Вы тестировали то, что Вы написали? Хотелось бы увидеть общий код написанного Вами кэша помимо его отдельных частей, разбросанных по статье.

После инициализации регистров через блок Initial дальше читать не стал…
Если код для ПЛИС, то почему нет?
Потому что Initial не синтезируемая конструкция. В железе это не работает, пригодно только для моделирования. Немного уточню, не синтезируется присвоение начальных значений регистрам через Initial, а вот так сделать можно:

initial
begin
$readmemb(«ram.txt», ram);
end
Чем ПЛИС не железо? На ПЛИС работает. Автор же код не для ASIC делает.
Да и не в ASIC даже дело. Раз уж речь про «железо» так память и кеш никто не синтезирует сейчас из верилог.
Конструкция initial reg_name = 1 при синтезе в ПЛИС или ASIC даст вам после подачи питания reg_name = 0, так как синтезатору класть что вы там через initial хотите присвоить регистру. И открою вам великую тайну, все процессоры, и любые другие ASIC/SoC именно на Verilog/VHDL/SystemVerilog сейчас и синтезируют.
После подачи питания на ПЛИС, там нет reg_name, он появится потом, когда будет загружена конфигурация. После загрузки конфигурации, он появится и будет = 1.
Что касается второй части Вашего комментария, Вы хотели сказать моделируют, а синтезируют — компиляторы и роутеры :) И да, синтезировать целый процессор можно, но он никогда не будет работать с той частотой к которой мы привыкли.
Само собой после загрузки конфигурации. А вот 1 он будет равен далеко не всегда, не все компиляторы поддерживают инициализацию через Initial, и не все модели ПЛИС. Иными словами, такой код не является универсальным и хорошо переносимым. А второй частью своего комментария я хотел сказать, что описание любого современного процессора или SoC, в любом случае, делается на HDL, в не зависимости от того, собираетесь ли вы его реализовывать на ПЛИС, ASIC или БМК.
Шаг 2: объявление регистров внутри модуля

Это не регистры! Это тип данных reg, переменные этого типа должны стоять с левой стороны процедурных присваиваний. В SystemVerilog этот тип называется logic именно ради избегания подобной путаницы.
долгосрочное присваивание

В русскоязычной литературе используется термин «непрерывное присваивание»
Тоже хотелось бы вставить 5 копеек. Кроме negedge по клоку (за который отрубить руки не жалко) и неблокирующего присваивания, вкорне неверно утверждение «FPGA Altera Max 10, которая имеет 32 разрядную архитектуру». У ПЛИС нет никакой «архитектуры», FPGA-дизайнер сам создаёт нужную архитектуру, а то что Вы назвали 32-разрядной архитектурой — просто тип примитива 32*32, который:
а) может быть по-разному сконфигурирован
б) не обязан быть «квадратным»
Поэтому настоятельно рекомендую заменить параметр word_size в разрядности данных и адреса, на 2 разных параметра: word_length и addr_legth. Причём второй может быть производным от параметра ram_depth, по следующей закономерности addr_legth = $clog2(ram_depth) (clog2 для чистого Verilog'а придётся задать дефайнами).
Так будет и понятнее и не будет вводить в заблуждение.
З.Ы. И да, статья выглядит как добавление русских комментариев к файлу скачанному из недр Гита.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории