June 19th, 2020

QuatCore

QuatCore: и немедленно выпил!

Решил внести серьёзные изменения в самый первый из "компонентов" QuatCore, в модуль QuatCoreImm. Самым первым он был, поскольку именно его было легче всего написать, буквально в две строки и в НОЛЬ логических элементов:

module QuatCoreIMM (input [7:0] SrcAddr, output [15:0] Q);

assign Q[6:0] = SrcAddr[6:0];
assign Q[15:7] = {9{SrcAddr[6]}}; //sign extension

endmodule


Imm - сокращение от Immediate, то бишь "непосредственные" значения. Когда нужно не из памяти значение извлечь, не из регистра, не со входа - а просто использовать заранее известную константу, например, 3, то с помощью данного "модуля" это становится возможным. То есть, 128 адресов "источника данных" (SrcAddr) из 256 отданы именно на эти непосредственные значения, и при данной реализации они соответствуют числам от -64 до +63 (производится расширение знака до 16 бит).

Увы, этого мало. Вот хочу сейчас для обработки изображения устроить цикл по строкам, от 719 до нуля, и чтобы это сделать, приходится городить такое:
.rodata
  ImageHeight  dw 719
.code
  X      ImageHeight
  i      0
  [SP+1] [X+i]

Где-то в памяти выделить слово под это число, потом инициализировать базовый регистр и какой-нибудь индексный регистр - и наконец загрузить. При том нужно следить, чтобы число это хранилось в первых 64 или последних 64 адресах памяти, иначе мы и к нему напрямую "добраться" не сможем. И приходится соображать, какие у нас регистры сейчас свободны, чтобы через них загрузить это самое число!

И как будто это недостаточно уродливо, компилятор в таком коде обнаруживает Hazard между строками
i      0


и
[SP+1] [X+i]

дескать, из-за конвейера запись нуля в i и чтение [X+i] происходит одновременно, RAW (Read After Write) hazard, поэтому он туда вставляет ещё пустую инструкцию NOP 0.

Это уже начало причинять физическую боль, когда с подобными проблемами сталкиваешься раз за разом. И ладно, если бы это был процессор, в который уже "не влезешь" - уж раз купил его, раз решил конкретно эту архитектуру использовать - ТЕРПИ! Но это ж мой собственный драндулет, soft core, который я могу как угодно модифицировать!

Так что всё, хватит мучать самого себя этими костылями, пора научиться "хранить" в QuatCoreImm "произвольные" 16-битные константы, причём их количество может даже немножко превысить 128 штук :)

Collapse )

Продолжение следует...
ook

Приключения итальянцев на мосводоканале

Гору мусора так до сих пор не убрали - езжу каждый день проверяю. Она за этим вот зданием. Обычно я как раз с той стороны и проезжаю, и попадаю практически сразу на мост, а сейчас приходится с другой стороны объезжать. Но хоть один положительный момент: сфотографировал данные рисунки при свете дня:



Collapse )