Добил почти все тесты на совместимость - один никак не поддаётся
Code:
Check I-ADD-01 ... OK Check I-ADDI-01 ... OK Check I-AND-01 ... OK Check I-ANDI-01 ... OK Check I-AUIPC-01 ... OK Check I-BEQ-01 ... OK Check I-BGE-01 ... OK Check I-BGEU-01 ... OK Check I-BLT-01 ... OK Check I-BLTU-01 ... OK Check I-BNE-01 ... OK Check I-CSRRC-01 ... OK Check I-CSRRCI-01 ... OK Check I-CSRRS-01 ... OK Check I-CSRRSI-01 ... OK Check I-CSRRW-01 ... OK Check I-CSRRWI-01 ... OK Check I-DELAY_SLOTS-01 ... OK Check I-EBREAK-01 ... OK Check I-ECALL-01 ... OK Check I-ENDIANESS-01 ... OK Check I-FENCE.I-01 ... OK Check I-IO ... OK Check I-JAL-01 ... OK Check I-JALR-01 ... OK Check I-LB-01 ... OK Check I-LBU-01 ... OK Check I-LH-01 ... OK Check I-LHU-01 ... OK Check I-LUI-01 ... OK Check I-LW-01 ... OK Check I-MISALIGN_JMP-01 ... FAIL Check I-MISALIGN_LDST-01 ... OK Check I-NOP-01 ... OK Check I-OR-01 ... OK Check I-ORI-01 ... OK Check I-RF_size-01 ... OK Check I-RF_width-01 ... OK Check I-RF_x0-01 ... OK Check I-SB-01 ... OK Check I-SH-01 ... OK Check I-SLL-01 ... OK Check I-SLLI-01 ... OK Check I-SLT-01 ... OK Check I-SLTI-01 ... OK Check I-SLTIU-01 ... OK Check I-SLTU-01 ... OK Check I-SRA-01 ... OK Check I-SRAI-01 ... OK Check I-SRL-01 ... OK Check I-SRLI-01 ... OK Check I-SUB-01 ... OK Check I-SW-01 ... OK Check I-XOR-01 ... OK Check I-XORI-01 ... OK -------------------------------- FAIL: 1/55
UPDATE 22-NOV-2018: Первую версию компьютера (альфа) nedoPC-5-A планирую сделать вот на этой платке, что чуть ниже, которая имеет на борту FPGA iCE40 5K (с 5 тыщами лутов и 1 мегабитом блочной памяти), и назвать сей продукт "IceAge" Для FPGA надо будет написать на "Вырвиглотке" свою реализацию RISC-V (как минимум подсистемы RV32I) и назвать её скажем Retro-V, т.к. она будет давать людям возможность работать с этой платкой, как старым добрым микропроцессором - у платки будет внешняя шина адреса (16 бит) и данных (8 бит) с некоторым количеством управляющих сигналов (внутренняя память тоже возможно будет задействована, но там будет скажем подпрограммы для имитации команд работы с плавающей точкой RV32F и RV32D, которые будут вызываться по исключительному состоянию нелегального опкода ну и например графическая подсистема : )
Надо попробовать сделать шину данных у FPGA как ввод-вывод (чтобы на настоящий микропроцессор больше походило) вот по этому рецепту:
Ещё приобрёл UPDuino v1.0 - она всего за $7.99 продаётся т.к. без USB и с ошибками - как минимум надо 3 микрофарадных конденсатора припаять - 2 с лицевой стороны (как на фотке) и ещё один сзади на второй регулятор напряжения:
Attachment:
upduino_caps.jpg [ 33.01 KiB | Viewed 14320 times ]
Померял скорость в вериляторе (который компилирует верилог в си++) - получилось, что за секунду моя модель RISC-V (см. https://gitlab.com/shaos/retro-v) успевает пробежать 1.8 миллионов тактов, что я считаю ОЧЕНЬ неплохо (т.е. 1.8 МГц частота виртуального процессора - это при в 2 раза большем количестве шагов симуляции т.к. симулируется clk=1 и потом clk=0)
P.S. А на домашнем AMD64 серваке получилось аж 2.2 МГц!!!
P.P.S. Прогнал Dhrystone собранный для RISC-V на вериляторе через свою модель (поставив правильное значение HZ для измерения счётчика RDCYCLE, который используется в Dhrystone варианте для RISC-V):
Code:
Dhrystone Benchmark, Version C, Version 2.2 Program compiled without 'register' attribute Using rdcycle(), HZ=500000
Trying 500 runs through Dhrystone: Final values of the variables used in the benchmark:
Int_Glob: 5 should be: 5 Bool_Glob: 1 should be: 1 Ch_1_Glob: A should be: A Ch_2_Glob: B should be: B Arr_1_Glob[8]: 7 should be: 7 Arr_2_Glob[8][7]: 510 should be: Number_Of_Runs + 10 Ptr_Glob-> Ptr_Comp: -2147452480 should be: (implementation-dependent) Discr: 0 should be: 0 Enum_Comp: 2 should be: 2 Int_Comp: 17 should be: 17 Str_Comp: DHRYSTONE PROGRAM, SOME STRING should be: DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob-> Ptr_Comp: -2147452480 should be: (implementation-dependent), same as above Discr: 0 should be: 0 Enum_Comp: 1 should be: 1 Int_Comp: 18 should be: 18 Str_Comp: DHRYSTONE PROGRAM, SOME STRING should be: DHRYSTONE PROGRAM, SOME STRING Int_1_Loc: 5 should be: 5 Int_2_Loc: 13 should be: 13 Int_3_Loc: 7 should be: 7 Enum_Loc: 1 should be: 1 Str_1_Loc: DHRYSTONE PROGRAM, 1'ST STRING should be: DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc: DHRYSTONE PROGRAM, 2'ND STRING should be: DHRYSTONE PROGRAM, 2'ND STRING
Microseconds for one run through Dhrystone: 902 Dhrystones per Second: 1108 mcycle = 225523
что есть 1108 / 1757 = 0.63 DMIPS
Если симулируется 2 МГц, то у меня получается 0.63/2=0.315 DMIPS/MHz, что в 5.5 раз меньше официального RISC-V rocket core показателя в 1.72 DMIPS/MHz (см. https://riscv.org/2014/10/about-our-dhrystone-benchmarking-methodology/), что объяснимо, т.к. там вроде как инструкция на такт (а у меня инструкция на 4 такта).
Если мы будем запускать FPGA с тактовой частотой 25 МГц (предполагаемая максимальная частота по результатам синтеза в iCEcube2), то теоретически должно получиться 0.315*25=7.87 DMIPS
P.P.P.S. Статистика по использованию инструкций в Dhrystone такая (собрано 23 декабря 2018):
Сегодня исправил ошибку в картинке ниже - ногу 36 они неправильно назвали 35 т.е. на картинке как бы две ноги с именем 35 было - я полдня убил пока понял почему у меня не то этот выход показывает...
Attachments:
top_orientation.jpg [ 142.42 KiB | Viewed 14178 times ]
Logic Resource Utilization: --------------------------- Total Logic Cells: 2313/5280 Combinational Logic Cells: 1977 out of 5280 37.4432% Sequential Logic Cells: 336 out of 5280 6.36364% Logic Tiles: 342 out of 660 51.8182% Registers: Logic Registers: 336 out of 5280 6.36364% IO Registers: 0 out of 480 0 Block RAMs: 4 out of 30 13.3333% Warm Boots: 0 out of 1 0% SPIs: 0 out of 2 0% I2Cs: 0 out of 2 0% HFOSCs: 1 out of 1 100% LFOSCs: 0 out of 1 0% RGBA_DRVs: 1 out of 1 100% LEDDA_IPs: 0 out of 1 0% DSPs: 0 out of 8 0% SPRAMs: 0 out of 4 0% FILTER_50NSs: 0 out of 2 0% Pins: Input Pins: 0 out of 39 0% Output Pins: 25 out of 39 64.1026% InOut Pins: 0 out of 39 0% Global Buffers: 5 out of 8 62.5% PLLs: 0 out of 1 0%
IO Bank Utilization: -------------------- Bank 3: 0 out of 0 0% Bank 1: 0 out of 0 0% Bank 0: 13 out of 17 76.4706% Bank 2: 12 out of 22 54.5455%
Теперь надо приладить вывод в последовательный порт со скоростью 115200 например, а пока символ выводится побитно процык надо тормозить - в таком случае можно будет на максимальной скорости гнать вычисления и спать в процессе вывода на терминал...
P.S. Далее можно будет включить внутреннюю память FPGA как ОЗУ и написать небольшую программку во встроенном ПЗУ, которая бы позволяла загонять пользовательский код в ОЗУ и запускать его на исполнение - в этом случае можно сказать уже полноценный компьютер получится...
RGB на такой частоте просто белым светит, ну да ладно - пусть остаётся...
RS232 посылальщик когда получает букву для отправки, выставляет сигнал "busy", который ставит Retro-V ЦПУ в режим "hold", пока буква не отправится, а так процык работает на 12 МГц и печатает в терминале это:
P.S. Заметки на полях: ROM с программой "Hello RISC-V" занимает 196 LUTs Barrel Shifter (выполняющий 32-битный сдвиг на любое количество бит за 1 такт) занимает 727 LUTs А всё вместе:
Code:
Final Design Statistics Number of LUTs : 2301 Number of DFFs : 340 Number of DFFs packed to IO : 0 Number of Carrys : 281 Number of RAMs : 4 Number of ROMs : 0 Number of IOs : 1 Number of GBIOs : 1 Number of GBs : 4 Number of WarmBoot : 0 Number of PLLs : 0 Number of I2Cs : 0 Number of SPIs : 0 Number of DSPs : 0 Number of SBIOODs : 0 Number of LEDDAIPs : 0 Number of RGBADRVs : 1 Number of LFOSCs : 0 Number of HFOSCs : 0 Number of FILTER_50NSs : 0 Number of SPRAMs : 0 Device Utilization Summary LogicCells : 2393/5280 PLBs : 357/660 BRAMs : 4/30 IOs and GBIOs : 2/36 PLLs : 0/1 I2Cs : 0/2 SPIs : 0/2 DSPs : 0/8 SBIOODs : 0/3 RGBADRVs : 1/1 LEDDAIPs : 0/1 LFOSCs : 0/1 HFOSCs : 0/1 SPRAMs : 0/4 FILTER50NSs : 0/2
т.е. если я смогу сделать шифтер покомпактее (размазав вычисления на несколько тактов), то ядро Retro-V без системных регистров и трапов (как сейчас) может уместиться в 1.5K LUT-ов...
Вот на всякий случай диалог создания нового проекта в iCEcube2 для UPDuino - надо Device Package поставить в SG48 и напряжение в банках IO выбрать 3.3V:
Attachments:
iCEcube2-new.png [ 44.28 KiB | Viewed 13911 times ]
Подцепил вот такую штуку (их в чипе четыре) - команды LOAD и STORE вроде работают (clock правда пришлось инвертировать, чтобы читало адрес когда надо):
Attachment:
SB_SPRAM256KA.gif [ 111.66 KiB | Viewed 13898 times ]
тут как бы 2 памяти живут - ROM для стартовой программы (xxx10000) и RAM для данных (xxx00000) - выбирается 17м битом адреса (address[16]) может ли код запускаться из этого RAM пока незнаю - у меня STORE/LOAD и FETCH в Retro-V работают в противофазе...
Теперь надо бы запись в память сделать по RS-232 и запуск с произвольного адреса...
P.S. Например по адресу 0xFFFFFFFE можно будет программно проверять не пришёл ли символ (0 - не пришёл), а по адресу 0xFFFFFFFF - забирать код пришедшего символа:
При частоте 12 МГц и скорости 115200 у нас будет больше тысячи тактов (это больше 200 инструкций), чтобы забрать пришедший символ, пока приёмник не принял следующий из RS-232
Users browsing this forum: No registered users and 79 guests
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum