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 在 硬件支持
8MB
27K 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
将结果镜像(Image
和 rootfs.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