Проект IceStorm

Что такое проект IceStorm ?

Проект IceStorm направлен на обратную разработку и документирование формата битового потока ПЛИС iCE40 производства компании Lattice. Также IceStorm предоставляет простые инструменты для анализа и создания битового потока файлов. Поток Ice Storm (YosysArachne-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-gitarachne-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

Ссылки на проекты

Платы 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)

От битового потока до списка связей, 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 <[email protected]> в 2015. Основана на исследованиях Mathias Lasser и Clifford Wolf.

Купите iCEstick или макетную плату iCE40-HX8K от Lattice увидите, что можно сделать с помощью предоставленной здесь информации и инструментов.

Источник www.clifford.at

Оставьте комментарий