Forth http://fforum.winglion.ru/ |
|
KF600 http://fforum.winglion.ru/viewtopic.php?f=3&t=3049 |
Страница 1 из 1 |
Автор: | Hishnik [ Чт май 21, 2015 03:24 ] |
Заголовок сообщения: | KF600 |
Собственно, вот и реализовалась архитектура форт-процессора 6-го поколения. Нельзя говорить, что 5-е было плохим. Наоборот, именно оно работало в проектах по принципу Plug&Play - единственный файл, решающий все проблемы с настройками внутри себя. Что было по факту реализовано: - ориентация на 45-нм поколение FPGA с новой архитектурой логической ячейки. Это сработало ожидаемо эффективно, 6-битные команды уложились в меньшее число слоев декодирования, в результате тактовая частота составляет от 80 МГц (Spartan-6, slow speed grade) до 160-180 МГц (Kintex-7/Virtex-7, fast speed grade). - Отдельно - 6-битная команда со сдвиговым регистром на загрузку литерала. Это позволило реализовать систему команд, полностью независимую от разрядности стека. Синтезируются ядра с разрядностью от 12 до 64 (больше тоже возможно, но не было смысла), совместимые по двоичному коду. - Глубокая параметризация с возможностью отключения модулей. Размер ядра в LUT составляет от 800 до 1400 для 32-разрядной версии. Главные плюсы при эксплуатации: - Один файл, параметризуемый при включении в проект. Очень удобно и минимизирует возможные ошибки из-за невнимательности подключения. - Компактный код благодаря 6-битной команде. Многие вещи успешно реализуются в блочной памяти младших Spartan-6. - Быстрый доступ к системной шине. Все сигналы: addr, data, write_enable. Даже чисто программная реализация обмена дает довольно высокие скорости - 10 МГц и более. Что сделано в 6-м поколении. - Отсутствие регистров как таковых - в виде отдельного стека, регистрового файла или чего-либо еще. Стек вынесен в память данных (технически - Block RAM). Как вынесен и почему это работает - ну... это не вполне тривиально Хотя никаких нештатных решений тут нет. Двухтактный конвейер со штрафом в такт на переходах. - Отдельный стек стековых кадров. При исполнении call текущее значение Depth укладывается на специальный стек, им можно пользоваться. Отдельная команда RETS восстанавливает указатель стека при возврате (просто RET не восстанавливает). Это позволяет при вызове слова положить на стек несколько чисел, и обращения к ним всегда будут выполняться командами 0 ARG@ 1 ARG@ 2 ARG@ и т.д. - Прямая адресация стека через PICK/POKE, относительно текущей вершины. Текущая система команд: Код: constant cmdNOP : integer := 0; constant cmdRET : integer := 1; constant cmdRETS : integer := 2; -- return with stack frame restore constant cmdRETI : integer := 3; -- return from interrupt constant cmdLOOP : integer := 4; constant cmdNOT : integer := 16; -- 0x10 constant cmdSHL : integer := 17; -- 0x11 constant cmdSHR : integer := 18; -- 0x12 constant cmdSHRA : integer := 19; -- 0x13 constant cmdINPORT : integer := 20; -- 0x14 constant cmdSWAP : integer := 21; -- 0x15 constant cmdSHL8 : integer := 22; -- 0x16 constant cmdSHR8 : integer := 23; -- 0x17 constant cmdSYSREG : integer := 24; -- 0x18 -- +1 stack DEPTH constant cmdDUP : integer := 32; -- 0x20 constant cmdOVER : integer := 33; -- 0x21 constant cmdFROMR : integer := 34; -- 0x22 constant cmdSAVEA : integer := 35; -- 0x23 constant cmdSAVEB : integer := 36; -- 0x24 constant cmdI : integer := 37; -- 0x24 -- -1 stack DEPTH constant cmdPLUS : integer := 64; -- 0x40 constant cmdMINUS : integer := 65; constant cmdAND : integer := 66; constant cmdOR : integer := 67; constant cmdXOR : integer := 68; constant cmdEQUAL : integer := 69; constant cmdULESS : integer := 70; constant cmdUGREATER : integer := 71; constant cmdMULT : integer := 72; constant cmdDROP : integer := 80; -- 0x50 constant cmdJMP : integer := 81; -- 0x51 constant cmdCALL : integer := 82; -- 0x52 constant cmdRJMP : integer := 83; -- 0x53 constant cmdTOR : integer := 84; -- 0x54 constant cmdFETCH : integer := 85; -- 0x55 constant cmdPICK : integer := 86; constant cmdARGFETCH : integer := 87; -- -2 stack DEPTH constant cmdSTORE : integer := 96; constant cmdOUTPORT : integer := 97; constant cmdARGSTORE : integer := 98; constant cmdDO : integer := 99; constant cmdRIF : integer := 100; constant cmdUNTIL : integer := 101; Самое главное - результаты. Во-первых, от 1400 LUT новое ядро откатилось на 1000-1050. Тактовая частота: Spartan-6 (было 80 МГц) - 95 - 100 МГц Kintex-7 (было 180) - 333 МГц (!) Последняя цифра при отключении стека циклов увеличивается до 375 МГц, с отдельными вариантами настроек поднималось до 400! А вот MicroBlaze, по последним данным, выше 332 МГц не поднимается, причем для этого требуется 5-ступенчатый конвейер. Вобщем, я доволен В целом результат от оптимизации кода под 7-ю серию FPGA существенно превысил ожидания. Влияние слабее выражено для более простых Spartan-6, но те моменты, на которые Xilinx указывает для серии 7, сработали в полной мере. При этом сохраняется совместимость по исходным текстам Форта с предыдущим ядром, а пригодность к выполнению ЯВУ-ориентированного кода существенно улучшилась. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |