March 10th, 2021

QuatCore

Новый АЛУ - работа над ошибками

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

Корректно работала команда Acc (положить значение в аккумулятор) и SUB (вычесть из аккумулятора), а вот с SQRD2 (возвести в квадрат и поделить на 2) возникла проблема - откуда-то возник знак "минус". Это заставляет повнимательнее приглядеться к самой длинной строке в модуле QuatCorePipelineALUcontrol.v:

FirstDivSign <= OpSign ^ ((DestAddr[4] & CisSignedC & (isFirstDiv | MulFirst)) | (D[15] & (~DestAddr[4]) & (~DestAddr[3]) & DestAddr[2]));


Которую мы "механически" получили из такой строки:

wire FirstDivSign = OpSign ^ ((isLongCommand & isSignedC & (isFirstDiv | MulFirst)) | (SeniorDataBit & (~isLongCommand) & (~DestAddr[3]) & DestAddr[2]));


Дело определённо в ней!

Collapse )

Ура, процедура поиска самой отдалённой точки выполнилась верно (её индекс оказался 3), и на выполнение ушло 44,71 мкс. На старом АЛУ уходило 47,36 мкс, т.е мы сэкономили 66 тактов (5,6%). Мы ожидали 65 тактов. Один лишний такт пришёлся на невыполнившийся переход JL, когда во время работы АЛУ у нас также шла выборка из памяти [SP].

Ещё и размер модуля ALUcontrol вернулся к своим родным 42 ЛЭ.

Жизнь начинает удаваться :) Сейчас, наверное, быстренько поглядим остальные этапы работы (сортировка точек против часовой стрелки, нахождение матрицы аффинного преобразования, нахождение крена, масштаба и вектора), и если всё хорошо - вернёмся к злополучному "обнаружению точек".