docs: [AI] 更新项目记忆 (Phase 1-4 中断模型收尾 + 汇编器 char 字面量 bug + UART 异步 TX 教训) 21 个 test target 进度同步 固化两条复用性极高的坑: 自研汇编器 insn_size 对 #’c’ 立即数漏判致分支偏移错位; 异常 handler 内 bl 覆盖 LR/EXC_RETURN + UART TX 异步须轮询 REG_STAT 等完成
docs: [AI] 更新项目记忆 (Phase 1-4 中断模型收尾 + 汇编器 char 字面量 bug + UART 异步 TX 教训)
对标 Proteus 的 mini 版 MCU 仿真模拟器:多架构 CPU 指令级仿真 + 虚拟终端 + 虚拟屏幕。
momo-simulator 是一个用 C11 + xmake + SDL2 实现的教学/演示型 MCU 仿真器。它在单一进程内完成「取指-译码-执行」的指令级仿真,并通过引脚级网络表(netlist)把 CPU 与外设、虚拟器件互联,模拟 Proteus 风格的硬件电路仿真体验。
x0
mstatus/mie/mip/mtvec/mepc/mcause
*.net
tools/rv32asm.py
.bin
分层结构(自下而上):
src/core/ CPU(RV32)、内存、中断控制器、定时器 src/periph/ UART / SPI / I2C / GPIO 外设模型 src/devices/ 虚拟终端、虚拟屏幕、SSD1306 器件驱动 src/sim/ 事件队列(evq)、引脚网络表(net)、SoC 互联、netlist 工程解析 src/gui/ SDL2 界面(工具栏、窗口、寄存器面板、屏幕面板) src/utils/ HEX 解析、日志、公共类型
仿真原理对标 Proteus:
sim_run
cycles/frame
evq
net
momo-simulator/ ├── src/ # 源码(core/periph/devices/sim/gui/utils) ├── tests/ # 单元/冒烟测试(8 个 target) │ ├── fixtures/ # 测试固件/数据 │ ├── rv32_unit.c # RV32 指令级单测 │ ├── unit_net.c # 引脚网络表单测 │ └── smoke_*.c # 各模块冒烟测试 ├── examples/ │ ├── fw/ # 示例固件(.S 源 + .bin) │ └── projects/ # 示例 netlist 工程(.net) ├── tools/ │ ├── rv32asm.py # RV32 迷你汇编器 │ └── netlist-editor.html # 网络表可视化设计器 ├── thirdparty/ # SDL2 / SDL2_ttf 预编译包(mingw x86_64) ├── xmake.lua └── README.md
依赖:
D:/msys64/mingw64
thirdparty/
# 配置 mingw 工具链(仅需一次,结果缓存在 .xmake/) xmake f -p mingw --mingw="D:/msys64/mingw64" -y # 构建模拟器本体 xmake build momosim
构建产物:build/mingw/x86_64/debug/momosim.exe(SDL2.dll 自动从 thirdparty 拷贝)。
build/mingw/x86_64/debug/momosim.exe
# 直接运行(默认加载 examples/fw/hello.bin,加 --auto-run 自动启动仿真) build/mingw/x86_64/debug/momosim.exe --auto-run # 指定固件 build/mingw/x86_64/debug/momosim.exe --auto-run examples/fw/hello.bin # 加载网络表工程(SSD1306 屏幕示例) build/mingw/x86_64/debug/momosim.exe --netlist examples/projects/ssd1306.net --auto-run
界面操作:
[- | 档位 | +]
⚙
本机若没有 RISC-V 交叉编译器,使用自研迷你汇编器生成固件:
python tools/rv32asm.py examples/fw/hello.S -o examples/fw/hello.bin python tools/rv32asm.py examples/fw/ssd1306.S -o examples/fw/ssd1306.bin
汇编器支持 RV32I(+M) 子集与常用伪指令,两遍汇编,输出小端 .bin。
用浏览器打开 tools/netlist-editor.html,拖拽器件、连线,导出 .net 工程文件,再用 --netlist 加载到模拟器。
tools/netlist-editor.html
.net
--netlist
8 个 xmake 测试 target 全部通过:
momosim-tests
momosim-tests-periph
momosim-tests-screen
momosim-tests-fw
momosim-tests-fw-screen
momosim-tests-netlist
momosim-tests-rv32
momosim-tests-net
xmake build -a # 构建全部 target for t in momosim-tests momosim-tests-periph momosim-tests-screen \ momosim-tests-fw momosim-tests-fw-screen momosim-tests-netlist \ momosim-tests-rv32 momosim-tests-net; do xmake run $t done
本项目托管于 GitLink:https://gitlink.org.cn/ltree/momo-simulator
本项目采用 MIT 许可证。
一个arm, risc-v 单片机模拟器
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
momo-simulator
momo-simulator 是一个用 C11 + xmake + SDL2 实现的教学/演示型 MCU 仿真器。它在单一进程内完成「取指-译码-执行」的指令级仿真,并通过引脚级网络表(netlist)把 CPU 与外设、虚拟器件互联,模拟 Proteus 风格的硬件电路仿真体验。
特性
x0恒零、CSR(mstatus/mie/mip/mtvec/mepc/mcause)、非法指令陷阱。可插拔多架构框架(后续扩展 Cortex-M0 / RV64I)。*.net文本工程文件描述器件与连线;附带纯前端 HTML 设计器可视化拖拽连线并导出。tools/rv32asm.py迷你 RV32 汇编器(本机无 RISC-V 交叉编译器时用于生成固件.bin)。架构
分层结构(自下而上):
仿真原理对标 Proteus:
sim_run按速度档位推进cycles/frame)。evq按时间戳分发定时/外设事件。net模块实现引脚-网络表的电平传播,CPU 与外设通过地址解码 + MMIO 读写交换数据。目录结构
构建
依赖:
D:/msys64/mingw64下验证)thirdparty/,无需系统安装;xrepo 源码安装在本环境有 cmake 路径 bug,故采用官方 mingw 预编译包手动管理)构建产物:
build/mingw/x86_64/debug/momosim.exe(SDL2.dll 自动从 thirdparty 拷贝)。运行
界面操作:
[- | 档位 | +]与「寄存器」开关(关闭后左栏终端占满)。⚙:打开配置对话框,可切换 SSD1306 的 I2C 地址(0x3C ↔ 0x3D),点「应用」实时生效。固件汇编
本机若没有 RISC-V 交叉编译器,使用自研迷你汇编器生成固件:
汇编器支持 RV32I(+M) 子集与常用伪指令,两遍汇编,输出小端
.bin。网络表设计器
用浏览器打开
tools/netlist-editor.html,拖拽器件、连线,导出.net工程文件,再用--netlist加载到模拟器。测试
8 个 xmake 测试 target 全部通过:
momosim-testsmomosim-tests-periphmomosim-tests-screenmomosim-tests-fwmomosim-tests-fw-screenmomosim-tests-netlistmomosim-tests-rv32momosim-tests-net开发路线
16:单测完善(RV32 指令级 + net 引脚网表)
19:扩展 CPU — Cortex-M0(Thumb 指令集)
20:扩展 CPU — RV64I
18:README + GitLink 托管
托管
本项目托管于 GitLink:https://gitlink.org.cn/ltree/momo-simulator
许可证
本项目采用 MIT 许可证。