今天在 GitHub 上看到一個(gè) C 語言項(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文章
1416瀏覽量
41447 -
cpu
+關(guān)注
關(guān)注
68文章
11080瀏覽量
217152 -
ANSI
+關(guān)注
關(guān)注
0文章
29瀏覽量
20779 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
14788 -
RISC-V
+關(guān)注
關(guān)注
46文章
2574瀏覽量
48859
發(fā)布評(píng)論請(qǐng)先 登錄
64位RISC-V CPU發(fā)展現(xiàn)狀和未來前景
瑞薩電子推出64位RISC-V CPU內(nèi)核RZ/Five通用MPU,開創(chuàng)RISC-V技術(shù)先河

瑞薩電子推出采用自研RISC-V CPU內(nèi)核的通用32位MCU
《RISC-V能否復(fù)制Linux 的成功?》
為什么選擇RISC-V?
RISC-V MCU開發(fā) (一):集成開發(fā)環(huán)境
如何實(shí)現(xiàn)一個(gè)RISC-V內(nèi)核架構(gòu)的芯片移植工作
RISC-V基礎(chǔ)知識(shí):模塊化開放式的ISA CISC和RISC代碼區(qū)別
Occamy RISC-V 前景如何
RISC-V MCU開發(fā) (六):代碼下載

RISC-V CPU調(diào)試機(jī)制的設(shè)計(jì)原理
TenstorrentInc首席CPU構(gòu)架師 練維漢:助力數(shù)字化升級(jí)的RISC-V AI 高性能CPU

評(píng)論