今天在 GitHub 上看到一個(gè) C 語(yǔ)言項(xiàng)目,用大約 600 行代碼實(shí)現(xiàn)了一個(gè) RISC-V CPU 核,甚為感嘆,分享一下。不管是學(xué)習(xí) C,還是學(xué)習(xí) RISC-V,這個(gè)項(xiàng)目都有非常高的學(xué)習(xí)價(jià)值,開源萬歲!
rv
用 ANSI C 編寫的 RISC-V CPU 內(nèi)核。
特征:
- RV32IMC 用戶級(jí)實(shí)現(xiàn)
- 通過 riscv 測(cè)試中所有支持的測(cè)試
- ~600 行代碼
- 不使用任何大于 32 位的整數(shù)類型,即使對(duì)于乘法也是如此
- 簡(jiǎn)單 API(兩個(gè)函數(shù),加上您提供的兩個(gè)內(nèi)存回調(diào)函數(shù))
- 無內(nèi)存分配
應(yīng)用程序接口
/* Memory access callbacks: data is input/output, return RV_BAD on fault, 0 otherwise */
typedef rv_res (*rv_store_cb)(void *user, rv_u32 addr, rv_u8 data);
typedef rv_res (*rv_load_cb)(void *user, rv_u32 addr, rv_u8 *data);
/* Initialize CPU. */
void rv_init(rv *cpu, void *user, rv_load_cb load_cb, rv_store_cb store_cb);
/* Single-step CPU. Returns 0 on success, one of RV_E* on exception. */
rv_u32 rv_step(rv *cpu);
用法
#include < stdio.h >
#include < string.h >
#include "rv.h"
rv_res load_cb(void *user, rv_u32 addr, rv_u8 *data) {
if (addr - 0x80000000 > 0x10000) /* Reset vector is 0x80000000 */
return RV_BAD;
*data = ((rv_u8 *)(user))[addr - 0x80000000];
return RV_OK;
}
rv_res store_cb(void *user, rv_u32 addr, rv_u8 data) {
if (addr - 0x80000000 > 0x10000)
return RV_BAD;
((rv_u8 *)(user))[addr - 0x80000000] = data;
return RV_OK;
}
rv_u32 program[2] = {
/* _start: */
0x02A88893, /* add a7, a7, 42 */
0x00000073 /* ecall */
};
int main(void) {
rv_u8 mem[0x10000];
rv cpu;
rv_init(&cpu, (void *)mem, &load_cb, &store_cb);
memcpy((void *)mem, (void *)program, sizeof(program));
while (rv_step(&cpu) != RV_EECALL) {
}
printf("Environment call @ %08X: %un", cpu.pc, cpu.r[17]);
return 0;
}
為rv
編譯程序
使用 riscv-gnu-toolchain工具鏈和 rv 鏈接腳本 。
建議使用gcc
命令行:
riscv64-unknown-elf-gcc example.S -nostdlib -nostartfiles -Tlink.ld -march=rv32imc -mabi=ilp32 -o example.o -e _start -g -no-pie
然后用 obj 工具將0x80000000
起始的二進(jìn)制代碼生成能被rv
加載的二進(jìn)制文件:
riscv64-unknown-elf-objcopy -g -O binary example.o example.bin
支持的指令列表
參見 支持指令列表。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1336瀏覽量
40081 -
cpu
+關(guān)注
關(guān)注
68文章
10696瀏覽量
209298 -
ANSI
+關(guān)注
關(guān)注
0文章
28瀏覽量
20500 -
C代碼
+關(guān)注
關(guān)注
1文章
89瀏覽量
14237 -
RISC-V
+關(guān)注
關(guān)注
44文章
2141瀏覽量
45702
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論