Что такое проект IceStorm ?
Проект IceStorm направлен на обратную разработку и документирование формата битового потока ПЛИС iCE40 производства компании Lattice. Также IceStorm предоставляет простые инструменты для анализа и создания битового потока файлов. Поток Ice Storm (Yosys, Arachne-pnr и IceStorm) — это полностью открытый исходный поток для ПЛИС iCE40 с описанием на языке Verilog. В центре внимания проекта находятся чипы iCE40 LP/HX 1K/4K/8K. (Большая часть работы была сделана с помощью HX1K-TQ144 и HX8K-CT256.)
2016-01-17: Первая версия анализа синхронизации IceTime. Видео: https://youtu.be/IG5CpFJRnOk
2015-12-27: Презентация потока IceStorm на 32-ом Всемирном конгрессе хакеров ( 32C3) (Видео на Youtube).
2015-07-19: Поддержка выпуска чипов 8k. Исходный код Ice Storm перемещён на GitHub.
2015-05-27: У нас есть рабочий исходный поток полностью в открытом доступе с Yosys и Arachne-pnr! Видео:http://youtu.be/yUiNlmvVOq8
2015-04-13: К полностью переписанной программе IceUnpack добавлена IcePack и некоторые основные обновления документации.
2015-03-22: Первый публичный релиз и короткое видео на YouTube демонстрируют нашу работу: http://youtu.be/u1ZHcSNDQMM
Почему нужно выбрать Lattice iCE40 ?
Продукт имеет минималистичную конфигурацию с чётко определённой структурой. В нём не много элементов или специальных функциональных единиц. Это делает его идеальным как для обратной разработки, так и в качестве базовой платформы для универсальной разработки инструментов для ПЛИС.
Кроме того, Lattice iCEstick является доступным и простым в использовании платформы разработки приложений, что делает его интересным для всех видов проектов. (iCEstick содержит чип HX1K. Также Lattice продаёт переходную плату iCE40-HX8K с чипом HX8K.)
Каков статус проекта ?
Мы уверены, что девайс 1K и 8K полностью спроектированы. Например, мы можем представить правильную функциональную модель Verilog для всех битовых потоков, созданных Lattice iCEcube2 для iCE40 HX1K-TQ144 и iCE40HX8K-CT256, используя наш инструмент icebox_vlog.
Ниже представлен список поддерживаемых в настоящее время деталей и соответствующих опций для arachne-pnr(размещение и маршрутизация) и icetime (анализ синхронизации):
Деталь | Программный пакет | Расстояние между выводами | I/Os | Опции arachne-pnr | Опции icetime |
iCE40-LP1K-SWG16TR | 16-ball WLCSP (1.40 x 1.48 mm) | 0.35 mm | 10 | -d 1k -P swg16tr | -d lp1k |
iCE40-LP1K-CM36 | 36-ball ucBGA (2.5 x 2.5 mm) | 0.40 mm | 25 | -d 1k -P cm36 | -d lp1k |
iCE40-LP1K-CM49 | 49-ball ucBGA (3 x 3 mm) | 0.40 mm | 35 | -d 1k -P cm49 | -d lp1k |
iCE40-LP1K-CM81 | 81-ball ucBGA (4 x 4 mm) | 0.40 mm | 63 | -d 1k -P cm81 | -d lp1k |
iCE40-LP4K-CM81 | 81-ball ucBGA (4 x 4 mm) | 0.40 mm | 63 | -d 8k -P cm81:4k | -d lp8k |
iCE40-LP8K-CM81 | 81-ball ucBGA (4 x 4 mm) | 0.40 mm | 63 | -d 8k -P cm81 | -d lp8k |
iCE40-LP1K-CM121 | 121-ball ucBGA (5 x 5 mm) | 0.40 mm | 95 | -d 1k -P cm121 | -d lp1k |
iCE40-LP4K-CM121 | 121-ball ucBGA (5 x 5 mm) | 0.40 mm | 93 | -d 8k -P cm121:4k | -d lp8k |
iCE40-LP8K-CM121 | 121-ball ucBGA (5 x 5 mm) | 0.40 mm | 93 | -d 8k -P cm121 | -d lp8k |
iCE40-LP4K-CM225 | 225-ball ucBGA (7 x 7 mm) | 0.40 mm | 167 | -d 8k -P cm225:4k | -d lp8k |
iCE40-LP8K-CM225 | 225-ball ucBGA (7 x 7 mm) | 0.40 mm | 178 | -d 8k -P cm225 | -d lp8k |
iCE40-HX8K-CM225 | 225-ball ucBGA (7 x 7 mm) | 0.40 mm | 178 | -d 8k -P cm225 | -d hx8k |
iCE40-LP1K-QN84 | 84-pin QFNS (7 x 7 mm) | 0.50 mm | 67 | -d 1k -P qn84 | -d lp1k |
iCE40-LP1K-CB81 | 81-ball csBGA (5 x 5 mm) | 0.50 mm | 62 | -d 1k -P cb81 | -d lp1k |
iCE40-LP1K-CB121 | 121-ball csBGA (6 x 6 mm) | 0.50 mm | 92 | -d 1k -P cb121 | -d lp1k |
iCE40-HX1K-CB132 | 132-ball csBGA (8 x 8 mm) | 0.50 mm | 95 | -d 1k -P cb132 | -d hx1k |
iCE40-HX4K-CB132 | 132-ball csBGA (8 x 8 mm) | 0.50 mm | 95 | -d 8k -P cb132:4k | -d hx8k |
iCE40-HX8K-CB132 | 132-ball csBGA (8 x 8 mm) | 0.50 mm | 95 | -d 8k -P cb132 | -d hx8k |
iCE40-HX1K-VQ100 | 100-pin VQFP (14 x 14 mm) | 0.50 mm | 72 | -d 1k -P vq100 | -d hx1k |
iCE40-HX1K-TQ144 | 144-pin TQFP (20 x 20 mm) | 0.50 mm | 96 | -d 1k -P tq144 | -d hx1k |
iCE40-HX4K-TQ144 | 144-pin TQFP (20 x 20 mm) | 0.50 mm | 107 | -d 8k -P tq144:4k | -d hx8k |
iCE40-HX8K-CT256 | 256-ball caBGA (14 x 14 mm) | 0.80 mm | 206 | -d 8k -P ct256 | -d hx8k |
Цель нашей текущей работы — улучшение анализа синхронизации потока.
Как использовать полностью открытый исходный поток iCE40 ?
Синтез для ПЛИС iCE40 можно сделать с помощью Yosys. Размещение и маршрутизация выполняется с помощью arachne-pnr. Вот пример сценария для реализации и программирования rot example из arachne-pnr (этот пример ориентирован на макетную плату iCEstick):
yosys -p "synth_ice40 -blif rot.blif" rot.v arachne-pnr -d 1k -p rot.pcf rot.blif -o rot.asc icepack rot.asc rot.bin iceprog rot.bin
Простой отчёт анализа синхронизации можно смоделировать с помощью утилиты icetime:
icetime -tmd hx1k rot.asc
Какие инструменты ? Как установить ?
Установка необходимых компонентов (эта команда для Ubuntu 14.04):
sudo apt-get install build-essential clang bison flex libreadline-dev \ gawk tcl-dev libffi-dev git mercurial graphviz \ xdot pkg-config python python3 libftdi-dev
Установка IceStorm Tools (icepack, icebox, iceprog, icetime, базы данных чипов):
git clone https://github.com/cliffordwolf/icestorm icestorm cd icestorm make -j$(nproc) sudo make install
Установка Arachne-PNR (инструмент размещения и маршрутизации):
git clone https://github.com/YosysHQ/arachne-pnr arachne-pnr cd arachne-pnr make -j$(nproc) sudo make install
Установка Yosys (Синтез Verilog):
git clone https://github.com/YosysHQ/yosys yosys cd yosys make -j$(nproc) sudo make install
Программа Arachne-PNR конвертирует тексты базы данных чипов IceStorm в бинарные базы данных чипов arachne-pnr. Всегда восстанавливайте Arachne-PNR после обновления установки IceStorm .
Примечания для Linux: Создайте файл /etc/udev/rules.d/53-lattice-ftdi.rules со следующей строкой в нём, чтобы загружать битовые потоки на Lattice iCEstick и/или на переходную плату Lattice iCE40-HX8K в качестве непривилегированного пользователя:
ACTION=="add", ATTR {idVendor}=="0403", ATTR{idProduct}=="6010", MODE:="666"
Примечания для Archlinux: просто установите icestorm-git, arachne-pnr-git и yosys-git из пользовательского репозитория Arch (не обязательно следовать инструкциям, указанным выше).
Примечания для OSX: Пожалуйста, следуйте дополнительным инструкциям OSX для установки в OSX.
Пожалуйста, задайте вопрос на github, если у вас есть дополнительные замечания по процедурам установки операционной системы по вашему выбору.
Что такое IceStorm Tools ?
IceStorm Tools- это несколько небольших программ для работы с файлами битового потока iCE40 и наше представлениеASCII. Полностью открытый исходный поток iCE40 состоит из IceStorm Tools, Arachne-PNR и Yosys.
IcePack/IceUnpack
Программа iceunpack конвертирует бинарный файл iCE40 в формат IceStorm ASCII, в котором есть блоки 0 и 1 для конфигурации битов для каждого элемента в чипе. Программа icepack конвертирует такие ASCII файлы назад в бинарные файлы iCE40. Все остальные инструменты IceStorm работают с форматом файла ASCII, но не с бинарными файлами битовых потоков.
IceTime
Программа icetime — это инструмент анализа синхронизации iCE40. Она считывает структуры кода в формате IceStorm ASCIIи записывает периодичность списка связей синхронизации, которые могут быть использованы в анализаторах внешней синхронизации. Программа также включает в себя топологический анализатор синхронизации, который можно использовать для создания отчётов синхронизации.
IceBox
Библиотека python и различные инструменты для работы с файлами IceStorm ASCII, а также доступ к базе данных устройства. Например, icebox_vlog конвертирует содержимое нашего файла битового потока ASCII в файл Verilog, который реализует эквивалентную цепь.
IceProg
Небольшая программа-драйвер для устройств программирования на основе FTDI, которые используются на iCEstick и макетной плате HX8K.
IceMulti
Инструмент для распаковки множественных файлов битового потока в один iCE40 мультизагрузочный файл-изображение.
IcePLL
Небольшая программа для вычисления параметров конфигурации ФАПЧ iCE40.
IceBRAM
Небольшая программа для замены содержимого BRAM в файлах IceStorm ASCII. Например, для замены изображения микропрограммы в СНК без повторного запуска синтеза, размещения и маршрутизации.
ChipDB
Сборочный файл IceStorm создаёт и устанавливает два файла: chipdb-1k.txt и chipdb-8k.txt. Эти файлы содержат всю необходимую информацию для размещения и маршрутизации схемы в arachne-pnr и создают файл IceStorm ASCII для размещённой и маршрутизированной схемы.
Clifford Wolf — написал IcePack/IceUnpack, IceBox, IceProg, IceTime и IcePLL.
IcePack/IceUnpack основаны на базовой реализации, предоставленной Mathias Lasser.
Marcus Comstedt — написал IceMulti.
Где я могу получить поддержку или познакомиться с другими пользователями IceStorm ?
Если у вас есть вопросы по потоку IceStorm, используйте тег <yosys> на stackoverflow, чтобы задать ваш вопрос. Если ваш вопрос касается дизайна разработки Verilog HDL, можно пременить тег <Verilog> на stackoverflow.
Для общего обсуждения зайдите на Yosys Subreddit или #yosys на freenode IRC.
Если у вас есть отчёт об ошибке, пожалуйста, задайте вопрос на github. (IceStorm Issue Tracker, Yosys Issue Tracker, Arachne-PNR Issue Tracker)
Как найти информацию ?
Рекомендованная литература: Lattice iCE40 LP/HX Family Datasheet, Lattice iCE Technology Library (особенно три страницы из «Architecture Overview», «PLB Blocks», «Routing» и «Clock/Control Distribution Network» in the Lattice iCE40 LP/HX Family Datasheet. Сначала прочитайте, а затем вернитесь сюда).
Структура ПЛИС разделена на компоненты. Есть компоненты IO, RAM и LOGIC.
LOGIC Tile Documentation (Документация компонентов LOGIC);
IO Tile Documentation (Документация компонентов IO);
RAM Tile Documentation ( Документация компонентов RAM);
The Bitstream File Format (Формат файла битового потока);
The iCE40 HX1K Bit Docs (Документация битов iCE40 HX1K);
The iCE40 HX8K Bit Docs (Документация битов iCE40 HX8K).
Программу iceunpack можно использовать для преобразования битового потока в файл ASCII с блоком символов 0 и 1 для каждого элемента.
Например:
.logic_tile 12 12 000000000000000000000000000000000000000000000000000000 000000000000000000000011010000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000001011000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000001000001000010101010000000000 000000000000000000000000000101010000101010100000000000
Эти биты в документации обозначаются By[x]. Например, B0- это первая строка, B0[0]- первый бит в первой строке, иB15[53]- последний бит в последней строке.
Программу icebox_explain можно использовать для преобразования этого блока конфигурации битов в описание конфигурации ячейки:
.logic_tile 12 12 LC_7 0101010110101010 0000 buffer local_g0_2 lutff_7/in_3 buffer local_g1_4 lutff_7/in_0 buffer sp12_h_r_18 local_g0_2 buffer sp12_h_r_20 local_g1_4
IceBox содержит базу данных соединений и конфигурации битов для компонентов iCE40. В эту базу данных можно войти с помощью IceBox Python ИПП, но это будет долгой и нудной процедурой. Поэтому рекомендуется использовать IceBox ИПП, чтобы преобразовать эту базу данных в подходящий формат целевого приложения. См. icebox_chipdb как пример программы, которая выполняет это действие.
Рекомендуемый подход к обучению, как использовать эту документацию -это синтезировать очень простую схему, используяYosys и Arachne-pnr, запустить инструмент icestorm icebox_explain в конечных файлах битового потока и проанализировать результаты, используя HTML экспорт базы данных, указанной выше. icebox_vlog можно использовать для преобразования битового потока в Verilog. Файл вывода данных этого инструмента определит путь прохождения сигнала в комментариях, добавленных к сгенерированному коду Verilog:
Например, рассмотрим следующие файлы Verilog и PCF:
// example.v module top (input a, b, output y); assign y = a & b; endmodule # example.pcf set_io a 1 set_io b 10 set_io y 11
И запустите их через Yosys, Arachne-PNR и IcePack:
$ yosys -p 'synth_ice40 -top top -blif example.blif' example.v $ arachne-pnr -d 1k -o example.asc -p example.pcf example.blif $ icepack example.asc example.bin
Мы получим что-то наподобие следующих данных вывода:
$ icebox_explain example.asc Reading file 'example.asc'.. Fabric size (without IO tiles): 12 x 16 .io_tile 0 10 IOB_1 PINTYPE_0 IOB_1 PINTYPE_3 IOB_1 PINTYPE_4 IoCtrl IE_0 IoCtrl IE_1 IoCtrl REN_0 buffer local_g0_5 io_1/D_OUT_0 buffer logic_op_tnr_5 local_g0_5 .io_tile 0 14 IOB_1 PINTYPE_0 IoCtrl IE_1 IoCtrl REN_0 buffer io_1/D_IN_0 span4_vert_b_6 .io_tile 0 11 IOB_0 PINTYPE_0 IoCtrl IE_0 IoCtrl REN_1 routing span4_vert_t_14 span4_horz_13 .logic_tile 1 11 LC_5 0001000000000000 0000 buffer local_g0_0 lutff_5/in_1 buffer local_g3_0 lutff_5/in_0 buffer neigh_op_lft_0 local_g0_0 buffer sp4_h_r_24 local_g3_0
И приблизительно следующий вывод данных icebox_vlog :
$ icebox_vlog -p example.pcf example.asc // Reading file 'example.asc'.. module chip (output y, input b, input a); wire y; // io_0_10_1 // (0, 10, 'io_1/D_OUT_0') // (0, 10, 'io_1/PAD') // (0, 10, 'local_g0_5') // (0, 10, 'logic_op_tnr_5') // (0, 11, 'logic_op_rgt_5') // (0, 12, 'logic_op_bnr_5') // (1, 10, 'neigh_op_top_5') // (1, 11, 'lutff_5/out') // (1, 12, 'neigh_op_bot_5') // (2, 10, 'neigh_op_tnl_5') // (2, 11, 'neigh_op_lft_5') // (2, 12, 'neigh_op_bnl_5') wire b; // io_0_11_0 // (0, 11, 'io_0/D_IN_0') // (0, 11, 'io_0/PAD') // (1, 10, 'neigh_op_tnl_0') // (1, 10, 'neigh_op_tnl_4') // (1, 11, 'local_g0_0') // (1, 11, 'lutff_5/in_1') // (1, 11, 'neigh_op_lft_0') // (1, 11, 'neigh_op_lft_4') // (1, 12, 'neigh_op_bnl_0') // (1, 12, 'neigh_op_bnl_4') wire a; // io_0_14_1 // (0, 11, 'span4_horz_13') // (0, 11, 'span4_vert_t_14') // (0, 12, 'span4_vert_b_14') // (0, 13, 'span4_vert_b_10') // (0, 14, 'io_1/D_IN_0') // (0, 14, 'io_1/PAD') // (0, 14, 'span4_vert_b_6') // (0, 15, 'span4_vert_b_2') // (1, 11, 'local_g3_0') // (1, 11, 'lutff_5/in_0') // (1, 11, 'sp4_h_r_24') // (1, 13, 'neigh_op_tnl_2') // (1, 13, 'neigh_op_tnl_6') // (1, 14, 'neigh_op_lft_2') // (1, 14, 'neigh_op_lft_6') // (1, 15, 'neigh_op_bnl_2') // (1, 15, 'neigh_op_bnl_6') // (2, 11, 'sp4_h_r_37') // (3, 11, 'sp4_h_l_37') assign y = /* LUT 1 11 5 */ b ? a : 0; endmodule
Ссылки на проекты
- J1a SwapForth built with IceStorm
- A Spanish FPGA Tutorial using IceStorm
- Lattice iCEBlink40 Programming Tool
- Another iCEBlink40 Programming Tool
Платы iCE40
- Lattice iCEstick
- IcoBoard
- wiggleport
- ICEd = an Arduino Style Board, with ICE FPGA
- CAT Board
- eCow-Logic pico-ITX Lattice ICE40 board
- Nandland Go Board
Другие проекты обратной разработки ПЛИС ( FPGA)
- Xilinx xc6slx9 reverse engineering, Wolfgang Spraul
- From the bitstream to the netlist, Jean-Baptiste Note and Éric Rannaud
От битового потока до списка связей, Jean-Baptiste Note и Éric Rannaud
В документах и отчётах, пожалуйста, ссылайтесь на Проект IceStorm следующим образом: Clifford Wolf, Mathias Lasser, Project IceStorm, http://www.clifford.at/icestorm , например, используя следующий BibTeX код:
@MISC{IceStorm, author = {Clifford Wolf and Mathias Lasser}, title = {Project IceStorm}, howpublished = "\url{http://www.clifford.at/icestorm/}" }
Большая часть документации предоставлена Clifford Wolf <clifford@clifford.at> в 2015. Основана на исследованиях Mathias Lasser и Clifford Wolf.
Купите iCEstick или макетную плату iCE40-HX8K от Lattice увидите, что можно сделать с помощью предоставленной здесь информации и инструментов.
Источник www.clifford.at