Add NVBoard demo.
注意: 本 README 及各 docs/*_zh.md 文档均为 AI 翻译。
docs/*_zh.md
SimpleSoc 是一个用 Chisel 编写的小型 32 位 SoC 库。它提供了一条轻量级片上总线、互连(interconnect)与 MMIO 交叉开关(crossbar)、ROM/SRAM 控制器、UART、GPIO 以及七段数码管显示支持,并组装成两个示例 SoC 顶层(SimTop、FpgaTop)。CPU 内核是可替换的黑盒:接入你自己的处理器,即可得到一个可工作的系统。
SimTop
FpgaTop
本项目的一个目标是为一生一芯计划 Stage D 中设计的处理器提供快速的仿真与 FPGA 实现。与 ysyxSoC 相比,SimpleSoc 轻量、易于理解、仿真速度快,并且每条指令的周期数更少——其简单、低延迟的存储器没有等待周期——代价是存储容量小得多(FPGA 上只能放得下几十 KiB 的片上 SRAM)。
InstrInterface
DataInterface
需要 sbt 来展开(elaborate)该 SoC。运行以下命令为两个顶层模块配置生成 SystemVerilog:
sbt "runMain simplesoc.Elaborate"
输出位于 build/sim/ 和 build/fpga/,各自带一个 filelist.f。lowering 选项针对 Yosys 和 Icarus Verilog 的兼容性选取(无局部变量、无压缩数组、无 always_comb)。
build/sim/
build/fpga/
filelist.f
always_comb
在 nvboard-demo/ 目录下有一个最小演示,内含 RISC-V 内核并连接 NVBoard。为该演示构建 workload 最快捷的方式是使用 Sonnet SDK。可以使用 simplesoc BSP 和 simplesoc-sram BSP 分别对应本 SoC 的两种配置。该 SDK 还提供了可直接构建运行的示例。
simplesoc
simplesoc-sram
CPU 的取指端口是互连的主设备 0, load-store 端口是主设备 1。在示例顶层中,地址译码使用 addr[31:28](此布局只是示例,并非要求——译码位和区域大小由你自己选择):
addr[31:28]
0x1000_0000
addr[15:12]
0x3000_0000
0x8000_0000
FpgaTop 只译码 MMIO 和 SRAM:其唯一的存储器是片上 RAM,程序在 FPGA 厂商工具中初始化为 RAM 的内容。SimTop 额外有一个 ROM 区域;只要程序加载到 RAM 中并从 RAM 运行、不访问 ROM,两个顶层的行为就是一致的(见 docs/presents_zh.md)。
Crossbar 后的 MMIO 设备(两个顶层相同):
0x1000_1000
0x1000_2000
0x1000_3000
0x1000_4000
0x1000_5000
src/main/scala/ Soc.scala SimTop 与 FpgaTop 示例 SoC Port.scala CPU 黑盒及仿真/FPGA 存储器封装 Elaborate.scala sbt 入口;为两个顶层生成 SystemVerilog bus/ SimpleBus 接口、Interconnect、Crossbar mem/ RomController、SramController uart/ Uart、UartTx、UartRx、CrossBuffer gpio/ Gpio、SegmentDecoder timer/ Timer(双级计数器,4 路 PWM 通道) src/main/sv/ Verilog 辅助模块:SimulatedMem(DPI-C/VPI 存储器)、UartTxCapture build/sim/ 预生成的 SimTop SystemVerilog 及 filelist build/fpga/ 预生成的 FpgaTop SystemVerilog 及 filelist docs/ 各组件的详细文档
SimTop 通过 src/main/sv/SimulatedMem.sv 连接仿真存储器:在 Verilator 下使用 DPI-C(dpi_c_mem_read/write),在 Icarus Verilog 下使用 VPI($mem_read/$mem_write)。uart0 TX 线上发送的字节由 UartTxCapture.sv 通过 $write("%c") 打印。本仓库不提供仿真运行脚本——请自带 Verilator 或 Icarus 测试环境,并加载 build/sim/filelist.f。
src/main/sv/SimulatedMem.sv
dpi_c_mem_read/write
$mem_read/$mem_write
UartTxCapture.sv
$write("%c")
build/sim/filelist.f
FpgaTop 面向 Gowin FPGA:时钟来自 Gowin PLL(GowinRPll)及复位控制器;存储器为 Gowin 片上 RAM IP(GowinSP,64 KiB,以黑盒方式实例化)。这里没有单独的 ROM:绝大多数 FPGA 都支持存储器初始化,而 FPGA 中的 “ROM” 通常只是不带写端口的初始化 RAM,因此单独的 ROM 没有任何好处。程序镜像直接加载到初始化后的 RAM 中。这也保证了 SimTop 与 FpgaTop 的一致性:只要程序加载到 RAM、复位后从 RAM 运行、不访问 ROM 区域,两个顶层的工作方式就是一致的。(仿真中的 ROM/RAM 大小并不固定——仿真存储器只受地址空间限制。)PLL 配置与 IP 生成在 Gowin 厂商工具中完成,不属于本仓库的内容。
GowinRPll
GowinSP
SimpleSoc 是一个库,而不是一颗成品芯片:SimTop/FpgaTop 是供你参考复制的示例。要构建自己的 SoC,请遵循 Soc.scala 中的模式——实例化一个 Interconnect,接上你的 CPU 的取指/ load-store 端口(期望的黑盒接口见 Port.scala),把外设挂在 Crossbar 之后,并为你的顶层添加一次 Elaborate 调用。完整指南见 docs/soc_zh.md。
Soc.scala
Interconnect
Port.scala
Crossbar
Elaborate
MulanPSL v2
A simple SoC speaking SimpleBus for One Student One Chip D and E stage.
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
SimpleSoc
SimpleSoc 是一个用 Chisel 编写的小型 32 位 SoC 库。它提供了一条轻量级片上总线、互连(interconnect)与 MMIO 交叉开关(crossbar)、ROM/SRAM 控制器、UART、GPIO 以及七段数码管显示支持,并组装成两个示例 SoC 顶层(
SimTop、FpgaTop)。CPU 内核是可替换的黑盒:接入你自己的处理器,即可得到一个可工作的系统。本项目的一个目标是为一生一芯计划 Stage D 中设计的处理器提供快速的仿真与 FPGA 实现。与 ysyxSoC 相比,SimpleSoc 轻量、易于理解、仿真速度快,并且每条指令的周期数更少——其简单、低延迟的存储器没有等待周期——代价是存储容量小得多(FPGA 上只能放得下几十 KiB 的片上 SRAM)。
特性
InstrInterface:32 位只读取指端口。DataInterface:读/写数据端口,带有 size、写使能和字节掩码信号。SimTop用于仿真(引脚与 ysyxSoC 兼容,带 DPI-C/VPI 仿真存储器钩子);FpgaTop面向 Gowin FPGA(PLL、片上 RAM IP)。FpgaTop只使用单一的存储器——程序加载到可初始化的片上 RAM 中,不单独设 ROM(见 docs/presents_zh.md)。快速上手
需要 sbt 来展开(elaborate)该 SoC。运行以下命令为两个顶层模块配置生成 SystemVerilog:
输出位于
build/sim/和build/fpga/,各自带一个filelist.f。lowering 选项针对 Yosys 和 Icarus Verilog 的兼容性选取(无局部变量、无压缩数组、无always_comb)。在 nvboard-demo/ 目录下有一个最小演示,内含 RISC-V 内核并连接 NVBoard。为该演示构建 workload 最快捷的方式是使用 Sonnet SDK。可以使用
simplesocBSP 和simplesoc-sramBSP 分别对应本 SoC 的两种配置。该 SDK 还提供了可直接构建运行的示例。存储映射
CPU 的取指端口是互连的主设备 0, load-store 端口是主设备 1。在示例顶层中,地址译码使用
addr[31:28](此布局只是示例,并非要求——译码位和区域大小由你自己选择):0x1000_0000addr[15:12]译码0x3000_00000x8000_0000FpgaTop只译码 MMIO 和 SRAM:其唯一的存储器是片上 RAM,程序在 FPGA 厂商工具中初始化为 RAM 的内容。SimTop额外有一个 ROM 区域;只要程序加载到 RAM 中并从 RAM 运行、不访问 ROM,两个顶层的行为就是一致的(见 docs/presents_zh.md)。Crossbar 后的 MMIO 设备(两个顶层相同):
0x1000_00000x1000_10000x1000_20000x1000_30000x1000_40000x1000_5000仓库结构
仿真
SimTop通过src/main/sv/SimulatedMem.sv连接仿真存储器:在 Verilator 下使用 DPI-C(dpi_c_mem_read/write),在 Icarus Verilog 下使用 VPI($mem_read/$mem_write)。uart0 TX 线上发送的字节由UartTxCapture.sv通过$write("%c")打印。本仓库不提供仿真运行脚本——请自带 Verilator 或 Icarus 测试环境,并加载build/sim/filelist.f。FPGA
FpgaTop面向 Gowin FPGA:时钟来自 Gowin PLL(GowinRPll)及复位控制器;存储器为 Gowin 片上 RAM IP(GowinSP,64 KiB,以黑盒方式实例化)。这里没有单独的 ROM:绝大多数 FPGA 都支持存储器初始化,而 FPGA 中的 “ROM” 通常只是不带写端口的初始化 RAM,因此单独的 ROM 没有任何好处。程序镜像直接加载到初始化后的 RAM 中。这也保证了SimTop与FpgaTop的一致性:只要程序加载到 RAM、复位后从 RAM 运行、不访问 ROM 区域,两个顶层的工作方式就是一致的。(仿真中的 ROM/RAM 大小并不固定——仿真存储器只受地址空间限制。)PLL 配置与 IP 生成在 Gowin 厂商工具中完成,不属于本仓库的内容。构建你自己的 SoC
SimpleSoc 是一个库,而不是一颗成品芯片:
SimTop/FpgaTop是供你参考复制的示例。要构建自己的 SoC,请遵循Soc.scala中的模式——实例化一个Interconnect,接上你的 CPU 的取指/ load-store 端口(期望的黑盒接口见Port.scala),把外设挂在Crossbar之后,并为你的顶层添加一次Elaborate调用。完整指南见 docs/soc_zh.md。文档
许可证
MulanPSL v2