?

Log in

No account? Create an account

Особенности национальной работы - Общество дровосеков Бердичева по изучению Мишны

Mar. 1st, 2013

05:58 pm - Особенности национальной работы

Previous Entry Share Next Entry

Или "гладко было на бумаге, да забыли про овраги".



Языки описания логических схем, например, Verilog или VHDL, основаны на возможности записывать асинхронные процессы, активирующиеся по изменению значений переменных.
Например, если нужно, чтобы что-то происходило по переднему фронту сигнала clock, так и пишем: always @(posedge clock) begin ... end. Если нужно, чтобы значение переменной перевычислялось каждый раз, когда изменяется любая из переменных, входящая в выражение, пишем, например, так: assign var = expression; или так: always @* begin ... end. Здесь @* означает "если какая-нибудь из переменных, упомянутых внутри блока c целью прочитать ее значение, изменится, выполнить блок".

Теперь, допустим, у нас есть элемент асинхронной памяти, активной не по фронту, а по уровню разрешения на запись, т.е. всегда, когда сигнал разрешения на запись равен 1, реализованный как

always @*
    if (write_enable) mem[address] = data;
Что произойдет, если в какой-то момент write_enable равно единице, а переменная address изменится? Активируется этот процесс, и запишет текущее значение data в ячейку памяти по адресу, соответствующему новому значению переменной address. С точки зрения софтверного симулятора языка Verilog или VHDL - ровно в одну ячейку.

Подумаем, как бы эта память была реализована в хардвере. Слегка упрощая, у каждой ячейки будет свой блок логических элементов, побитно сравнивающих входящий адрес с ее собственным и делающих логическое И результата сравнения c сигналом write_enable, чтобы понять, надо записывать в себя входящие данные или нет.
И если address меняется, скажем, с 1 (...001) на 2 (...010), а проводочки для разных бит чуть-чуть разной длины, то может случиться краткий миг, когда сочетание значений бит будет или ...000, или ...011, и ячейка с адресом 0 или 3 решит в себя что-нибудь записать, совершив тем самым неприемлемое самоуправство.
Бороться с этим в хардвере очень просто - достаточно перед изменением значения переменной address установить сигнал write_enable в 0, а после изменения адреса выждать время, достаточное для нивелировки разницы времени распространения сигнала по отдельным битам адреса, после чего установить write_enable в 1.
А вот бороться с непониманием этого отличия софтверной симуляции от хардвера в головах отдельных инженеров гораздо труднее. Я уже второй день мучаюсь.

Comments:

[User Picture]
From:amigofriend
Date:March 2nd, 2013 02:41 am (UTC)
(Link)
Надо установить значение переменной enable_understanding в 1!
(Reply) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 02:53 am (UTC)
(Link)
Ее сначала надо в голове инженера объявить, а кто ж это дасть?
(Reply) (Parent) (Thread)
[User Picture]
From:amigofriend
Date:March 2nd, 2013 03:25 am (UTC)
(Link)
Ай-я-яй. Иженерики, инженерики, непрошиты, стареньки!
(Reply) (Parent) (Thread)
[User Picture]
From:starshoj
Date:March 2nd, 2013 02:47 am (UTC)
(Link)
Что произойдет, если в какой-то момент write_enable равно единице, а переменная address изменится?

Могу Вам сказать, что произийдёт с работающим на меня инженером, если он такое слепит: я его лично подвешу к потолку на крюке вдетом в самую важную часть его анатомии и заствлю съесть его диплом
(Reply) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 02:53 am (UTC)
(Link)
с работающим на меня

Так-то просто. А с клиентом?
(Reply) (Parent) (Thread)
[User Picture]
From:starshoj
Date:March 2nd, 2013 03:09 am (UTC)
(Link)
„О, какое у Вас красивое и оригинальное решение, но я не умею без write enable”
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 03:17 am (UTC)
(Link)
Те, которые уже клиенты, обычно обладают достаточной квалификацией. А вот потенциальные... "Тогда мы ваш продукт не купим" - плохой, негодный ответ.
(Reply) (Parent) (Thread)
[User Picture]
From:fregimus
Date:March 2nd, 2013 04:32 am (UTC)
(Link)
А вы такие метастабильные состояния умеете отлавливать? Вряд ли ведь их можно с какой-то пользой применять, — кажется, что это ошибка.

