Project

General

Profile

Функциональная модель

Added by Natalia_multiclet over 11 years ago

Обсуждение, предложения, замечания


Replies (14)

RE: Функциональная модель - Added by qewerty over 11 years ago

Можете прояснить ситуацию? Какая-то проблема с размещением значений в памяти данных либо я чего-то недопонимаю.

Исходник:

int x = 0x47;
int y = 0x23;
int z;

void main()
{
    int r;
    z = x + y;
    r = z * z;
}

Makefile:

1.b: 1.o
    mc-ld -M -o1.b ${PATH_TO_MULTICLET_SDK}/lib/MCp0411100101/crt0.o 1.o

1.i: 1.c
    mc-mcpp 1.c 1.i

1.s: 1.i
    mc-rcc -target=mcp 1.i 1.s

1.o: 1.s
    mc-as --arch=MCp0411100101 1.s -o1.o

clean:
    rm *.o *.i *.s 1.b

Вывод линковщика:

File 1.o
    section .text
    LOCAL  main.P0                                 0x00000074
    LOCAL  main.P1                                 0x00000075
    LOCAL  main.P2                                 0x00000077
    LOCAL  main.P3                                 0x00000078
    LOCAL  main.1L                                 0x0000007B
    LOCAL  main.P4                                 0x0000007A
    LOCAL  main.PF                                 0x0000007B
    GLOBAL main                                    0x00000072

    section .data
    GLOBAL x                                       0x00000088
    GLOBAL y                                       0x0000008C

    section .bss
    GLOBAL z                                       0x00000090

Т.е. переменная x расположена по адресу 0x00000088, а y по адресу 0x0000008C. Однако вывод mc-model такой:

Команда: mc-model -dump-raw -dump-addr -dump-byte -dump-length 4 -dump-from 0x00000088 1.b

00000088 : 00 00 00 00
0000008C : 47 00 00 00

Т.е. по адресу 0x00000088 расположен 0, а по адресу то, что должно быть по 0x00000088. Далее в памяти ничего нет, по крайней мере ничего не выводится.

Если запустить модель так: mc-model -inst-asm -inst-strange -dump-raw -dump-addr -dump-byte -dump-length 4 -dump-from 0x00000088 1.b

То можно увидеть параграф:

0.0000000000000077 <= 0000000000000090, 0000000000000077 :  jmp    0x77
0.0000000000000047 <= 0000000000000090, 000000000000008c :  rdsl   0x8C
1.0000000000000000 <= 0000000000000090, 0000000000000088 :  rdsl   0x88 
0.0000000000000047 <= 0000000000000000, 0000000000000047 :  addsl  @1, @2 ; <--- вот тут видно, что считалось в коммутатор из этих адресов
0.0000000000000047 <= 0000000000000000, 000000000001ffec :  rdl    #BP(38), 0xFFFFFFF8
0.0000000000000047 <= 0000000000000047, 0000000000000000 :  wrsl   @2, @1

Где действительно по адресу 0x8C лежит 0x47 и ноль по адресу 0x88.

Забавно, что в hex-редакторе в конечном бинарнике видно оба числа (0x47 и 0x23) друг за другом.

RE: Функциональная модель - Added by krufter_multiclet over 11 years ago

У меня вот такая картина:

0.0000000000000077 <= 0000000000000090, 0000000000000077 :  jmp    0x77
0.0000000000000023 <= 0000000000000090, 000000000000008c :  rdsl   0x8C
0.0000000000000047 <= 0000000000000090, 0000000000000088 :  rdsl   0x88
0.000000000000006a <= 0000000000000047, 0000000000000023 :  addsl  @1, @2
0.0000000000000090 <= 0000000000000047, 000000000001ffec :  rdl    #BP(38), 0xFFFFFFF8
0.0000000000000090 <= 000000000000006a, 0000000000000090 :  wrsl   @2, @1

У вас последние версии ассемблера, линковщика?

Могу завтра проверить что выдаст плата в результате.

P.S. Постараюсь побыстрее закончить страничку использования отладчика. С моделью я так понимаю вы разобрались.

RE: Функциональная модель - Added by qewerty over 11 years ago

Сверил (дата/время и дифф) то, что у меня c тем, что сейчас для Linux здесь - http://multiclet.com/index.php/ru/support/technical-documents

Одно и тоже от 14 июня. Не думаю, что есть смысл проверять на плате. Слишком примитивный пример. Инструменты запускаю на Ubuntu 12.04 64-bit. Попробую ещё на 32-bit и на Windows.

RE: Функциональная модель - Added by krufter_multiclet over 11 years ago

Попробуйте вот эти набором собрать. Я собирал под Windows, над под Ubuntu собрать.

tools.7z (1010 KB) tools.7z набор

RE: Функциональная модель - Added by qewerty over 11 years ago

Спасибо! Попробую чуть позже. То, что на сайте скачать предлагается, проверил и на Ubuntu 32-bit и на Windows XP - та же самая проблема.

RE: Функциональная модель - Added by qewerty over 11 years ago

Да, с этими работает. Запускал в wine, всё отлично. Проблема в as и ld одновременно, замена чего-то одного не помогает. Остальные тулзы работают и из старой сборки, даже старая mc-model корректно выполняет их результат.

