Комментарии 13
Везде блокирующие присвоения… negedge clk (уже молчу про отсутствие сброса), не, надо бы ещё поработать над кодом.
ЗЫ. И да:
>> Данная реализация интегрировалась в FPGA Altera Max 10, которая имеет 32 разрядную архитектуру, в связи с чем размер для данных и адреса(word_size) 32 бита.
Эм, как это ПЛИС может иметь 32-разрядную архитектуру?
ЗЫ. И да:
>> Данная реализация интегрировалась в FPGA Altera Max 10, которая имеет 32 разрядную архитектуру, в связи с чем размер для данных и адреса(word_size) 32 бита.
Эм, как это ПЛИС может иметь 32-разрядную архитектуру?
+4
Возможные конфигурации блоков памяти (из PDF про блоки памяти M9K на Макс 10):
Но даже если вы попросите 48-бит или 64-ре то компилятор за вас объединит несколько в один блок.
Для старта очень полезно смотреть что же там нагородил компилятор в Technology Map и тогда будет например четко видно в чем разница в использовании блокирующего и не блокирующего присваивания в блоке always с posedge.
8192 × 1
4096 × 2
2048 × 4
1024 × 8
1024 × 9
512 × 16
512 × 18
256 × 32
256 × 36
Но даже если вы попросите 48-бит или 64-ре то компилятор за вас объединит несколько в один блок.
Для старта очень полезно смотреть что же там нагородил компилятор в Technology Map и тогда будет например четко видно в чем разница в использовании блокирующего и не блокирующего присваивания в блоке always с posedge.
0
Меня тоже это сначала смутило, однако, статическая ячейка памяти содержит 2 инвертора и 2 ключа. Ни защелок, ни триггеров там не наблюдается. Более того, память со случайным доступом не инициализируют. Мы либо записали туда полезные данные, либо сами дураки, что полезли читать из незаписанной ячейки.
0
Здравствуйте, а Вы тестировали то, что Вы написали? Хотелось бы увидеть общий код написанного Вами кэша помимо его отдельных частей, разбросанных по статье.
0
После инициализации регистров через блок Initial дальше читать не стал…
0
Если код для ПЛИС, то почему нет?
0
Потому что Initial не синтезируемая конструкция. В железе это не работает, пригодно только для моделирования. Немного уточню, не синтезируется присвоение начальных значений регистрам через Initial, а вот так сделать можно:
initial
begin
$readmemb(«ram.txt», ram);
end
initial
begin
$readmemb(«ram.txt», ram);
end
+1
Чем ПЛИС не железо? На ПЛИС работает. Автор же код не для ASIC делает.
Да и не в ASIC даже дело. Раз уж речь про «железо» так память и кеш никто не синтезирует сейчас из верилог.
Да и не в ASIC даже дело. Раз уж речь про «железо» так память и кеш никто не синтезирует сейчас из верилог.
0
Конструкция initial reg_name = 1 при синтезе в ПЛИС или ASIC даст вам после подачи питания reg_name = 0, так как синтезатору класть что вы там через initial хотите присвоить регистру. И открою вам великую тайну, все процессоры, и любые другие ASIC/SoC именно на Verilog/VHDL/SystemVerilog сейчас и синтезируют.
+1
После подачи питания на ПЛИС, там нет reg_name, он появится потом, когда будет загружена конфигурация. После загрузки конфигурации, он появится и будет = 1.
Что касается второй части Вашего комментария, Вы хотели сказать моделируют, а синтезируют — компиляторы и роутеры :) И да, синтезировать целый процессор можно, но он никогда не будет работать с той частотой к которой мы привыкли.
Что касается второй части Вашего комментария, Вы хотели сказать моделируют, а синтезируют — компиляторы и роутеры :) И да, синтезировать целый процессор можно, но он никогда не будет работать с той частотой к которой мы привыкли.
0
Само собой после загрузки конфигурации. А вот 1 он будет равен далеко не всегда, не все компиляторы поддерживают инициализацию через Initial, и не все модели ПЛИС. Иными словами, такой код не является универсальным и хорошо переносимым. А второй частью своего комментария я хотел сказать, что описание любого современного процессора или SoC, в любом случае, делается на HDL, в не зависимости от того, собираетесь ли вы его реализовывать на ПЛИС, ASIC или БМК.
+1
Шаг 2: объявление регистров внутри модуля
Это не регистры! Это тип данных reg, переменные этого типа должны стоять с левой стороны процедурных присваиваний. В SystemVerilog этот тип называется logic именно ради избегания подобной путаницы.
долгосрочное присваивание
В русскоязычной литературе используется термин «непрерывное присваивание»
0
Тоже хотелось бы вставить 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'а придётся задать дефайнами).
Так будет и понятнее и не будет вводить в заблуждение.
З.Ы. И да, статья выглядит как добавление русских комментариев к файлу скачанному из недр Гита.
а) может быть по-разному сконфигурирован
б) не обязан быть «квадратным»
Поэтому настоятельно рекомендую заменить параметр word_size в разрядности данных и адреса, на 2 разных параметра: word_length и addr_legth. Причём второй может быть производным от параметра ram_depth, по следующей закономерности addr_legth = $clog2(ram_depth) (clog2 для чистого Verilog'а придётся задать дефайнами).
Так будет и понятнее и не будет вводить в заблуждение.
З.Ы. И да, статья выглядит как добавление русских комментариев к файлу скачанному из недр Гита.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Имплементация кэша на Verilog