|
|
  |
Свои процессоры, Разработка своих процессоров со своей системой команд |
|
|
|
May 26 2010, 12:36
|
Профессионал
    
Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118

|
Из: Код queens( int N ){ int count, arow[20], ... автоматически создается: Код int queens_return; queens_N; queens_count, queens_arow[20], ... queens(){ ... с соответствующим переименованием всех переменных. Все переменные стали глобальными, вызов "cnt=queens(8);" преобразуется в: Код queens_N=8; queens(); cnt=queens_return; И так для всех подпрограмм. Если не хватит ~1К адресного пространства для всех таких переменных, тогда только и придется организовывать программное сохранение/восстановление контеста, и тп - для некритичного кода. И вовсе не обязательно сохранять/восстанвливать весь регистровый файл. Имхо, очень удобно для небольших систем без монстроидальных ОС.
Сообщение отредактировал Leka - May 26 2010, 12:39
|
|
|
|
|
May 26 2010, 17:40
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 26-05-05
Пользователь №: 5 422

|
Цитата(=AK= @ May 26 2010, 16:46)  Я в одной подпрограмме вызову другую, а она пропишет свои временные переменные поверх задействованных. Вот и придется вам весь код раскатать в плоский "блин", без подпрограмм (функций). Может я, конечно, чего не понимаю. Я пока не задавал глупых вопросов про служебные регистры, потому что думал рано. Но их в систему команд все равно придется вводить. К ним я планировал добавить "frame pointer" или как его там назвать. Компилятор знает сколько регистров надо зарезервировать для подпрограммы. При вызове подпрограммы во "frame pointer" записывается это значение (или добавляется к его содержимому). А дальше адрес регистров вычисляется в аппаратуре прибавлением текущего адреса к "frame pointer". При выходе из подпрограммы - вычитать это значение. Но что делать, если "frame pointer" перешагнет через максимальное число регистров? Тут я могу завести это событие на NMI или вызвать TRAP. Поправьте, если что-то недопонял. Николай.
Сообщение отредактировал Omen_13 - Jun 1 2010, 19:18
|
|
|
|
|
May 27 2010, 05:04
|
Профессионал
    
Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118

|
Гораздо проще придумать свой язык и компилятор к нему, чем делать компилятор к Си. Масса вопросов типа: Код main(){ a() || b() && c(); } В каком порядке будут вызываться функции a(), b(), c(), и почему?
Сообщение отредактировал Leka - May 27 2010, 05:04
|
|
|
|
|
May 27 2010, 08:08
|
Профессионал
    
Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118

|
Вся система команд с учетом архитектуры будет описываться в отдельном файле, в таком примерно формате: Код dddddddddddd += ssssssssssss 001 01000 dddddddddddd ssssssssssss dddddddddddd += kkkkkkkkkkkk 010 01000 kkkkkkkkkkkk dddddddddddd
dddddddddddd += hhhhhhhhhhhhhhhhhhhhkkkkkkkkkkkk 000 00101 xxxxhhhhhhhh hhhhhhhhhhhh 010 01000 kkkkkkkkkkkk dddddddddddd
* ssssssssssss = dddddddddddd 011 xx110 dddddddddddd ssssssssssss
dddddddddddd = * ssssssssssss 011 xx010 dddddddddddd ssssssssssss
dddddddddddd < ssssssssssss 001 00110 dddddddddddd ssssssssssss 110 x0100 pppppppppppp pppppppppppp ... Это избавит от необходимости переделывать компилятор с "ассемблерного" Си при изменениях в архитектуре (система и разрядность команд, число операндов, регистров, ...).
|
|
|
|
|
May 27 2010, 08:59
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(Leka @ May 26 2010, 22:41)  А нету временных переменных. Насколько мне известно, типичная программа на С в основном использует как раз таки временные переменные. Глобальных в программах немного, зато чуть не в каждой функции - несколько локальных: счетчик цикла, промежуточные результаты, и т.п. Вы предлагаете процессор, при использовании которого временных переменных вообще нет, все они сделаны глобальными. Соответственно, программы потребуют в несколько раз больше памяти данных. То есть, мало того, что ваш процессор неэффективен по использованию памяти программ (поскольку RISC), он, оказывается, и память данных (регистры) транжирит. По-моему, от таких архитектур давным-давно отказались, как от неэффективных. Я, кстати, свои первые программы писал для машины с 45-разрядными словами и 3-адресными командами. БЭСМ-4 называлась, чудо техники начала 60-х. Дежавю.
|
|
|
|
|
May 27 2010, 09:21
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 26-05-05
Пользователь №: 5 422

|
Цитата(Leka @ May 26 2010, 23:59)  Тогда регистры придется делить на локальные и глобальные, и делать мультиплексор(или что другое) на входе адреса. И сразу делать 3х-операндную архитектуру, тк для 2х-операндной такое не имеет смысла, имхо. Как обращаться к служебным регистрам из Си - еще не решил, важно обеспечить простоту отладки "ассемблерного" Си-кода на ПК со стандартным Си-компилятором (сам использую открытый Tiny C Compiler). Предлагайте варианты. Вообще то лучше сделать служебные регистры в виде сопроцессора как в MIPS32, и доступ к ним организовать через команды mtcp (move to coprocessor) и mfcp (move from coprocessor). А что касается компиляторов, то я дело имел только с LCC. И еще, меня никто не поправил насчет нового формата RI. Тут я ошибся (сказывается опыт работы с 3-х операндными командами). Для регистров есть только одно поле в команде, так что 2 регистра и смещение не могут быть в одной команде 2-х операндных инструкций. Описание нужно вернуть к версии 1.0.0. Николай. Цитата(=AK= @ May 27 2010, 12:59)  ваш процессор неэффективен по использованию памяти программ (поскольку RISC) Вы, наверно, имеете в виду процессоры с фиксированной длиной команд, а не RISC. Есть RISC-и с переменной длиной команд, где код используется эффективно. Но это (фиксированная длина команд) окупается простотой реализации. Николай.
|
|
|
|
|
May 27 2010, 09:31
|
Профессионал
    
Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118

|
Цитата(=AK= @ May 27 2010, 12:59)  ...Соответственно, программы потребуют в несколько раз больше памяти данных. На проценты, а не в разы, тк память данных - не только простые переменные и указатели, но и массивы, и в большинстве полезных программ основной объем данных приходится на массивы. А массивы хранятся не в регистровом файле. Цитата То есть, мало того, что ваш процессор неэффективен по использованию памяти программ (поскольку RISC), он, оказывается, и память данных (регистры) транжирит. По-моему, от таких архитектур давным-давно отказались, как от неэффективных. В ветке, где приводил пример программы N-ферзей на автокоде, предлагал сравнить эффективность архитектур на разных софт-процессорах - никто не откликнулся. Эффективность использования памяти программ гораздо сильнее зависит от качества кода, чем от разрядности команд. Пример - Tiny C Compiler, 100Кб кода против десятков Мб от других разработчиков. Удачное разбиение кода на маленькие подпрограммы - самый эффективный способ сжать код, поэтому важны малые издержки на вызовы пп. Например, у меня команда call совмещена с пересылкой регистр-регистр, а ret - c любой операцией алу: f(&a); - одна инструкция на вызов пп с передачей аргумента, f(int *a){ return *a >>= 8; } - одна инструкция на всю пп.
Сообщение отредактировал Leka - May 27 2010, 09:39
|
|
|
|
|
May 30 2010, 07:15
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 26-05-05
Пользователь №: 5 422

|
Ну вот, выкладываю первую версию процессора. Проект сделан в ACTIVE-HDL 8.2. На нем проще моделировать. На конечном этапе сделаю в ISE для Xilinx и в QuartusII для альтеры. Память программ и регистровый файл сделал пока поведенческими для быстроты моделирования. Программу проверки пишу в кодах (файл prg.txt). Оказалось не очень нудно, т.к. простые форматы команд. Отладил почти все условия ветвления в командах BRcc. АЛУ полностью пока не проверял (только частично в тестах BRcc). To Leka: В принципе, можно уже моделировать программу N-ферзей. Хорошо бы компилятор мог на выходе записывать текстовый файл (как prg.txt). Но это не обязательно. Я, наверно, смогу сам преобразовать из других форматов. И еще: В директории doc находится новая версия описания RF32. Николай.
Прикрепленные файлы
rf32.rar ( 297.38 килобайт )
Кол-во скачиваний: 81
|
|
|
|
|
  |
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|