Skip to content
/ xucpu Public

NSCSCC “龙芯杯” 2024 个人赛 LoongArch 赛道三等奖

License

Notifications You must be signed in to change notification settings

panxuc/xucpu

Repository files navigation

XuCPU

实现一个 32 位 LoongArch CPU,支持 LoongArch-C3 指令集的 25 条指令:ADDI.W, ADD.W, SUB.W, LU12I.W, PCADDU12I, OR, ORI, ANDI, AND, XOR, SRLI.W, SLLI.W, JIRL, B, BEQ, BNE, BL, ST.W, LD.W, ST.B, LD.B, MUL.W, SLTI, SRL.W, BLTU

该 CPU 为经典五级流水线 CPU,包括取指、译码、执行、访存和写回五个阶段;单发射,无 Cache,无分支预测,无乱序执行。

碍于笔者暑期时间有限且事务繁忙,投入龙芯杯个人赛开发的时间较少,该 CPU 表现一般,架构上也存在诸多可以改进的地方。希望后来者能借此有所启发。

项目结构

.
├── .ci-scripts/                        # CI 脚本(由发布包提供)
├── asm/                                # 决赛使用的汇编代码
├── judge/                              # 比赛使用的评测代码
├── thinpad_top.srcs/                   # Vivado 项目文件
│   ├── constrs_1/new/thinpad_top.xdc   # 约束文件
│   ├── sim_1/                          # 仿真所需文件(由发布包提供)
│   └── sources_1/                      # 源码文件
│       ├── ip/                         # IP 核(由 Vivado 自动生成)
│       ├── new/                        # Verilog 源码(由发布包提供)
│       └── xucpu/                      # XuCPU 源码
├── .gitignore                          # Git 忽略文件(由发布包提供)
├── .gitlab-ci.yml                      # GitLab CI 配置文件(由发布包提供)
├── .gitmodules                         # Git 子模块配置文件(由发布包提供)
├── LICENSE                             # 开源许可证(GPLv3)
├── README.md                           # 本文件
└── thinpad_top.xpr                     # Vivado 项目文件(由发布包提供)

Milestone

Freq STREAM MATRIX CRYPTONIGHT Final
50MHz 0.126s 0.197s 0.493s
55MHz 0.114s 0.179s 0.448s
56MHz 0.112s 0.176s 0.440s
57MHz 0.110s 0.173s 0.432s 0.097s

LoongArch 指令集

寄存器

编号 Normal Name LP64 Name
0x0 $r0 $zero
0x1 $r1 $ra
0x2 $r2 $tp
0x3 $r3 $sp
0x4 $r4 $a0
0x5 $r5 $a1
0x6 $r6 $a2
0x7 $r7 $a3
0x8 $r8 $a4
0x9 $r9 $a5
0xa $r10 $a6
0xb $r11 $a7
0xc $r12 $t0
0xd $r13 $t1
0xe $r14 $t2
0xf $r15 $t3
0x10 $r16 $t4
0x11 $r17 $t5
0x12 $r18 $t6
0x13 $r19 $t7
0x14 $r20 $t8
0x15 $r21 $x
0x16 $r22 $fp
0x17 $r23 $s0
0x18 $r24 $s1
0x19 $r25 $s2
0x1a $r26 $s3
0x1b $r27 $s4
0x1c $r28 $s5
0x1d $r29 $s6
0x1e $r30 $s7
0x1f $r31 $s8

指令码

指令码3130292827262524232221201918171615141312111009080706050403020100
ADDI.W0000001010si12rjrd
ADD.W00000000000100000rkrjrd
SUB.W00000000000100010rkrjrd
LU12I.W0001010si20rd
PCADDU12I0001110si20rd
OR00000000000101010rkrjrd
ORI0000001110si12rjrd
ANDI0000001101si12rjrd
AND00000000000101001rkrjrd
XOR00000000000101011rkrjrd
SRLI.W00000000010001001ui5rjrd
SLLI.W00000000010000001ui5rjrd
JIRL010011offs[15:0]rjrd
B010100offs[15:0]offs[25:16]
BEQ010110offs[15:0]rjrd
BNE010111offs[15:0]rjrd
BL011000offs[15:0]offs[25:16]
ST.W0010100110si12rjrd
LD.W0010100010si12rjrd
ST.B0010100100si12rjrd
LD.B0010100000si12rjrd
MUL.W00000000000111000rkrjrd
SLTI0000001000si12rjrd
SRL.W00000000000101111rkrjrd
BLTU011010offs[15:0]rjrd