0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用ANSI C代码实现RISC-V CPU内核

CHANBAEK 来源: FunIO 作者: FunIO 2023-07-23 11:02 次阅读

今天在 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

    文章

    1362

    浏览量

    40196
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10816

    浏览量

    210928
  • ANSI
    +关注

    关注

    0

    文章

    28

    浏览量

    20517
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14271
  • RISC-V
    +关注

    关注

    44

    文章

    2218

    浏览量

    45972
收藏 人收藏

    评论

    相关推荐

    64位RISC-V CPU发展现状和未来前景

    RISC-V CPU发展情况 实际上,目前RISC-V已经开始64位CPU的研发,也已经有相关内核和产品面市,比如平头哥64位
    的头像 发表于 07-22 07:59 3961次阅读

    瑞萨电子推出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 1398次阅读
    瑞萨电子推出64位<b class='flag-5'>RISC-V</b> <b class='flag-5'>CPU</b><b class='flag-5'>内核</b>RZ/Five通用MPU,开创<b class='flag-5'>RISC-V</b>技术先河

    瑞萨电子推出采用自研RISC-V CPU内核的通用32位MCU

    2024 年 3 月 26 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子(TSE:6723)今日宣布率先在业内推出基于内部自研CPU内核构建的通用32位RISC-V微控制器(MCU
    发表于 03-30 22:08

    为什么选择RISC-V

    。例如,如果工程师在FPGA中实现RISC-V内核,则通常可以使用RTL源代码。由于RISC-V免版税,这为将基于
    发表于 07-27 17:38

    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产业及生态发展,CPU创新应用,能为大众所用。
    的头像 发表于 06-22 11:28 2931次阅读
    <b class='flag-5'>RISC-V</b>中国峰会:<b class='flag-5'>RISC-V</b>产业及生态发展

    第一届RISC-V中国峰会看点 risc-v开发要怎么优化risc-v指令集架构代码密度

    在第一届RISC-V中国峰会上看点很多,RISC-V是开源的,那么代码密度要怎么控制,会不会因为开源而导致代码密度特别大? 我们一起来看看risc-
    发表于 06-23 18:22 9641次阅读
    第一届<b class='flag-5'>RISC-V</b>中国峰会看点 <b class='flag-5'>risc-v</b>开发要怎么优化<b class='flag-5'>risc-v</b>指令集架构<b class='flag-5'>代码</b>密度

    RISC-V MCU开发 (六):代码下载

    、CH58x、CH32Fx、CH32Vx等RISC-V/ARM内核MCU工程的代码下载功能。其中,对于CH56x、CH57x、CH58x等型号,MRS还支持关闭两线仿真调试接口功能;对于CH32Fx、CH32Vx型号,MRS支持
    发表于 12-02 09:06 11次下载
    <b class='flag-5'>RISC-V</b> MCU开发 (六):<b class='flag-5'>代码</b>下载

    RISC-V CPU调试机制的设计原理

    本文将详细介绍RISC-V CPU调试机制的设计原理。
    发表于 10-18 09:19 2152次阅读

    TenstorrentInc首席CPU构架师 练维汉:助力数字化升级的RISC-V AI 高性能CPU

    ”,曾在水果公司作CPU的架构设计师。练维汉除介绍RISC-V内核的高性能 CPU IP内核技术之外,也对近期热门的
    的头像 发表于 08-28 12:05 3468次阅读
    TenstorrentInc首席<b class='flag-5'>CPU</b>构架师 练维汉:助力数字化升级的<b class='flag-5'>RISC-V</b> AI 高性能<b class='flag-5'>CPU</b>

    内核架构意义凸显,RISC-V现新机.zip

    内核架构意义凸显,RISC-V现新机
    发表于 01-13 09:06 2次下载

    新闻快讯 | 瑞萨推出第一代32位RISC-V CPU内核

    新闻快讯 全球半导体解决方案供应商瑞萨电子(TSE:6723)宣布成功设计、测试并推出基于开放标准RISC-V指令集架构(ISA)的32位CPU内核。瑞萨作为业内首个为32位通用RISC-V
    的头像 发表于 12-08 11:40 522次阅读

    瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局

    瑞萨推出采用自研CPU内核的通用32位RISC-V MCU 加强RISC-V生态系统布局 RISC-V MCU为开发人员带来低功耗、高性能的
    发表于 03-28 19:00 493次阅读