Комментарии 39

А почему за генерацию клока на счётчике (я так понимаю, это банальное деление частоты внешнего клока?) ругали?


Насчёт генерации "внутри", как в статье:


  1. Не было желания в петлю воткнуть цепочку из нескольких инверторов или повторителей? Просто чтобы гарантировать, что "генератор" не переклинит в каком-нибудь метастабильном состоянии.
  2. Зависимость частоты от температуры не смотрели?

На сегодняшний момент уже не вспомню причин почему ругали за кривой клок.
Да, я хотел сгенерировать клок из последовательно соединенных элементов, но возможно это уже другая статья будет в которой можно учесть воздействие температуры :)

А какая цель этих манипуляций? Независимость от вендора/платформы?

Как я понимаю этот вопрос, за формирование тактовой частоты отвечает специфический аналоговый компонент (PLL). И когда вы будете переносить дизайн с FPGA на ASIC, вам всё равно придётся копаться в вендорском решении, ну, только предоставлять его будет фабрика, а не производитель FPGA. Так что лучше заранее приготовиться к тому, что генерация частот зависит от платформы. Вынести её в отдельный исходный файл, что ли.

Я в статье написал что цель сгенерировать частоту на примитивах. В принципе я понимаю что у каждого примитива своя частота задержки. Но хотел посмотреть на это нагляднее и остальным показать.

Я тоже для прикола замыкал вход «инвертора» на выход внутри Arria2 GX, частота получалась около 1ГГц. Но она была совершенно не юзабельная, а вот когда я её поделил на 2 простым счётным триггером, то уже на 500МГц работал тестовый проект, заполняющий кристалл почти на 95%. Вот только с термостабильностью у него была беда, согласен. Плавала от примерно 550МГц до 480МГц. Измерения примерные т.к. измерял поделённую частоту.

Норм. Хотя частота более 11 ГГц выглядит результатом гонок, а не работы мультиплексора.
Но "анакуа"? Арриям, Виртексам и прочим "топовым" кристаллам никуда не впёрлись такие дрянные источники частоты. А у кристаллов типа "как-бы продвинутая CPLD" (MAX X) и так есть встроенный RC(?) генератор и, вроде, относительно стабильный.

1. Может быть полезено при разработке ГСЧ.
2. Как внутренний, резервный независимый генератор, т.к. внешний может выйти из строя, его могут отключить или манипулировать его частотой. Можно асинхронно переключиться на него в случае ЧП и тактировать им некую аварийную логику, которая сделает что-то полезное.
3. Предполагаю, что подобные схемы можно использовать как дополнительный способ защиты от атак по питанию.

Пункты 1 и 3. Предполагаю, что как раз с питанием такой генератор будет скоррелирован очень сильно.


Пункт 2. Если у злоумышленника есть доступ к Вашему железу, то ПЛИСке останется только пошире раздвинуть… выводы.


Всё — на уровне КМК.

Пункты 1 и 3. Предполагаю, что как раз с питанием такой генератор будет скоррелирован очень сильно.
Безусловно будет корреляция с питанием, но не только с ним, фактически PVT зависимость (process.voltage.temperature). Но наличие подобной корреляции не означает, что вы сможете точно предсказать состояние генератора. Да, как ГСЧ сам по себе такой генератор будет плох, но очень полезен как подсистема для усиление ГСЧ или дешевое средство для усложнения атаки по питанию.

Если у злоумышленника есть доступ к Вашему железу, то ПЛИСке останется только пошире раздвинуть… выводы.
Вот тут я бы не сдавался, есть ещё за что побороться. У xilinx в 7 семействе есть возможность изнутри ПЛИС стереть энергозависимую память на батарейке, в которой хранится ключ битстрима, тем самым окирпичить девайс. А, кажется, в ultrascale есть даже возможность писать в эту память (разумеется, без возможности чтения) изнутри ПЛИС, что открывает ещё более интересные возможности.
Если не секрет, все эти эксперименты — вы так развлекаетесь со старением кремния и PUF-ами?

примитивы имеют разную задержку работы в зависимости от расположения

Но здесь есть нюансы, вы всё же имеете некоторый контроль (пусть и неполный) над расположением. Это достигается с помощью физических констрейнтов: можно ведь указать какой именно элемент выбрать (координаты и т.д.). Если глянете гайды по клоковым ресурсам, то сможете найти и критерий выбора — поближе к клоковым буферам, а вот чего наверно всё же не сможете контролировать, так это выбор конкретной линии к нему, впрочем, там наверно можно констрейнт по времянкам потуже навернуть.

По поводу LUT в Spartan-e, а вы ведь пробовали примитивы из Language Templates?

