Померял скорость в вериляторе (который компилирует верилог в си++) - получилось, что за секунду моя модель 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: Select all
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):
Code: Select all
Instructions Stat:
LUI = 892
AUIPC = 7716
JAL = 11212
JALR = 12850
BEQ = 33399
BNE = 11298
BLT = 1721
BGE = 3480
BLTU = 7017
BGEU = 2248
LW = 31050
LBU = 27712
LHU = 502
SB = 4968
SH = 502
SW = 33037
ADDI = 87830
SLTIU = 1500
XORI = 1
ORI = 1
ANDI = 6151
SLLI = 10647
SRLI = 9534
SRAI = 95
ADD = 11486
SUB = 2813
SLL = 402
SLTU = 1844
SRL = 353
OR = 2459
CSRRW = 1
CSRRS = 8
LI* = 20602
Five Most Frequent:
1) ADDI = 87830 (27.05%)
2) BEQ = 33399 (10.29%)
3) SW = 33037 (10.17%)
4) LW = 31050 (9.56%)
5) LBU = 27712 (8.53%)
Memory Reading Area 80000000...80007ae2
Memory Writing Area 80001000...80007b3f
>>> Execution time: 1425296449 ns
>>> Instruction count: 324730 (IPS=227833)
>>> Jumps: 50209 (15.46%) - 18074 forwards, 32135 backwards
>>> Branching T=26147 (44.19%) F=33016 (55.81%)
надо прикинуть CPI (Cycles Per Instruction) в Retro-V:
обычно инструкции занимают в Retro-V 4 такта, но передача управления - 5, а тут это происходило в 15.46% инструкций, т.е. 15.46% команд выполнялся 5 тактов
далее
SW = 33037 (10.17%) - 9 тактов
SH = 502 (0.15%) - 7 тактов
SB = 4968 (1.5%) - 6 тактов
LW = 31050 (9.56%) - 8 тактов
LHU = 502 (0.15%) - 6 тактов
LBU = 27712 (8.53%) - 5 тактов
можно пренебречь теми что меньше 1 процента, остаётся:
15.46% - 5 тактов
10.17% - 9 тактов
1.5% - 6 тактов
9.56% - 8 тактов
8.53% - 5 тактов
плюс оставшиеся
54.78% - 4 такта
получается 0.5478*4+0.0853*5+0.0956*8+0.015*6+0.1017*9+0.1546*5 =
5.1608 тактов на инструкцию в среднем (на примере теста Dhrystone)