Привет, Valentin !
14 Aug 16 , 07:30 Valentin Nechayev писал к Nickita A Startcev:
>>>>> Nickita A Startcev wrote:
VN>>> Сравни цену общения с регистром и с памятью. При малом
VN>>> количестве регистров надо будет вытеснять данные в стек/память.
NAS>> да, но при этом для регистров нужен мультиплексор, размер
NAS>> которого растет примерно как квадрат числа регистров (плюс
NAS>> домножить на разрядность)
VN> Почему как квадрат - я не понял.
на вход типа линиями по вертикали подаем линии от входной шины.
на выход типа линиями по горизонтали подключаем линии от регистров.
на каждом пересечении нужно иметь/неиметь соединение.
это для однобитных регистров.
для многобитных - тупо копипастим согласно разрядности.
VN> Количество шин фиксировано (грубо
VN> говоря, если копирование между регистрами тоже через АЛУ, то по одной
VN> на операнд и результат, то есть 3). Мультиплексор - по одному входу
VN> или выходу на каждый регистр и ширина по количеству бит адреса, итого
VN> O(n*log(n)), а не O(n^2*log(n)).
навскидку, (де)мультиплексор на N+1 входов делается из N (де)мультиплексоров на
2 входа, не меньше. но у него выбор выхода разряженный, а разряжение делаем
дешифратором этак примерно как произведение ширины входа на ширину выхода то
есть, N*2^N по числу регистров (на часть битов широкое или-не, его выход и
остальные биты на широкое И. таких блоков примерно по числу выходов).
то есть, для 2^A регистров/шин по Б бит надо порядка 4*(Б*А-1)*2^A транзисторов
обвязки, если Ъ-и-не / Ъ-или-не / Ъ-и / Ъ-или требуют 4*Ъ транзисторов (2*Ъ
комплементарных пар).
но я не очень настоящий сварщик.
NAS>> кстати, у z80 алу 4-битное, что заметно экономит транзисторы, но
NAS>> увеличивает такты. но, типично, внешняя память и так требует 2 и
NAS>> более тактов
VN> От организации зависит, у 6502, например, проходило за 1 такт. Хотя у
VN> него по сравнению с ровесниками-аналогами частота была в 2-4 раза
VN> ниже.
а тут надо аккуратно смотреть
есть nMOS, а есть CMOS - втрое требует примерно вдвое больше транзисторов, но
зато радикально быстрее (во втором - перезаряжаем паразитные емкости через
открытый канал, а в первом тупо вкл/выкл тока в резисторе-подтяжке и
перезарядка через резистор).
первые "негонящиеся" z80 были nMOS, а те, которые не 3.5 а до этак 14МГц -
CMOS.
можно сделать АЛУ на 8 бит и считать операции типа 8+8 за 1 такт,
а можно АЛУ на 4 бита и считать раза в два дольше по тактам, но зато экономить
площадь и чуть поднять тактовую.
NAS>> (для регистров же можно по одному фронту считать, по второму
NAS>> записать, итого 1 такт). итого, в принципе интересно сделать
NAS>> узкое АЛУ на повышенной частоте. или даже не повышенной,
NAS>> учитывая что типичная память сейчас хоть и дофига герц, но и
NAS>> очень дофига тактов.
VN> Это DRAM. А перед этим говорили про SRAM.
"внешняя" срам обычно по одному фронту фиксирует адрес, а по следующему только
гарантирует валидность данных.
и да, срам - порядка 6х транзисторов по сравнению с драм.
NAS>> у АВР система опкодов, в первом приближении, красивая - почти
NAS>> все инструкции ровно 16 бит, у некоторых после этих 16 бит идет
NAS>> еще 16 бит операнда (длинные переходы, загрузка
NAS>> непосредственного значения в регистр, итп). то есть, логика
NAS>> кристалла обязатеьно вычитывает первые 16 бит, обрабатывает их,
NAS>> опционально читает еще 16 бит. типовая растактовка - 1 такт для
NAS>> 1-словных инструкций, 2 такта для 2-словных, доп.пенальти для
NAS>> переходов (конвейер сбивается).
VN> То есть какой-то конвейер есть?
навскидку, там тупо по 1 такту на выборку очередного слова команд, итого
короткие за такт, длинные за два.
и да, в оригинале в атмегах конвейер из 2 стадий - выборка и выполнение.
VN> Иначе такие малые числа не получатся,
самая тупая реализация процессора. по одному фронту берет команду с шины памяти
команд, асинхронно пихает в разбор и исполняющие устройства, а по второму
фронту пихает результат исполняющих устройств на выход.
декодирование идет одновременно с распихиванием по исполняющим устройствам, а
результат можно, например, защелкнуть в триггерах, из которых вытолкнуть наружу
не сразу, а с задержкой.
плюс, опционально, линии типа wait, которые стопорят что-то если где-то не
успеваем (например, если запись еще не прошла, или чтение из медленной внешней
памяти)
VN> и вообще, ты говорил, что память это "2 и более" тактов. (Или это
VN> другая память?)
внутренние регистры - без такта, асинхронно, можно запихнуть в АЛУ. весь
(полу)такт оно будет устаканиваться. то есть, между любыми двумя фронтами можно
получить результат операции (по одному фронту/такту активируем демультиплексор
из регистров/шины в алу, по следующему активируем мультиплексор из алу в
регистры/шину).
чтение внешней памяти - такое заведомо недопустимо. итого, ввод адреса,
устаканивание адреса, защелкивание адреса*, вывод результата, устаканивание
результата, чтение* результата. типично, по (*) идет какой-нибудь фронт
тактового сигнала. обычно и там и там восходящий, итого доп.задержка 1 такт.
NAS>> итого, весь опкод всегда или почти всегда сидит в первых 16 бит,
NAS>> которые вычитываются на первом такте, но при этом, например,
NAS>> у cpc/sbc/add/adc/rol опкод сидит в первых 6 битах и потом 10
NAS>> битов операндов, часть двухрегистровых команд (допустимы не для
NAS>> всех регистров) имеют 4 бита операнда и 4+4+4 битов для 2
NAS>> орегистров и еще imm.
VN> Главное, чтобы первый чанк указывал длину команды. Это выполняется.
NAS>> при этом у заметной части инструкций опкод - это не первые
NAS>> 3-8-12 бит, а первые 5-6 плюс последние 3-4, что немного
NAS>> нелогично на мой взгляд.
VN> Ты ещё на RISC-V посмотри. Там ещё хуже - кроме кода операции, который
VN> разрезан на 2-3 части, immediate может быть разорвано до 4 частей.
а там это случайно не тяжкое наследство, типа как 386PM режим имеет в
наследство от 286РМ ряд рудиментов (типа порезаных битовых полей в регистрах)?
VN> Зато они описывают, что этим экономят на мультиплексорах в декодере.
VN> А ещё погугли Chen-Ho encoding.
спасибо за наводки
NAS>> у х86 длина опкода от 1 и до чуть ли не 10 байт со всеми
NAS>> остановками, (а потом чуть ли не до 3*64 бит адресов/смещений)
NAS>> сегментными префиксами, mod/reg/rm байтами, итп. это немного
NAS>> экономит память, но сильно осложняет декодирование.
VN> Именно.
NAS>> я бы, например, весь "опкод" пихал в старшие биты первого слова,
NAS>> а в младших тупо-одинаково размещал операнды. а у них и операнды
NAS>> то 4 то 5 бит, и их расположение в опкоде разное. то есть,
NAS>> нельзя из опкода тупо вынести 4, 4+4, 5, 5+5, 4+4+4 бит
NAS>> операндов тупо на внутренние шины и адресовать ими "регистры"
VN> Думаю, они наоборот упростили внутреннюю разводку.
как именно это упрощает мне не очень понятно.
. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev
... с конями жить - по конски ржать