Now using nextpnr instead of Arachne-pnr.
さて、一つ目の宿題をやってみます。前回は placing and routing に Arachne-pnr を使いましたが、今回は nextpnr を試してみます。
nextpnr は、こちらからダウンロードしてインストールしました。バージョンはコミット dd7f7a5 です。
Makefile を書き換える
まず、TinyFPGA-BX/examples/picosoc のオリジナル Makefile に次のような修正を加えます。
diff --git a/examples/picosoc/Makefile b/examples/picosoc/Makefile index d174349..d6f1d61 100644 --- a/examples/picosoc/Makefile +++ b/examples/picosoc/Makefile @@ -1,30 +1,30 @@ +CC=riscv64-unknown-elf-gcc +OBJCOPY=riscv64-unknown-elf-objcopy + upload: hardware.bin firmware.bin tinyprog -p hardware.bin -u firmware.bin -hardware.blif: hardware.v spimemio.v simpleuart.v picosoc.v picorv32.v - yosys -ql hardware.log -p 'synth_ice40 -top hardware -blif hardware.blif' $^ +hardware.json: hardware.v spimemio.v simpleuart.v picosoc.v picorv32.v + yosys -ql hardware.log -p 'synth_ice40 -top hardware -json hardware.json' $^ -hardware.asc: hardware.pcf hardware.blif - arachne-pnr -d 8k -P cm81 -o hardware.asc -p hardware.pcf hardware.blif +hardware.asc: hardware.pcf hardware.json + nextpnr-ice40 --lp8k --package cm81 --asc hardware.asc --pcf hardware.pcf --json hardware.json hardware.bin: hardware.asc - icetime -d hx8k -c 12 -mtr hardware.rpt hardware.asc + icetime -d lp8k -c 12 -mtr hardware.rpt hardware.asc icepack hardware.asc hardware.bin firmware.elf: sections.lds start.S firmware.c - riscv32-unknown-elf-gcc -march=rv32imc -nostartfiles -Wl,-Bstatic,-T,sections.lds,--strip-debug,-Map=firmware.map,--cref -ffreestanding -nostdlib -o firmware.elf start.S firmware.c + $(CC) -march=rv32imc -mabi=ilp32 -nostartfiles -Wl,-Bstatic,-T,sections.lds,--strip-debug,-Map=firmware.map,--cref -ffreestanding -nostdlib -o firmware.elf start.S firmware.c firmware.bin: firmware.elf - riscv32-unknown-elf-objcopy -O binary firmware.elf /dev/stdout > firmware.bin + $(OBJCOPY) -O binary firmware.elf /dev/stdout > firmware.bin clean: rm -f firmware.elf firmware.hex firmware.bin firmware.o firmware.map \ - hardware.blif hardware.log hardware.asc hardware.rpt hardware.bin + hardware.blif hardware.log hardware.asc hardware.rpt hardware.bin \ + hardware.json
修正点は、
- Yosys の出力形式を BLIF から JSON に変更(nextpnr は BLIF に対応していない?)
- Arachne-pnr に代えて nextpnr を使う(オプションは上述の通り)
- ついでに icetime のオプションを直しておいた(hx8k は間違い)
です。
Placing & Routing
やってみましょう。
make
まずは Device utilisation(utilization の間違い?)です。
Info: Device utilisation: Info: ICESTORM_LC: 5500/ 7680 71% Info: ICESTORM_RAM: 20/ 32 62% Info: SB_IO: 13/ 256 5% Info: SB_GB: 8/ 8 100% Info: ICESTORM_PLL: 0/ 2 0% Info: SB_WARMBOOT: 0/ 1 0%
LC の使用量が Arachne-pnr よりも若干少ないようです。
次に icetime による f_MAX の評価結果です。
icetime -m -dlp8k hardware.asc // Reading input .asc file.. // Reading 8k chipdb file.. // Creating timing netlist.. // Timing estimate: 45.24 ns (22.10 MHz)
おおっ。なんか f_MAX が上がっているようです。
TinyFPGA BX のフラッシュに書き込んでみましたが、nextpnr の出力もちゃんと動作することを確認できました。
最後にレイアウトビューです。Arachne-pnr とちょっと違うレイアウトですね!
今日はここまで。