Edited at 2013-03-02 04:32 am (UTC)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 04:56 am (UTC)
(Link)
Конечно, это ошибка, но объяснить это разработчику непросто - "у него всё работает".
(Reply) (Parent) (Thread)
[User Picture]
From:fregimus
Date:March 2nd, 2013 04:59 am (UTC)
(Link)
Разработчику чего, не совсем понял — симулятора? То есть, он (симулятор) должен сообщить об этой ошибке, но не сообщает?
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 05:08 am (UTC)
(Link)
Нет, разработчику дизайна. На симуляторе А у него всё работает, на симуляторе Б - ничего не работает; значит, он мыслит, в симуляторе Б ошибка. Поверить, что ошибка у него самого, он не в состоянии, т.к. у него же на симуляторе А всё работает!
(Reply) (Parent) (Thread)
[User Picture]
From:fregimus
Date:March 2nd, 2013 05:13 am (UTC)
(Link)
А почему ни симулятор А, ни симулятор Б не сообщают о метастабильности? Непорядок!
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 05:40 am (UTC)
(Link)
Симулятор А, если я правильно понимаю, теоретически может, если его об этом попросить, предварительно разделив переменную адреса на отдельные биты. Симулятор Б фактически сообщает о метастабильности, производя результаты, отличные от ожидаемых.
(Reply) (Parent) (Thread)
[User Picture]
From:fregimus
Date:March 2nd, 2013 05:45 am (UTC)
(Link)
Симулятор Б — нет. Фактически, не сообщает. Например, есть такие отладчики для многотредных программ, что сообщают о возможном несинхронизированном доступе к памяти. Это одно. А говорить, что программа и без такого специального инструмента будто бы «сообщает» о том же, падая или выдавая некорректный результат, неверно. Нужно, чтобы оно пальцем сюда ткнуло и сказало, мол, видишь? тут метастабильность. Извиняюсь за максимализм.
(Reply) (Parent) (Thread)
[User Picture]
From:b0p0h0k
Date:March 2nd, 2013 05:25 am (UTC)
(Link)
Должно быть что-то вроде линта или коверити.
И вообще, у памяти в спеке написано, какой минимальный интервал требуется между изменением адреса и стробом записи. Где-то в дизайне эта цифра должна профигурировать. Кто-то где-то должен этот интервал энфорсить.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:March 2nd, 2013 05:36 am (UTC)
(Link)
Это будет делаться гораздо дальше по ходу разработки. Функционального дизайнера такие мелочи не интересуют.
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:March 2nd, 2013 04:38 pm (UTC)
(Link)
Проблема, разумеется, не в симуляторе и даже не разработчике, который пишет подобный код. Проблема в языке. Что VHDL, что Verilog — примерно один хрен — имеют слишком рыхлую парадигму и позволяют выразить бессмысленные с точки зрения схемотехники сущности. Причем объяснить человеку, чем формально отличается синтезируемая схема от несинтезируемой — задача очень нетривиальная.

Я довольно давно вынашиваю планы запилить свой HDL-язык с pattern matching'ом и datatyp'ами. Одна из основных идей (помимо перехода на современную систему типизации с вменяемым синтаксисом взамен устаревшей моды 80-х) — строгое соответствие языка нехитрой парадигме, которая доступна любому нормальному программисту и не сложнее, а даже, пожалуй, проще традиционных парадигм из области обычного программирования. Попробую изложить ее в одном абзаце.

Вся схема (как и каждый компонент) является просто функцией (большой арности и коарности) сигналов. Сигнал с точки зрения языка представляет собой значение некоторого типа, изоморфного бесконечному списку. При оперировании входными сигналами можно брать «текущий» элемент списка или один из «предыдущих» (на фиксированную глубину), для того чтобы сформировать значения «следущих» элементов списков выходных сигналов. Собственно, в этом и должно заключаться всё программирование. Композиция компонентов выражается как композиция функций изоморфна. Разумеется, это ограничивает множество выразимых схем — все они должны тактироваться одним клоком, который никак не дается программисту явно, а определяет понятие «текущий» и «предыдущий» в списке. (Ну еще полезно добавить ресет, который тоже задается неявно и выражается в том, что программист должен задать начальное состояние.) Как мне кажется, данная парадигма должна легко приниматься любым программистом, особенно функциональщиком. И, главное, все выразимые в ней схемы гарантированно являются синтезируемыми при некоторых естественных, встроенных в язык, ограничениях на типы и преобразования (не должно быть рекурсии и императивных циклов).

Конечно, не все полезные схемы попадают в класс выразимых. Но сложные места вроде переходов между клок-доменами можно изолировать и отдать на разработку опытному схемотехнику, который знает как минимум про код Грея.

Когда я изучал, что в мире делается в этом направлении, находил несколько интересных проектов в этом направлении. В основном попадаются погружения DSL в мощный язык типа хаскеля. Lava, ForSyDe — из этой области.
(Reply) (Thread)
[User Picture]
From:thesz
Date:March 3rd, 2013 07:48 am (UTC)
(Link)
1) если сделать тип Wire clock dataType, то можно делать и типизированные многочастотные схемы.

2) сравнение с образцом делали. Довольно удобно получается.

3) НО! всё портит такой ресурс, как время. Количество переключений в одном такте ограничено. Поэтому произвольная композиция работать не будет.
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:March 3rd, 2013 04:13 pm (UTC)
(Link)
1. Не очень понятно. Это тот же тип-список, но дополнительно параметризованный клоком? Тогда формализм прост, но надо как-то уметь связывать между сигналы разных типов. И там должен вылезти неустранимый недетерминизм (мы ведь не верим в идеальные тактовые генераторы?).

2. А где нынче находится передний край науки? А то мои текущие познания на пару лет устарели.

