1.8Kпросмотров
10 июля 2025 г.
statsScore: 1.9K
SiPEED Tang Nano 4K + Nix Есть у меня отличная детская ПЛИСина от GOWIN. Есть пара статей по работе с ним с помощью открытых инструментов, всё описано в репке. Оттуда стащим examples/blinky.v и examples/tangnano4k.cst для простоты и краткости. Также не так давно близко ознакомился с такой отличной системой как Nix. Принципиально она решает только проблему dependency hell. Поэтому просто соберём образ для платы с её помощью. Для этого возьмём из readme.md и examples/Makefile необходимые макросы (я вроде ничего из них не выкинул, хотя надо бы) и команды и соберём всё это в такой код:
{ stdenv, lib, nextpnr, openfpgaloader, python3Packages, yosys, }: stdenv.mkDerivation { pname = "sipeed"; version = "v0.1"; src = lib.cleanSource ./.; nativeBuildInputs = [ nextpnr openfpgaloader yosys python3Packages.apycula ]; buildPhase = '' yosys \ -D LEDS_NR=6 \ -D OSC_TYPE_OSCZ \ -D INV_BTN=0 \ -D FORCE_BRAM \ -D CPU_FREQ=27 \ -D BAUD_RATE=115200 \ -D NUM_HCLK=2 \ -D RISCV_MEM_16K \ -p "read_verilog blinky.v; synth_gowin -json blinky.json" nextpnr-himbaechel \ --json blinky.json \ --write pnrblinky.json \ --device GW1NSR-LV4CQN48PC7/I6 \ --vopt cst=tangnano4k.cst gowin_pack -d GW1NSR-LV4CQN48PC7/I6.cst -o pack.fs pnrblinky.json ''; installPhase = '' mkdir $out install pack.fs $out/ '';
} Как видим, всё "деклоративно", хотя... В итоге всё сводится к императивному, как и всё в этом мире. Но контролируемость окружения и зависимостей делает повторяемой сборку. Не воспроизводимой, а именно повторяемой. Кстати, стоит завернуть это в flake для пущей красоты.
Больше принципиальных преимуществ нет. Даже рассказы про "достаточно простого советского nix build..." ничем не лучше старого доброго make (или даже запуска скрипта). Больше не пишите такую глупость в комментариях, это выигрыш -5 (минус пяти) символов.
Повидав некоторое количество подходов к управлению разнородными зависимостями, могу утверждать, что данный подход далеко не худший. Даже из лучших. #nix #fpga