今天在 GitHub 上看到一個 C 語言項目,用大約 600 行代碼實現(xiàn)了一個 RISC-V CPU 核,甚為感嘆,分享一下。不管是學(xué)習(xí) C,還是學(xué)習(xí) RISC-V,這個項目都有非常高的學(xué)習(xí)價值,開源萬歲!
rv
用 ANSI C 編寫的 RISC-V CPU 內(nèi)核。
特征:
- RV32IMC 用戶級實現(xiàn)
- 通過 riscv 測試中所有支持的測試
- ~600 行代碼
- 不使用任何大于 32 位的整數(shù)類型,即使對于乘法也是如此
- 簡單 API(兩個函數(shù),加上您提供的兩個內(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
起始的二進制代碼生成能被rv
加載的二進制文件:
riscv64-unknown-elf-objcopy -g -O binary example.o example.bin
支持的指令列表
參見 支持指令列表。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1413瀏覽量
41208 -
cpu
+關(guān)注
關(guān)注
68文章
11057瀏覽量
216374 -
ANSI
+關(guān)注
關(guān)注
0文章
29瀏覽量
20746 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
14713 -
RISC-V
+關(guān)注
關(guān)注
46文章
2518瀏覽量
48450
發(fā)布評論請先 登錄
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)境
如何實現(xiàn)一個RISC-V內(nèi)核架構(gòu)的芯片移植工作
RISC-V基礎(chǔ)知識:模塊化開放式的ISA CISC和RISC代碼區(qū)別
第一屆RISC-V中國峰會看點 risc-v開發(fā)要怎么優(yōu)化risc-v指令集架構(gòu)代碼密度

RISC-V MCU開發(fā) (六):代碼下載

TenstorrentInc首席CPU構(gòu)架師 練維漢:助力數(shù)字化升級的RISC-V AI 高性能CPU

評論