3. Разводимость — фундаментальная проблема, едва ли ее можно куда-нибудь упрятать. Всё равно нужно думать о том, чтобы комбинационная часть не была слишком глубокой. Кроме того, в предлагаемой парадигме под функцией подразумевается не чисто комбинационная функция, а некий аналог VHDL-ного компонента (с регистрами внутри). То есть композиция не обязательно ухудшает разводимость.
(Reply) (Parent) (Thread)
[User Picture]
From:thesz
Date:March 3rd, 2013 08:28 pm (UTC)
(Link)
1. Это абстрактный тип. Может быть списком, а может и не быть. Соединение делается через предопределенные компоненты, написанные на другом языке.

2. Не знаю. Как практик, всего лишь следую. ;)

3. Это самый сложный вопрос, если честно. Ваше решение столь же плохо, как и все другие (мои в том числе). ;)
(Reply) (Parent) (Thread)
[User Picture]
From:thesz
Date:March 3rd, 2013 07:49 am (UTC)
(Link)
И последнее.

Если вы знаете Haskell, то просьба послать резюме на jobs@parsci.com ;)
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:March 3rd, 2013 05:31 pm (UTC)
(Link)
Haskell — да, FPGA — да. А интересна ли такая форма сотрудничества как перекрестное опыление между организациями?
(Reply) (Parent) (Thread)
[User Picture]
From:thesz
Date:March 3rd, 2013 08:28 pm (UTC)
(Link)
Интересна. ;)
(Reply) (Parent) (Thread)
[User Picture]
From:thesz
Date:March 3rd, 2013 07:49 am (UTC)
(Link)
(резюме на английском, конечно же)
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:March 3rd, 2013 06:53 pm (UTC)
(Link)
Ну да, и Verilog, и VHDL позиционируются как мульти-парадигмные языки, на которых можно писать хоть симуляцию движения автомобилей по дороге пакетов по сети, хоть симуляцию cmos-элементов. Вычленить из этого RTL-синтезируемое подмножество и объяснить хардверному дизайнеру, в чем оно состоит, действтельно, непросто.

Придумать язык, на котором всё, что можно написать - синтезируемо, а всё несинтезируемое написать нельзя, наверное, теоретически возможно, но им вряд ли кто-нибудь в индустрии сейчас захочет пользоваться. Писать дизайн на разных уровнях детализации, а также всю тестирующую и верифицирующую обвязку к нему хочется на одном языке - именно поэтому сейчас есть System Verilog, а не SuperLog + Vera + E + черта лысого.

данная парадигма должна легко приниматься любым программистом, особенно функциональщиком

А должна легко приниматься любым хардверным дизайнером, особенно электронщиком.
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:March 3rd, 2013 07:57 pm (UTC)
(Link)
Консервативность в парадигме еще можно понять, но зачем консервировать форму языка? Конечно, Паскаль и Ада были хорошими языками в свое время, но среди современных языков можно найти гораздо лучше по всяким характеристикам, причем их много разных. А эти промышленные VHDL с Verilog'ом так и тащатся динозаврами из 80-х. (Недавно убил кучу времени, когда забыл задекларировать сигналы в System Verilog, а компилятор всё это молча схавал, ррр.)
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:March 3rd, 2013 08:27 pm (UTC)
(Link)
`default_nettype none

Что же касается промышленных языков, то миллионы строк Кобола в финансовой индустрии до сих пор прекрасно себя чувствуют. Первое правило программиста: "работает - не трогай", а в промышленных дизайнах доля legacy code IP reuse весьма существенна.

Edited at 2013-03-03 08:30 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:janatem
Date:March 4th, 2013 07:46 am (UTC)
(Link)
Там и проприетарных корок полно, то есть всё равно в своем дизайне приходится использовать черные ящики. И не очень важно, что находится по ту сторону междумордия — закрытый код или «кобол».

> `default_nettype none
Спасибо, буду иметь в виду. Хотя там мне нужно было лишь встроиться со своим VHDL в чужой sv-код.
(Reply) (Parent) (Thread)
From:zyxman
Date:March 3rd, 2013 02:10 am (UTC)
(Link)
Я уже не борюсь. Просто прошу того кто настаивает на принятии такого решения подписать бумагу, что он ознакомлен с проблемой, и эту бумагу подшиваю к проекту (на крайняк просто забираю себе домой и прячу в моих бумагах), и дальше это уже проблемы того кто принял такое решение - как только начинаются проблемы, можно поступать в зависимости от обстоятельств - либо можно будет в следующий раз просто надавить наличием бумаги и заставить сделать правильно, либо даже показать начальству (эйчару).
(Reply) (Thread)
[User Picture]
From:fatoff
Date:March 5th, 2013 06:19 am (UTC)
(Link)
Сэмулировать на обычном C++ конечно можно. Эмуляторы и симуляторы делаются для всего. Вот такой кусок кода и показать инженеру-мягкому-программисту. "Вот смотри, оно работает как вот этот внешний интерфейс. А внутри происходит, примерно как имплементировано, только в железе имплементация".
(Reply) (Thread)