Получается, SDK, которое лежит у вас тут на сайте (http://multiclet.com/index.php/ru/support/technical-documents), сломаное.

RE: Функциональная модель - Added by krufter_multiclet over 11 years ago

Поправили линковщик SDK, теперь всё должно работать.

RE: Функциональная модель - Added by sprin over 11 years ago

Здравствуйте.

В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для команды "wr" написано, что если второй аргумент записан в виде "@S", то игнорируются с 32 по 63 разряды.
Что-то не хочет работать:

Пример

Show

Использую: MultiCletSDK_ru.20130814.exe

RE: Функциональная модель - Added by krufter_multiclet over 11 years ago

На плате всё отрабатывается верно, сейчас посмотрим вывод модели.

RE: Функциональная модель - Added by sprin over 11 years ago

По поводу "wr" в функциональной модели.

Сделал пример (см. ниже).

В процессе выяснилось что:
  • get(q,l,b...) берёт 64 бита не зависимо от модификатора для аргумента типа IR
  • В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" указано, что можно использовать GPR, но выдаёт ошибку " error: invalid register type for operation 'wr...' "
  • В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" надо уточнить момент, что у второго аргумента берутся только первые 4 байта (в описании написано только про "@S", а про регистры неясно)
  • В "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" для "wr" указано, что если второй аргумент "@S"(ссылка на коммутатор), то из него берутся только первые 32 бита, но в функциональной модели берётся больше чем 32 бита.

Пример: TestWR

Show

RE: Функциональная модель - Added by krufter_multiclet over 11 years ago

l8 :=    getl    #32    ; <-!!! берёт не 4, а 8 байт

Команда get при работе с индексными регистрами всегда получает 8 байт, в новом процессоре команда get будет работать с индексными регистрами согласно типам команд.

 wrq    @l0, #3        ;выдаёт ошибку " error: invalid register type for operation 'wrq' " 

Поправили, скоро выложим новый ассемблер.

 wrq    @l7, @l4    ; <-!!! из @l4 берёт не 32, а 64 бита

Поправили модель, запись проходит по адресу в 32-х младших разрядах.

RE: Функциональная модель - Added by Natalia_multiclet about 11 years ago

Выложили на сайт обновленное "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО" - http://www.multiclet.com/index.php/ru/support/technical-documents

RE: Функциональная модель - Added by sprin about 11 years ago

1. Прошу прояснить пару моментов (так и должно работать как сейчас работает или нет, + желательно упомянуть в "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО"):
  • Мне казалось, что логика работы "slr"(b, l) следующая:

1. Берём 1 или 4 байта
2. Сдвигаем на количество указанное во втором аргументе
3. Записываем результат в коммутатор 1 или 4 байта (остальное заполняется нулями)

но по модели выходит следующее:

1. Берём 8 байт
2. из п.1 сдвигаем на количество указанное во втором аргументе в первом или 1-4 байтах
3. Записываем результат в коммутатор из п.2

...
0.499602d249960200 <= 499602d2499602d2, 0000000000000008 :  slrb   @5, 0x8
0.499602d200004996 <= 499602d2499602d2, 0000000000000010 :  slrl   @6, 0x10
0.499602d200000049 <= 499602d2499602d2, 0000000000000018 :  slrl   @7, 0x18
...
  • Аналогично с "add"(b, l)
...
8.499602d2499602d2 <= 499602d200000000, 00000000499602d2 :  addl   @1, 0x499602D2
...

2. По поводу функциональной модели:
  • Падает при попытке выполнить код типа: "or @S, #IR" или "and @S, #IR" (Пример ниже)
  • Поправьте, пожалуйста, вывод для команд с одним аргументом:

krufter_multiclet wrote:

Выводит два аргумента команды и полученное в коммутаторе значение, после выполнения команды.
8.00000000bf800000 <= 003e000077c1c024, 00000000ffffffff : cslf 0xFFFFFFFF

00000000bf800000 - значение в коммутаторе после операции cslf, 003e000077c1c024 - мусор в первом аргумента(должен быть ноль раз команда имеет только один аргумент - скоро поправим и будет 0), 00000000ffffffff - второй аргумент (значение аргумента одноаргументной команды помещается во второй аргумент); cslf 0xFFFFFFFF - команда с аргументом


3. По поводу "РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ. ПО для P1"
  • Для "and" и "or" мне кажется надо уточнить, что операция всегда производится над 64 битами (@S1) и возвращает 64 бит вне зависимости от размерности второго аргумента, а для "V8,32" старшие 32 разряда (с 32 по 63) заполняются нулями.
  • Для "wr" лучше написать короче и понятнее: "Во втором аргументе (ARG2), используются только первые 32 бита для всех доступных реализаций в команде (вне зависимости от типа ARG2), старшие 32 разряда (с 32 по 63) игнорируются". Или что-то вроде этого.
  • Для "get" надо поправить пример, для IR и CR там указан оператор с "l", а надо "q" (согласно схеме), и теоретически компилятор должен вывести ошибку (надеюсь этот момент учтут в следующих релизах компилятора).

Пример

Show


RE: Функциональная модель - Added by krufter_multiclet about 11 years ago

1) Из коммутатора берутся 64 бита и дальше сдвигаются в зависимости от типа, старшие биты нулями не заполняются.
2) Модель поправим
3) Документацию проверим и поправим в ближайшее время, спасибо.

    (1-14/14)