沒想竟然遇到連載途中的除錯困境XD
不過30天鐵人賽對筆者來說就像黑客松紀錄簿,也當作給作軟硬整合開發的人一個參考吧。
先來說一下遇到什麼狀況:
我們的終極目標,是完整的Alpine Linux on RV32GC,因為對於Linux mainline來說,唯一官方真正認可的最小公因數ABI set,就是RV32/64GC,而非soft-float、或著筆者在其他地方玩弄的RV32I Linux等等隨時都有可能build fail/runtime break的組態。
如先前所述,VexRiscv有完整的D extension支援,是在近一年、半年左右的事情。敝人過去持續跟進使用的過程中,它是慢慢地從IMA、IMAC演進到IMAFDC;前篇所提及的OrangeCrab開發版,依照上面使用的FPGA chip有兩個變種,一個是25F、另一個是85F,兩者相差了8萬個logic cell。之前為了開發簡便,我基本上都用Linux-on-Litex/VexRiscv的預設building script在做事,我有其他張比較大的開發版,logic cell的資源也多,例如Lattice自己本身的versa-5g,上面是使用ECP5-45F;這些較大的開發板上,打開FPU是沒什麼問題的。但是OrangeCrab上面,故事就比較悲劇一點,在VexRiscv IMAC組態底下,已經把LC吃了92%掉。想要強制開啟FPU組態(預設在25F上是關閉的),我們需要做出以下改動 — —
# /path/to/litex_root/litex/litex/soc/cores/cpu/vexriscv_smp/core.py
...
aes_instruction = False
out_of_order_decoder = False
wishbone_memory = False
- with_fpu = False
+ with_fpu = True
cpu_per_fpu = 1
with_rvc = True
...
- parser.add_argument("--with-fpu" , default=Flase, action="store_true", help="Enable the F32/F64 FPU")
+ parser.add_argument("--with-fpu" , default=True, action="store_true", help="Enable the F32/F64 FPU")
- parser.add_argument("--cpu-per-fpu" , default="4", help="Maximal ratio between CPU count and FPU count. Will instanciate as many FPU as necessary.")
+ parser.add_argument("--cpu-per-fpu" , default="1", help="Maximal ratio between CPU count and FPU count. Will instanciate as many FPU as necessary.")
然而這樣一打開,我們就會把僅剩的LC直接吃滿吃到超過100%。
嘗試調動yosys的一些optimization flags,還是不夠,我們勢必必須要打掉一些peripheral來節約LC的用量:
# /path/to/linux_on_litex_vexriscv/make.py
# OrangeCrab
# Buses
- "i2c",
+ #"i2c",
# Storage
- "spisdcard",
+ #"spisdcard",
直接把僅存的spi mode sdcard跟i2c給拆了,(其實還要退回2021年初的yosys使用比較暴力的ABC優化參數 -abc9 -nowidelut
)這時nextpnr回報的LC用量終於勉強夠用,也能在。但是拆掉了spisdcard後,我們僅能透過LiteX BIOS中最後的fallback mode來進行Linux image、OpenSBI、rootfs image的loading。
但是serial傳輸遇到bit rotting的機會很高。
目前筆者還在努力想辦法解決當中XDDDD