По поводу влияния температуры вопросы тоже остаются.
Да, я пробовал примитивы из Language Templates, параллельно заглядывая в «Spartan-6 Libraries Guide for HDL Designs(UG615)»
Ваши мега эксперименты попахивают филькиной грамотой. Не могут компоненты ПЛИС работать нормально на частотах выше 1ГГц (да и гигагерц — это почти фантастика), а то что у Вас получилось — это просто шум в кремние с «какой-то» фильтрацией, подогнанной для получения результатов высосанных с пальца.
И причина то не в глупости, а упрямстве скорее. Если бы Вы послушали знающих людей, они бы Вам рассказали, насколько шумит Ваш синтетический клок, какие методики есть устранения этого шума, а также показали вам вот такой документ для Kintex, где чёрным-по-белому написано, что максимальная частота работы единичного слайса (CPL), включительно FF, как составляющих, не может быть выше 5.5 ГГц (Setup + Hold), но при этом нужно учитывать время на Рутинг, который в Вашем случае произошёл как попало. С того же документа, можно выяснить, что максимальное время переключения мультиплексора порядка 0,4 нс — а это не более 2,5 ГГц рабочей частоты.
Если же заглянуть в документацию по Virtex-5, так там в табличке на с.28 и вовсе указаны максимальные рабочие частоты для компонентов, которые не превышают даже 500 МГц. Соответственно как у Вас получились фантастические измерения выше гигагерцов, при максимальных рабочих частотах кристалла до полугигагерца остаётся загадкой.
И это не говоря, про разброс в температурных режимах, про то, какой skew фронта у полученного «клока», про его джиттер (тут вообще страшно представить что творится) и шум.
Это написано не для оскорбления, но для того чтобы побудить автора разобраться что такое setup/hold флип-флопа, базовые принципы routing'а и фиксации проекта на floorlan, трассировки и констрейнов.
Дабы комментарий не показался голословным, у меня имеется проект по детектированию частот порядка 1.2 ГГц (расчётно) с внешнего источника, который реальную точность выдаёт не более 800-900 МГц. И схемы там накручены похлеще вашего счётчика (32-бит!!! ЗАЧЕМ? КАК?) с очень медленным компаратором и комбинационным сложением (для Xilinx есть сложение через CSA — намного менее ресурсоёмкое и быстрое).
В принципе вы правы, то что я сделал и показал не до конца проработано(в заключении я об этом сказал). Если вы знаете как провести подобные измерения в моих условиях, то говорите я попытаюсь их реализовать. Я за точные измерения.
Выполнить точные измерения реально, но зачем? Как эксперимент на коленке с вкраплениями «ненормального программирования» этого достаточно. Как реальный проект для конкретных задач… лучше не стоит себя обнадёживать. Да, такие схемы работоспособны как делитель при правильных констрейнах, но не более.
Что действительно важно, повторюсь, это понять принципы работы констрейнов, занятся floorplan'ом и зафиксировать синтезированную схему (можно жёстко, можно по partition'ам), а также написать сопутствующие констрейны.
Когда Вы добьётесь 100% повторяемости эксперимента для разных конфигураций и с различными компонентами (как часто бОльшего проекта или дублирование текущего в 3-4 местах), тогда вы пройдёте половину нужного пути.
Дальше придётся разобраться на каких примитивах это всё построено, почему на них и как они работают. Чем отличается DSP от сумматора на LUT'ах и т.п. Также рекомендую уменьшить разрядность счётчика до адекватного. Реально контролировать изменения в 20-50 единиц не требует 2^32 счётчика. Оно и места занимает и частоту садит.
Что же касается ответа на вопрос «как провести подобные измерения в Ваших условиях» дам подсказку и если будет желание можете попробовать решить: Вам нужно построить схему детектирования, которая будет работать на порядки быстрее анализируемого компонента. тогда с точностью этого порядка Вы сможете вычислить реальную генерированную частоту. По сути нужно погуглить фразу «time to digital converter», которая внесёт кое-какую ясность.

Вопрос автору: я правильно понимаю, что внутри плис счетчики, на которых вы считаете гигагерцы, отрабатывают счет на данной частоте безо всяких проблем?

Плохо понял вопрос. проверку работоспособность счетчиков на гигагерцах не проверял
Частота на луте: 5761.1 МГц

