在 FPGA 上跑 Haskell:Ouros 处理器的 IO 与自动多线程
来源:bathtub-01.github.io — 2026-11-01
📋 概述
博士生 Yukang Xie 介绍把 Haskell 处理器 Ouros 放上 FPGA 并补上 IO 能力的工作。Ouros 是基于组合子的图归约机,不执行指令序列,而是把程序编译成组合子图后反复归约:每个应用(App)是一个定长字,大型表达式是一串靠指针连起来的 App 存在堆里,Dereference Heap、Reducer、ALU 三块硬件以数据令牌流转,因此是数据流驱动而非指令驱动。IO 用状态传递的 IO monad 接上,World 只是个占位整数,底层操作落到 AXI4-Lite 总线读写寄存器,于是没有软件运行时也没有内核陷入。设计在 AMD 捐赠的 AUP-ZU3 板上以 100 MHz 运行,约占 27% LUT、7% 寄存器、40% BRAM。
🔑 核心要点
- 演示里没有软件运行时或「内核陷入」,Haskell 程序直接跑在硬件上,通过 UART 与外界对话。
- 执行模型是图归约:编译成组合子图,执行就是反复归约函数应用,App 是定长字加指针串起的堆结构。
- 三块硬件以数据令牌协作,谁输入就绪谁处理,即数据流驱动;同时支持较大的组合子以减少归约步数。
- 自动细粒度多线程:遇到两个独立子表达式时自动分线程求值,共享一条硬件流水线;另有并发硬件垃圾回收器。
- IO 用经典状态传递 monad,World 只是占位 Int,靠数据依赖给副作用排序,原生操作用 AXI4-Lite 完成总线事务。
- 实测 100 MHz,占用约 27% LUT、7% 寄存器、40% BRAM,作者称逻辑规模接近一个小型流水线 RISC-V 核。
- 局限:暂不支持 Float/Double,ALU 也还不能对 Int 做除法。
💡 金句
从程序员的角度看,它不过是在读写一些寄存器,其中一部分连着外面的世界。
👍 0
👎 0
← 返回 Lobsters 首页