
nextpnr أداة محمولة لتنسيب وتوجيه FPGA
nextpnr -- أداة تنسيب وتوجيه FPGA قابلة للنقل =============================================== تطمح nextpnr إلى أن تكون أداة تنسيب وتوجيه FPGA حرة ومفتوحة المصدر (FOSS)، محايدة تجاه البائعين ومحركة بالتوقيت. حاليًا تدعم nextpnr: * أجهزة Lattice iCE40 المدعومة عبر [Project IceStorm](https://github.com/YosysHQ/icestorm) * أجهزة Lattice ECP5 المدعومة عبر [Project Trellis](https://github.com/YosysHQ/prjtrellis) * أجهزة Lattice Nexus المدعومة عبر [Project Oxide](https://github.com/gatecat/prjoxide) * أجهزة Gowin LittleBee و Aurora V المدعومة عبر [Project Apicula](https://github.com/YosysHQ/apicula) * أجهزة NanoXplore NG-Ultra المدعومة عبر [Project Beyond](https://github.com/YosysHQ-GmbH/prjbeyond-db) * أجهزة Cologne Chip GateMate المدعومة عبر [Project Peppercorn](https://github.com/YosysHQ/prjpeppercorn) * *(تجريبي)* أجهزة Cyclone V المدعومة عبر [Mistral](https://github.com/Ravenslofty/mistral) * *(تجريبي)* أجهزة Lattice MachXO2 المدعومة عبر [Project Trellis](https://github.com/YosysHQ/prjtrellis) * *(تجريبي)* أجهزة Xilinx من السلسلة 7 المدعومة عبر [Project X-Ray](https://github.com/F4PGA/prjxray) * *(تجريبي)* نهاية خلفية "عامة" لبنى معمارية يحددها المستخدم يمكن العثور على ورقة (أكاديمية) موجزة تصف مسار عمل Yosys+nextpnr على [arXiv](https://arxiv.org/abs/1903.10407). فيما يلي لقطة شاشة من nextpnr لـ iCE40. يمكن العثور على تعليمات البناء و[ملاحظات البدء](#getting-started) أدناه. <img src="https://assets.kitploit.com/production/public/readmes/10385/12bab50b683472060ad2a49530d9b6fe58b2c2b70efd1144b849ff83a8a6e80b.png" width="640"/> انظر أيضًا: - [الأسئلة الشائعة](https://github.com/yosyshq/nextpnr/blob/main/docs/faq.md) - [واجهة برمجة تطبيقات البنية المعمارية](https://github.com/yosyshq/nextpnr/blob/main/docs/archapi.md) المتطلبات الأساسية ------------- يجب تثبيت الحزم التالية لبناء nextpnr، بغض النظر عن البنية المعمارية المحددة: - CMake 3.25 أو أحدث - مُترجم C++17 حديث (`clang-format` مطلوب للتطوير) - Python 3.5 أو أحدث، بما في ذلك مكتبات التطوير (`python3-dev` لأوبونتو) - يتطلب `nextpnr-himbaechel` إصدار Python 3.9 أو أحدث - على ويندوز تأكد من تثبيت نفس الإصدار المدعوم من [vcpkg](https://github.com/Microsoft/vcpkg/blob/master/ports/python3/CONTROL) - مكتبات Boost (`libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-dev` أو `libboost-all-dev` لأوبونتو) - Eigen3 (`libeigen3-dev` لأوبونتو) - Yosys مطلوب لتوليف التصميم التجريبي - للبناء على ويندوز باستخدام MSVC، يُنصح باستخدام vcpkg لتثبيت التبعيات. - للبناءات 32 بت: `vcpkg install boost-filesystem boost-program-options boost-thread eigen3` - للبناءات 64 بت: `vcpkg install boost-filesystem:x64-windows boost-program-options:x64-windows boost-thread:x64-windows eigen3:x64-windows` - بالنسبة للبناءات الثابتة، أضف `-static` إلى كل اسم من أسماء الحزم. على سبيل المثال، غيّر `eigen3:x64-windows` إلى `eigen3:x64-windows-static` - نسخة من Python تطابق الإصدار في vcpkg (حاليًا Python 3.6.4). يمكنك تنزيل [ملف Zip القابل للتضمين](https://www.python.org/downloads/release/python-364/) وفك ضغطه. قد تحتاج إلى فك ضغط `python36.zip` داخل ملف zip القابل للتضمين إلى دليل جديد يُسمى "Lib". - للبناء على macOS، أداة brew مطلوبة. - ثبّت جميع الحزم المطلوبة `brew install cmake python boost eigen` البدء --------------- أولاً وقبل كل شيء، شغّل: ``` git submodule update --init --recursive ``` ### nextpnr-ice40 لدعم iCE40، ثبّت [Project IceStorm](https://github.com/YosysHQ/icestorm) في `/usr/local` أو أي موقع آخر، ويجب تمريره إلى CMake كـ `-DICESTORM_INSTALL_PREFIX=/usr`. ثم قم ببناء وتثبيت `nextpnr-ice40` باستخدام الأوامر التالية: ``` mkdir -p build && cd build cmake .. -DARCH=ice40 make -j$(nproc) sudo make install ``` على ويندوز، يمكنك تحديد المسارات صراحةً: ``` cmake . -B build -DARCH=ice40 -DICESTORM_INSTALL_PREFIX=C:/ProgramData/icestorm -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -G "Visual Studio 15 2017 Win64" -DPython3_EXECUTABLE=C:/Python364/python.exe -DPython3_LIBRARY=C:/vcpkg/packages/python3_x64-windows/lib/python36.lib -DPython3_INCLUDE_DIR=C:/vcpkg/packages/python3_x64-windows/include/python3.6 cmake --build build --config Release ``` لإنشاء إصدار ثابت، غيّر الثلاثي المستهدف من `x64-windows` إلى `x64-windows-static` وأضف `-DBUILD_STATIC=ON`. يمكن العثور على مثال بسيط يعمل على لوحة التطوير iCEstick في `ice40/examples/blinky/blinky.*`. مثال على الاستخدام: ``` cd ice40/examples/blinky yosys -p 'synth_ice40 -top blinky -json blinky.json' blinky.v # synthesize into blinky.json nextpnr-ice40 --hx1k --json blinky.json --pcf blinky.pcf --asc blinky.asc # run place and route icepack blinky.asc blinky.bin # generate binary bitstream file iceprog blinky.bin # upload design to iCEstick ``` تشغيل nextpnr في وضع الواجهة الرسومية (انظر أدناه للحصول على تعليمات بناء nextpnr مع دعم الواجهة الرسومية): ``` nextpnr-ice40 --json blinky.json --pcf blinky.pcf --asc blinky.asc --gui ``` (استخدم أزرار شريط الأدوات أو وحدة تحكم أوامر Python لتنفيذ إجراءات مثل التغليف والتنسيب والتوجيه وكتابة ملفات الإخراج.) ### nextpnr-ecp5 لدعم ECP5، ثبّت [Project Trellis](https://github.com/YosysHQ/prjtrellis) في `/usr/local` أو أي موقع آخر، ويجب تمريره إلى CMake كـ `-DTRELLIS_INSTALL_PREFIX=/usr/local`. ثم قم ببناء وتثبيت `nextpnr-ecp5` باستخدام الأوامر التالية: ``` mkdir -p build && cd build cmake .. -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install ``` - يمكن العثور على أمثلة لمسار عمل ECP5 لمجموعة من اللوحات في [أمثلة Project Trellis](https://github.com/YosysHQ/prjtrellis/tree/main/examples). ### nextpnr-nexus لدعم Nexus، ثبّت [Project Oxide](https://github.com/gatecat/prjoxide) في `$HOME/.cargo` أو أي موقع آخر، ويجب تمريره إلى CMake كـ `-DOXIDE_INSTALL_PREFIX=$HOME/.cargo`. ثم قم ببناء وتثبيت `nextpnr-nexus` باستخدام الأوامر التالية: ``` mkdir -p build && cd build cmake .. -DARCH=nexus -DOXIDE_INSTALL_PREFIX=$HOME/.cargo make -j$(nproc) sudo make install ``` - يمكن العثور على أمثلة لمسار عمل Nexus لمجموعة من اللوحات في [أمثلة Project Oxide](https://github.com/gatecat/prjoxide/tree/main/examples). ### nextpnr-mistral لدعم Cyclone V، استنسخ [Mistral](https://github.com/Ravenslofty/mistral/tree/nextpnr-latest) إلى `$HOME/mistral` أو أي موقع آخر ومرر هذا المسار إلى CMake كـ `-DMISTRAL_ROOT=$HOME/mistral`. ثم قم ببناء وتثبيت `nextpnr-mistral` باستخدام الأوامر التالية: ``` mkdir -p build && cd build cmake .. -DARCH=mistral -DMISTRAL_ROOT=$HOME/mistral make -j$(nproc) sudo make install ``` دعم Cyclone V حاليًا تجريبي وذو اختبارات محدودة. النهاية الخلفية تخضع لإعادة هيكلة نشطة لواجهة برمجة التطبيقات، وقد تتغير بنيتها ومتطلبات البناء ونقاط الدمج بين الإصدارات. ### nextpnr-generic الهدف العام يتيح تشغيل التنسيب والتوجيه لأي بنى معمارية مخصصة. ``` mkdir -p build && cd build cmake .. -DARCH=generic make -j$(nproc) sudo make install ``` مثال على كيفية استخدام المسار العام موجود في [generic/examples](https://github.com/yosyshq/nextpnr/blob/main/generic/examples). انظر أيضًا إلى [وثائق البنية المعمارية العامة](https://github.com/yosyshq/nextpnr/blob/main/docs/generic.md). ### nextpnr-himbaechel هدف himbaechel يتيح تشغيل التنسيب والتوجيه للبنى المعمارية الأكبر التي تشترك في بنية موحدة. #### gowin لدعم Gowin، ثبّت [Project Apicula](https://github.com/YosysHQ/apicula) ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin" make -j$(nproc) sudo make install ``` - يمكن العثور على أمثلة لمسار عمل Gowin لمجموعة من اللوحات في [أمثلة Project Apicula](https://github.com/YosysHQ/apicula/tree/master/examples). #### ng-ultra لدعم NanoXplore NG-Ultra، استنسخ مستودع [Project Beyond DB](https://github.com/yosyshq-GmbH/prjbeyond-db) ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="ng-ultra" -DHIMBAECHEL_PRJBEYOND_DB=/path/to/prjbeyond-db -DHIMBAECHEL_NGULTRA_DEVICES=ng-ultra make -j$(nproc) sudo make install ``` *يرجى ملاحظة أن إنشاء تدفق البت الثنائي يتطلب أداة Impulse من NanoXplore.* #### gatemate لدعم Cologne Chip GateMate، استنسخ [Project Peppercorn](https://github.com/YosysHQ/prjpeppercorn) ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gatemate" -DHIMBAECHEL_PEPPERCORN_PATH=/path/to/prjpeppercorn make -j$(nproc) sudo make install ``` ### الواجهة الرسومية لا يتم بناء واجهة nextpnr الرسومية افتراضيًا، لتقليل عدد التبعيات للبناء القياسي بدون واجهة رسومية. لتمكينها، أضف `-DBUILD_GUI=ON` إلى سطر أوامر CMake وتأكد من توفر Qt5/Qt6 وOpenGL: بالنسبة لـ Qt6: - على Ubuntu 22.04 LTS أو أحدث، ثبّت `qt6-base-dev` - بالنسبة لـ MSVC vcpkg، ثبّت `qt-base` (32 بت) أو `qt-base:x64-windows` (64 بت) - بالنسبة لـ Homebrew، ثبّت `qt6` وأضف qt6 إلى المسار: `echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile` ` - هذا التغيير يسري في جلسة الطرفية التالية، لذا يرجى إعادة فتح نافذة الطرفية قبل البناء بالنسبة لـ Qt5: - على Ubuntu 22.04 LTS، ثبّت `qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools` - على إصدارات Ubuntu الأخرى، ثبّت `qt5-default` - بالنسبة لـ MSVC vcpkg، ثبّت `qt5-base` (32 بت) أو `qt5-base:x64-windows` (64 بت) - بالنسبة لـ Homebrew، ثبّت `qt5` وأضف qt5 إلى المسار: `echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile` ` - هذا التغيير يسري في جلسة الطرفية التالية، لذا يرجى إعادة فتح نافذة الطرفية قبل البناء ### تعدد البنى المعمارية لإنشاء nextpnr لعدة بنى معمارية في وقت واحد، يمكن استخدام قائمة مفصولة بفواصل منقوطة مع `-DARCH`. ``` mkdir -p build && cd build cmake .. -DARCH="ice40;ecp5" make -j$(nproc) sudo make install ``` لإنشاء كل البنى المعمارية المستقرة المتاحة، استخدم `-DARCH=all`. لتضمين البنى التجريبية (حاليًا nexus)، استخدم `-DARCH=all+alpha`. ### لكل بنية دقيقة Himbächel لإنشاء ملف تنفيذي منفرد nextpnr-himbachel لكل من البنى الدقيقة المدعومة، استخدم `-DHIMBAECHEL_SPLIT`. ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin;ng-ultra" make -j$(nproc) sudo make install ``` في مثل هذا البناء، بدلاً من ملف ثنائي واحد `nextpnr-himbaechel`، يتم بناء ملفين ثنائيين `nextpnr-himbaechel-gowin` و`nextpnr-himbaechel-ng-ultra`. على الرغم من تثبيتهما معًا، فإن كل بنية دقيقة مستقلة تمامًا عن الأخرى، وتحتاج فقط إلى دليل قاعدة بيانات الشرائح المقابل `.../share/himbaechel/<microarchitecture>/` لتشغيلها. البناء المقسم يقلل حجم المخرجات الموزعة بشكل فردي (على الرغم من زيادة الحجم الإجمالي)، ويسمح بالتثبيت المشترك لمخرجات من إصدارات مختلفة. البناء المتبادل ----------------- بصرف النظر عن قواعد بيانات الشرائح، يتطلب nextpnr تجميع أداة `bba` لنظام البناء. يمكن تجميع هذه الأداة كمشروع منفصل: ``` cd bba cmake . make ``` سينشئ ذلك ملف `bba-export.cmake`. قدم المسار إلى هذا الملف عند البناء المتبادل لـ nextpnr باستخدام `-DBBA_IMPORT=/path/to/bba-export.cmake`. ملاحظات إضافية حول بناء nextpnr ------------------------------------- ما يلي يشغّل بناء تصحيح أخطاء لبنية iCE40 بدون واجهة رسومية، وبدون دعم Python، وبدون أداة التنسيب التحليلية HeAP، ومع دعم HX1K فقط: ``` mkdir -p build && cd build cmake .. -DARCH=ice40 -DCMAKE_BUILD_TYPE=Debug -DBUILD_PYTHON=OFF -DICE40_DEVICES=1k make -j$(nproc) ``` لإنشاء إصدار بناء ثابت لبنية iCE40 استخدم ما يلي: ``` mkdir -p build && cd build cmake .. -DARCH=ice40 -DBUILD_PYTHON=OFF -DSTATIC_BUILD=ON make -j$(nproc) ``` يمكن لمحلل أداة التنسيب HeAP اختياريًا استخدام OpenMP لتسريع المشاريع الكبيرة جدًا. فعّل ذلك بتمرير `-DUSE_OPENMP=yes` إلى cmake (قد يختلف دعم المترجم). يمكنك تغيير الموقع الذي سيتم تثبيت nextpnr فيه (عادةً ما يكون الافتراضي `/usr/local`) باستخدام `-DCMAKE_INSTALL_PREFIX=/install/prefix`. ملاحظات للمطورين -------------------- - جميع الأكواد منسقة باستخدام `clang-format` وفقًا لقواعد النمط في `.clang-format` (مبنية على LLVM مع زيادة عرض الإزاحة والتفاف الأقواس بعد الفئات). - لتنسيق جميع الأكواد المصدرية تلقائيًا، شغّل `make clangformat`. - انظر إلى الويكي للحصول على وثائق إضافية حول واجهة برمجة تطبيقات البنية المعمارية. تسجيل مقطع فيديو ----------------- - لحفظ تسجيل فيديو لعملية التنسيب والتوجيه، انقر على أيقونة التسجيل في شريط الأدوات واختر دليلاً فارغًا لتخزين ملفات التسجيل فيه وحدد الإطارات المطلوب تخطيها. - ابدأ يدويًا جميع عمليات التنسيب والتوجيه (PnR) التي ترغب بها - انقر على أيقونة التسجيل مرة أخرى لإيقاف التسجيل - انتقل إلى الدليل الذي يحتوي على الملفات ونفّذ `ffmpeg -f image2 -r 1 -i movie_%05d.png -c:v libx264 nextpnr.mp4` الاختبار ------- - لإنشاء الملفات الثنائية للاختبار أيضًا، استخدم `-DBUILD_TESTS=ON` وبعد `make` شغّل `make test` لتشغيلها، أو يمكنك تشغيل ملفات ثنائية منفصلة. - لاستخدام أدوات تنظيف الكود استخدم خيارات `cmake`: - `-DSANITIZE_ADDRESS=ON` - `-DSANITIZE_MEMORY=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++` - `-DSANITIZE_THREAD=ON` - `-DSANITIZE_UNDEFINED=ON` - مثال على تشغيل valgrind `valgrind --leak-check=yes --tool=memcheck ./nextpnr-ice40 --json ice40/blinky.json` - لتشغيل الاختبارات مع تغطية الكود استخدم `-DBUILD_TESTS=ON -DCOVERAGE` وبعد `make` شغّل `make ice40-coverage` - بعد ذلك افتح `ice40-coverage/index.html` في متصفحك لعرض تقرير التغطية - لاحظ أن `lcov` مطلوب من أجل إنشاء التقارير الروابط والمراجع -------------------- ### التركيب والمحاكاة وتحسين المنطق - [Yosys](https://yosyshq.net/yosys/) - [Icarus Verilog](http://iverilog.icarus.com/) - [ABC](https://people.eecs.berkeley.edu/~alanmi/abc/) ### مشاريع توثيق تدفق البت (وأدوات) FPGA - [Project IceStorm (Lattice iCE40)](https://github.com/YosysHQ/icestorm) - [Project Trellis (Lattice ECP5)](https://yosyshq.github.io/prjtrellis-db/) - [Project X-Ray (Xilinx 7-Series)](https://github.com/F4PGA/prjxray) - [Project Chibi (Intel MAX-V)](https://github.com/rqou/project-chibi) ### مشاريع FPGA حرة ومفتوحة المصدر أخرى للتنسيب والتوجيه - [Arachne PNR](https://github.com/cseed/arachne-pnr) - [VPR/VTR](https://verilogtorouting.org/) - [SymbiFlow](https://github.com/SymbiFlow/symbiflow-arch-defs)