今天在 GitHub 上看到一个 C 语言项目,用大约 600 行代码实现了一个 RISC-V CPU 核,甚为感叹,分享一下。不管是学习 C,还是学习 RISC-V,这个项目都有非常高的学习价值,开源万岁!
rv
用 ANSI C 编写的 RISC-V CPU 内核。
特征:
- RV32IMC 用户级实现
- 通过 riscv 测试中所有支持的测试
- ~600 行代码
- 不使用任何大于 32 位的整数类型,即使对于乘法也是如此
- 简单 API(两个函数,加上您提供的两个内存回调函数)
- 无内存分配
应用程序接口
/* 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
支持的指令列表
参见 支持指令列表。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
内核
+关注
关注
3文章
1372浏览量
40272 -
cpu
+关注
关注
68文章
10850浏览量
211523 -
ANSI
+关注
关注
0文章
28浏览量
20530 -
C代码
+关注
关注
1文章
89浏览量
14297 -
RISC-V
+关注
关注
44文章
2267浏览量
46115
发布评论请先 登录
相关推荐
64位RISC-V CPU发展现状和未来前景
RISC-V CPU发展情况 实际上,目前RISC-V已经开始64位CPU的研发,也已经有相关内核和产品面市,比如平头哥64位
瑞萨电子推出64位RISC-V CPU内核RZ/Five通用MPU,开创RISC-V技术先河
瑞萨电子今日宣布,推出基于64位RISC-V CPU内核的RZ/Five通用微处理器(MPU)——RZ/Five采用Andes AX45MP,基于RISC-V
发表于 03-01 13:54
•1429次阅读
瑞萨电子推出采用自研RISC-V CPU内核的通用32位MCU
2024 年 3 月 26 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子(TSE:6723)今日宣布率先在业内推出基于内部自研CPU内核构建的通用32位RISC-V微控制器(MCU
发表于 03-30 22:08
RISC-V MCU开发 (一):集成开发环境
近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。 工欲善其事必先利其器,要想实现
发表于 09-22 14:44
如何实现一个RISC-V内核架构的芯片移植工作
使用 common 文件夹中的任务切换代码RT-Thread RISC-V 内核移植 API 实现内核移植的主要工作内容,主要就是
发表于 03-25 10:11
RISC-V基础知识:模块化开放式的ISA CISC和RISC代码区别
/ti/)TIonal— 一个开放的 ISARISC-V是一种开放式指令集架构(ISA),这意味着您可以自由地在微处理器或微控制器中实现RISC-V CPU,而无需向任何人支付使用此I
发表于 12-23 17:51
第一届RISC-V中国峰会看点 risc-v开发要怎么优化risc-v指令集架构代码密度
在第一届RISC-V中国峰会上看点很多,RISC-V是开源的,那么代码密度要怎么控制,会不会因为开源而导致代码密度特别大? 我们一起来看看risc-
发表于 06-23 18:22
•9673次阅读
RISC-V MCU开发 (六):代码下载
、CH58x、CH32Fx、CH32Vx等RISC-V/ARM内核MCU工程的代码下载功能。其中,对于CH56x、CH57x、CH58x等型号,MRS还支持关闭两线仿真调试接口功能;对于CH32Fx、CH32Vx型号,MRS支持
发表于 12-02 09:06
•11次下载
TenstorrentInc首席CPU构架师 练维汉:助力数字化升级的RISC-V AI 高性能CPU
”,曾在水果公司作CPU的架构设计师。练维汉除介绍RISC-V内核的高性能 CPU IP内核技术之外,也对近期热门的
新闻快讯 | 瑞萨推出第一代32位RISC-V CPU内核
新闻快讯 全球半导体解决方案供应商瑞萨电子(TSE:6723)宣布成功设计、测试并推出基于开放标准RISC-V指令集架构(ISA)的32位CPU内核。瑞萨作为业内首个为32位通用RISC-V
瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局
瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局 RISC-V MCU为开发人员带来低功耗、高性能的
发表于 03-28 19:00
•571次阅读
评论