Также, ширина шины данных между ПЛИС и памятью 16 бит, т.е. за каждый цикл доступа к памяти ПЛИС получет, помимо затребованного процессором, еще и смежный с ним байт, который, с большой вероятностью, скоро тоже потребуется процессору. Совершенно понятно, что имеет смысл закешировать его и отдать, при необходимости, без тормозящего обращения к памяти.
И такой кеш в Еве есть. Без него коэффициент турбирования 1.38 (по замерам Turbo Test). С ним поднимается до 1.66.
Однако реализован он очень просто, пришедшее 16 битное слово запоминается и, при следующем обращении, байт из него отдается процессору (если конечно адрес требуемого слова совпадает с сохраненным).
Любая запись в память (равно как и обращение к портам и еще в некоторых случаях) инвалидирует этот кеш и приводит к обязательному обращению к памяти в следующем цикле доступа.
Такое решение приводит к некоторым неприятностям. Т.к. в кеш попадают смежные байты - логично предположить, что кеш эффективен именно как кеш инструкций, однако, любая инструкция, работающая с памятью, приводит к вымыванию байта следующей инструкции из кеша, и чтению его из памяти.
Т.е., как минимум, имеет смысл разделить его на кеш инструкций и кеш данных, благо z80 позволяет это сделать.
Такое разделение поднимает коэффициент турбирования (также, по замерам TurboTest) до 1.71.
Также, имеет смысл оптимизировать инвалидацию кеша. Очевидно, что запись в память по адресу слова, не совпадающего с хранимым в кеше, вполне может обойтись и без его инвалидации.
После такой оптимизации некоторые инструкции ускорились настолько, что перестали влезать в окно измерения в TurboTest. Но на 60Гц развертки тест вполне проходит.
Ниже приведена сводная таблица изменения таймингов команд на оригинальной 14МГц мегатурбе и оптимизированном кеше.
Average Turbo Ratio, похоже, считается неправильно в 60Гц развертке.
Устойчивость работы с новым кешем проверена суточным прогоном Вороны под nedoos - ни единого обрыва не зафиксировано.
зы. Подозреваю, что получу от папы Люка ушат известной субстанции, но, думается, ускорение мегатурбы Евы в интересах всех пользователей baseconf.
- Code: Select all
TURBO TEST v1.0
| nonturbo | turbo | turbo | turbo |
Command | T-states | T-states | ratio | T-states | Δ
| | 14 MHz | | 14 MHz |
| | dumb | | smart |
| | cache | | cache |
--------------------+----------+----------+-------+----------+-------------
NOP | 04 | 05.0 | 1.59 | 05.0 |
RET cc_false | 05 | 06.0 | 1.66 | 06.0 |
INC HL | 06 | 07.0 | 1.71 | 07.0 |
ADD HL,HL | 11 | 12.0 | 1.83 | 12.0 |
LD A,(HL) | 07 | 12.0 | 1.16 | 08.0 | -4
LD A,(addr) | 13 | 21.0 | 1.23 | 21.0 |
LD HL,(addr) | 16 | 23.0 | 1.39 | 23.0 |
LD A,(IX+disp) | 19 | 26.0 | 1.46 | 25.0 | -1
POP HL | 10 | 18.0 | 1.10 | 14.0 | -4
BIT n,(HL) | 12 | 16.0 | 1.49 | 14.0 | -2
BIT n,(IX+disp) | 20 | 26.0 | 1.53 | 26.0 |
LD (HL),A | 07 | 10.0 | 1.39 | 08.0 | -2
LD (addr),A | 13 | 18.0 | 1.44 | 17.0 | -1
LD (addr),HL | 16 | 21.0 | 1.52 | 20.0 | -1
PUSH HL | 11 | 14.0 | 1.57 | 12.0 | -2
LD (IX+disp),A | 19 | 24.0 | 1.58 | 23.0 | -1
INC (HL) | 11 | 16.0 | 1.37 | 15.0 | -1
INC (IX+disp) | 23 | 30.0 | 1.53 | 30.0 |
RLC (HL) | 15 | 20.0 | 1.49 | 20.0 |
RLC (IX+disp) | 23 | 30.0 | 1.53 | 30.0 |
EX (SP),HL | 19 | 24.0 | 1.58 | 23.0 | -1
JR addr | 12 | 14.0 | 1.71 | 14.0 |
CALL addr | 17 | 22.0 | 1.54 | 17.0 | -5
LDI | 16 | 20.0 | 1.59 | 20.0 |
LDIR | 21 | 26.0 | 1.61 | 24.0 | -2
IN A,(addr) | 11 | 14.0 | 1.57 | 14.0 |
OUT A,(addr) | 11 | 14.0 | 1.57 | 14.0 |
IN A,(C) | 12 | 14.0 | 1.71 | 14.0 |
OUT (C),A | 12 | 14.0 | 1.71 | 14.0 |
INI | 16 | 04.9 | 6.46 | 18.0 | ?
OUTI | 16 | 22.0 | 1.45 | 22.0 |
INIR | 21 | 24.0 | 1.74 | 24.0 |
OTIR | 21 | 27.1 | 1.60 | 27.1 |
--------------------+----------+----------+-------+----------+-------------
Averaged turbo ratio: 1.67 (v1.0)