#linux #soc #running #fpga #index #vex-riscv #vexriscv

nightly app litex

在(Linux) Litex VexRiscv FPGA SOC上运行Rust

4个版本

0.1.3 2019年12月29日
0.1.2 2019年12月29日
0.1.1 2019年12月29日
0.1.0 2019年12月29日

#1699硬件支持

GPL-3.0 许可证

8MB
27K SLoC

C++ 25K SLoC // 0.1% comments D 1K SLoC Coq 531 SLoC // 0.7% comments Python 147 SLoC // 0.1% comments Rust 97 SLoC // 0.0% comments JavaScript 16 SLoC Alex 10 SLoC Shell 4 SLoC

包含 (ELF可执行文件/库, 3MB) build/sim/gateware/obj_dir/Vdut, (静态库, 2MB) build/sim/gateware/obj_dir/Vdut__ALL.a, (ELF可执行文件/库, 1.5MB) Vdut__ALLsup.o, (ELF可执行文件/库, 2MB) build/sim/gateware/obj_dir/verilated.o, (ELF可执行文件/库, 1.5MB) verilated_dpi.o, (静态库, 1.5MB) libcompiler_rt.a 以及更多93个.

在Litex VexRiscv (Linux)上使用Rust

通过https://github.com/litex-hub/linux-on-litex-vexriscv 开始使用,并实验直到您对使用它感到舒适。

启用C Riscv扩展

因为标准的Riscv32 Rust编译器目标是: riscv32imac-unknown-none-elf 并且VexRiscv的默认设置没有 C 扩展,所以我们需要更改它。

有关此主题的讨论,请参阅 https://github.com/SpinalHDL/VexRiscv/issues/93

要添加 C 扩展,您必须构建一个新的VexRiscv变体

https://github.com/tomtor/linux-on-litex-vexriscv#generating-the-vexriscv-linux-variant-optional

在用 sbt 构建之前应用以下diff。

diff --git a/src/main/scala/vexriscv/GenCoreDefault.scala b/src/main/scala/vexriscv/GenCoreDefault.scala
index a052205..9066e9e 100644
--- a/src/main/scala/vexriscv/GenCoreDefault.scala
+++ b/src/main/scala/vexriscv/GenCoreDefault.scala
@@ -92,6 +92,7 @@ object GenCoreDefault{
             resetVector = argConfig.resetVector,
             relaxedPcCalculation = argConfig.relaxedPcCalculation,
             prediction = argConfig.prediction,
+            compressedGen = true,
             memoryTranslatorPortConfig = if(linux) MmuPortConfig(portTlbSize = 4),
             config = InstructionCacheConfig(
               cacheSize = argConfig.iCacheSize,
@@ -149,7 +150,7 @@ object GenCoreDefault{
           catchIllegalInstruction = true
         ),
         new RegFilePlugin(
-          regFileReadyKind = plugin.SYNC,
+          regFileReadyKind = plugin.ASYNC,
           zeroBoot = false
         ),
         new IntAluPlugin,
@@ -268,4 +269,4 @@ class ForceRamBlockPhase() extends spinal.core.internals.Phase{
     }
   }
   override def hasNetlistImpact: Boolean = false

并将结果 VexRiscv.v 复制到您的 litex 树中的 VexRiscv_Linux.v (我假设 ..)

sudo cp VexRiscv.v ../litex/litex/soc/cores/cpu/vexriscv/verilog/VexRiscv_Linux.v

验证您是否可以在您的 linux-on-litex-vexriscv 目录中启动仿真

./sim.py

使用C Riscv扩展构建新的根目录(可选)

克隆 https://github.com/tomtor/linux-on-litex-vexriscv 并检出分支 rv32imac

这应用以下更改

CONFIG_PACKET=y            # in buildroot/board/litex_vexriscv/linux.config for a working DHCP
BR2_RISCV_ISA_CUSTOM_RVC=y # in buildroot/configs/litex_vexriscv_defconfig Enable C compression
riscv,isa = "rv32imac";    # in json2dts.py for a correct /proc/cpuinfo

构建新的根目录: https://github.com/tomtor/linux-on-litex-vexriscv#generating-the-linux-binaries-optional

将结果镜像(Imagerootfs.cpio)复制到您的 linux-on-litex-vexriscv/buildroot 目录,并使用 ./sim.py 再次测试。

在Linux中使用Rust

目前Riscv32对Rust std 没有支持。一种解决方法是构建一个 nostd Rust库,并将其与一个简单的 C 主程序链接。请参见 https://github.com/tomtor/linux-on-litex-vexriscv 中的 rustlib 目录以获取一个最小示例。

启动Rust嵌入式程序而不是Linux镜像

这个包创建了一个简单的示例程序,您可以将其作为标准Linux镜像的替代品来启动。

运行 ./rust.py 在仿真中尝试它。

--============= Liftoff! ===============--
VexRiscv Machine Mode software built Dec 28 2019 19:48:43
--========== Booting Linux =============--
Hello World
i: 1 1/i: 1
533379
i: 2 1/i: 0.5
540759
i: 3 1/i: 0.33333334
549040
i: 4 1/i: 0.25
556395
i: 5 1/i: 0.2
563675
i: 6 1/i: 0.16666667
571637
i: 7 1/i: 0.14285715
579679
i: 8 1/i: 0.125
587093
i: 9 1/i: 0.11111111
595013
100
200
300
400
500
600
700
800
900
[-450, -400, -350, -300, -250, -200, -150, -100, -50, 0, 50, 100, 150, 200, 250, 300, 350, 400, 450] in 4054

panic!
panicked at 'End of main()', src/main.rs:63:5

依赖项