Вы подаете этот сигнал на счетчик, что бы вы числить эту частоту. Значит счетчик считает эту частоту безо всяких проблем?
Я на это надеюсь) но в любом случае я запускал несколько раз и в среднем получал этот результат.
Я вот сильно в этом сомневаюсь. А проверить просто: подайте на этот счетчик сигнал с выхода PLL/MMCM и постепенно увеличивайте частоту. В какой то момент он должен начать врать. Я видел в доках Xilinx на 7й Kintex передельные значения частот для счетчиков — там были значения заметно ниже 1ГГц (что то около 700МГц, точно не помню).
Хмммм, когда мне китайская плисина прийдет, тоже надо будет попробовать, интересно стало.
Более точные измерения для таких осцилляторов проведены в этом году в Манчестере:
www.research.manchester.ac.uk/portal/files/169709445/FPGADefender_Malicious_Self_Oscillator_Scanning_for_Xilinx_UltraScale_FPGAs.pdf
В конце статьи есть ссылка на github. Попытаюсь сопоставить результаты с учетом того, что Kintex 7 — это 28 нм, а у англичан 16 нм. Для измерений использовался time-to-digital converter температура которого отличалась от измеряемой схемы. Интересно, что расчитанные Vivado значения задержки и частоты хорошо соответствуют измеренным. Правда, я не понял можно ли в Vivado подставлять значения температуры и напряжения питания. Конкретные цифры из Table 2: максимальная частота на MUX7 — 1126MHz (здесь 5953.89 МГц), минимальная частота на LUT6 — 1927MHz (здесь 379.98 МГц). Интересен также Fig. 11, где показаны расчитанные Vivado задержки от каждого из входов LUT6 на выход, самая большая 177ps. Правда, мне не понятно почему разница между этими задержками не постоянна и составляет примерно 25, 35 и 15ps. Кстати, если есть контроль температуры и напряжения питания, можно было бы провести эксперимент характеризующий эффект второго порядка. А именно, исследовать как происходит разбаланс задержек внутри LUT. Каждый вход LUT открывает одну группу транзисторов и закрывает другую. При комнатной температуре и номинальном напряжении питания это должно происходить (и наверное происходит) одновременно. Понятно, что есть какой-то диапазон параметров, в котором эти задержки равны друг другу, потом происходит разбаланс. Мне не попадались статьи на эту тему. Каким образом можно увидеть этот разбаланс? Собрать два кольцевых осциллятора, первый полностью на инверторах, а второй почти полностью на повторителях (буферах) и одном инверторе. Дальше делается развертка по температуре или/и напряжению. В какой-то момент задержка повторителя и инвертора начнут отличаться, что приведет к изменению частоты.
Правда, мне не понятно почему разница между этими задержками не постоянна и составляет примерно 25, 35 и 15ps.

На рисунке 11 в статье по вашей ссылке логическая схема, авторы сами говорят, что было бы неплохо увидеть низкоуровневую реализацию (low-level ASIC details of any Xilinx FPGA), в физической там как минимум длины дорожек будут отличаться и вносить разную задержку.
Дорожки внутри LUT короткие и вряд ли их задержка сопоставима с задержкой транзистора. Что касается низкоуровневой реализации, то там всего два варианта — либо pass transistor, либо transmission gate. Вот статья, где обсуждаются размеры транзисторов для первого варианта
www.eecg.utoronto.ca/~vaughn/papers/fpt2013_coffe.pdf
а вот патенты Xilinx для второго варианта
US6809552 US6998872 US7471104
patents.google.com
В любом из вариантов имеется линейка буферов, разделяющая слои транзисторов. Зачем распределять задержки слоев именно как 25, 35, 15 конечно интересно, но для меня не принципиально.
Понятно, что есть какой-то диапазон параметров, в котором эти задержки равны друг другу, потом происходит разбаланс. Мне не попадались статьи на эту тему.

А не хотите ли глянуть тему physical design, особенно метрики и формулы? Вроде там есть всё, что вы ищете.
Не то чтобы не хочу, не вижу смысла. Расчеты по формулам будут приближенными и дадут тот же результат, который даст Vivado.
Kстати, экспериментов с осцилляторями на Altera я не видел. Возможно, там просто запрещены комбинационные обратные связи. Вообще, FPGA в технологии 28nm и меньше кроме Xilinx и Altera делают не так много фирм. Вот западные, которые я знаю FD-SOI: Lattice 28nm, Cologne Chip 28nm, QuickLogic 22/28nm, FinFET: Efinix 16nm, Achronix 7nm и две китайские 28nm
www.anlogic.com/down.aspx?fid=t14:11:14&typeid=11
www.isilicontech.com/page29

По наводке из руин известного хранилища инкунабул:
http://www.530.ru/wwwboards/fpga/91/messages/33081.shtml
можно найти, например, статью "VCO uses programmable logic" (с использованием EPM3032, стр. 106, из EDN nov. 2002?):
https://web.archive.org/web/20040406161743/www.reed-electronics.com/ednmag/contents/images/111402di.pdf


Ну и вообще там покопаться. Есть ссылки (протухшие, наверное, на документы Xilinx, Actel). ЕМНИП, и на MAX7000 кто-то делал генератор.

CPLDs в настоящее время стоят дороже FPGAs, причем для 180nm и меньше они реализуются на LUTs. В технологии меньше 55nm я CPLDs не видел. Дело лишь в области применения.

Ну-у-у… начинается… Вопрос был про Альтеру, безотносительно к архитектуре и проектным нормам. ;-)

Тут нужно понимать что полезного можно делать с осциллятором. Можно определить скорость прохождения сигнала по самому короткому и самому длинному пути на кристалле, что ещё? Англичане с помощью осциллятора изучают утечку информации. Можно ли так делать в классическом CPLD или/и в CPLD на LUT? Я не знаю. Если смотреть с точки зрения задержек, то в классическом CPLD логический элемент, скорей всего, имеет разную задержку по входам.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.