這篇記錄在 Lattice ECP5 Versa EVB 上使用純開源工具鏈跑 Verilog 的過程。 起因是發現手上的板子(LFE5UM-45F)Lattice Diamond 不支援,只好往開源方向找。
時脈設定的坑
最大的障礙是找到正確的 FPGA 時脈輸入腳位。 根據板子的 User Manual,板載有一個 100 MHz LVDS 振盪器接在 P3 和 P4 差分輸入, 但文件裡沒有把這個資訊整理成表格,需要自己從 litex-board 的專案裡挖出來。
腳位對應(ecp5evn.lpf)
FREQUENCY PORT "clk" 100.0 MHz;
LOCATE COMP "clk" SITE "P3";
IOBUF PORT "clk" IO_TYPE=LVDS;
LOCATE COMP "rst" SITE "T1";
IOBUF PORT "rst" IO_TYPE=LVCMOS33;
LOCATE COMP "led[0]" SITE "E16";
IOBUF PORT "led[0]" IO_TYPE=LVCMOS33;
# ... led[1]~led[7] 依此類推
簡單 8-bit CPU 設計
以一個簡單的 8-bit CPU 驗證整個流程,指令集包含:
LI:Load Immediate,載入立即值到暫存器ADD:加法OUT:輸出到 LED
4 個通用暫存器,16-bit 指令格式,程式記憶體裡塞了一段計算 1+10 的測試序列。
開源工具鏈
- Yosys:Verilog 合成,輸出 JSON netlist
- nextpnr-ecp5:Place & Route
- ecppack:產生 bitstream
- openFPGALoader:燒錄到板子
Makefile 自動化整個流程
VERILOG_SRC = cpu.v
LPF = ecp5evn.lpf
DEVICE = LFE5UM-45F-8BG381C
PACKAGE = BG381
synth:
yosys -p "synth_ecp5 -json cpu.json" $(VERILOG_SRC)
pnr:
nextpnr-ecp5 --device $(DEVICE) --package $(PACKAGE) \
--json cpu.json --lpf $(LPF) --textcfg cpu.config
pack:
ecppack cpu.config cpu.bit
prog:
openFPGALoader -b ecp5_evn cpu.bit
sim:
verilator --cc --trace cpu.v --exe sim_main.cpp
make -C obj_dir -f Vcpu.mk
驗證流程
先用 Verilator 做仿真(生成 VCD 波形),確認邏輯正確後再燒到硬體。 這個步驟可以省下不少 debug 時間。
原文發佈於 blog.richliu.com