SM 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба от нее все и беды... Все беды (а точнее, "детские ошибки") от незнания стандарта (IEC 62142(E):2005), которому следует следовать при создании описаний для синтеза: Furthermore, the always statement shall contain an if statement to model the first asynchronous control and optional nested else if statements to model additional asynchronous controls. A final else statement, which specifies the synchronous logic portion of the always block, shall be controlled by the edge control variable not listed in the if and else if statements. The always statement shall be of the form: always @ (posedge <condA> or negedge <condB> or negedge <condC> or ... posedge <Clock>) // Any sequence of edge events can be in event list. if (<condA>) // Positive polarity since posedge <condA>. // ... <asynchronous logic> else if (~ <condB>) // Negative polarity since negedge <condB>. // ... <asynchronous logic> else if (~ <condC>) // ... <asynchronous logic> else // Implicit posedge <Clock>. // ... <synchronous logic> For every asynchronous control, there is an if statement that precedes the clock branch. The asynchronous set and or reset logic will therefore have higher priority than the clock edge. Тут даже про все else сказано, что они обязаны быть, и именно в этом порядке. Слово "shall" не подразумевает шагов влево-вправо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба помниться летом обсуждали это... тогда пришли к выводу что все не так как кажется, это надо просто запомнить и все... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 13 февраля, 2015 Опубликовано 13 февраля, 2015 · Жалоба тогда пришли к выводу что все не так как кажется, это надо просто запомнить и все... Тогда вроде не нашли прямое указание на это в стандарте. Ссылались на доки от синтезаторов разных вендоров... А оно, вот, и в стандарте есть. А что надо "просто запомнить", так это понятно, как и вообще, все остальные правила использования языка как для синтеза, так и для моделирования :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 18 февраля, 2015 Опубликовано 18 февраля, 2015 · Жалоба Есть ещё такой подводный камень, недавно столкнулись: объявляешь сигнал как reg, делаешь инициализацию, но используешь его как wire. А ещё оказывается можно вайр инициализировать (найдено в индусских исходниках). Синтезатор в ауте от такого, чопопало делает ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 18 февраля, 2015 Опубликовано 18 февраля, 2015 · Жалоба А ещё оказывается можно вайр инициализировать Конструкции вида wire my_uber_splendid_core_clock = clock; wire my_uber_splendid_core_clkena = 1'b1; синтезируются прекрасно и имеют место на жизнь, хоть лично мне и не нравятся. Или вы про какого роду инициализацию говорите? В inital блоке? Есть ещё такой подводный камень, недавно столкнулись: объявляешь сигнал как reg, делаешь инициализацию, но используешь его как wire Не что-то подобное имеете в виду? module latch( // Outputs dout, // Inputs din, le ); input din; output dout; input le; // latch enable reg dout; always @(din or le) if (le == 1'b1) dout = din; endmodule // latch Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 18 февраля, 2015 Опубликовано 18 февраля, 2015 · Жалоба я про инициализацию типа wire test1 = 1'b0. А затем где-нибудь ниже портмаппинг типа .testout(test1). Таким же макаром можно объявить и reg test2 = 1'b0, но затем использовать как комбинаторику через always @* test2 <=... А почему такая инициализация ваиров имеет право на жизнь? Просто как константа? Никогда почему-то не требовалось... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 18 февраля, 2015 Опубликовано 18 февраля, 2015 · Жалоба отладка одного модуля без другого.... или устранение модуля вообще. Сигналы которые шли между модулями забиваешь константами, можно было бы и в месте где модуль инстанцируется, но тогда если что вернуть опять придется проводки прокладывать, а так проводки подтянул к земле-питанию от смысла зависит и вуаля... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjj1333 0 18 февраля, 2015 Опубликовано 18 февраля, 2015 (изменено) · Жалоба А почему такая инициализация ваиров имеет право на жизнь? Просто как константа? Никогда почему-то не требовалось... это аналог wire my_uber_splendid_core_clock; assign my_uber_splendid_core_clock = clock; А в случае регистров получается reg a = 1'b1; это reg a; initial a = 1'b1; Таким же макаром можно объявить и reg test2 = 1'b0, но затем использовать как комбинаторику через always @* test2 <=.. Ну видимо латч вылезет, надо код глядеть конкретный). Если пользоваться конструкциями SV: always_ff, always_comb, always_latch можно точно синтезатору сказать как будет использована переменная, ну и через logic ее естественно. Изменено 18 февраля, 2015 пользователем serjj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 18 февраля, 2015 Опубликовано 18 февраля, 2015 · Жалоба А почему такая инициализация ваиров имеет право на жизнь? Просто как константа? Никогда почему-то не требовалось... Вообще, можно одному вайру сделать кучу assign (включая и тот, который внутри самого объявления) - это фича языка... А поведение зависит от типа - wire, wor, wand, tri, trior, triand и силы уровней (strength). Правда, не все это синтезируемо, но wire/wor/wand - точно. Это называется wired logic. Под wire понимается обычный выход, под wor - "открытый эмиттер", под wand - "открытый коллектор" (касаемо именно логики работы, а не физики выходных буферов после синтеза). то есть, если есть хотя бы два assign одинаковой силы для wire: 0 0 => 0 0 1 => x 1 0 => x 1 1 => 1 для wor: 0 0 => 0 0 1 => 1 1 0 => 1 1 1 => 1 для wand: 0 0 => 0 0 1 => 0 1 0 => 0 1 1 => 1 применение - очевидно. Например, 10 модулей могут генерировать запрос на прерывание, которые надо объединить в один. Делаем линию "irq" типа "wor" - и подключаем на нее все модули сразу без лишних операций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба Спасибо! Век живи, век учись... ) Делаем линию "irq" типа "wor" - и подключаем на нее все модули сразу без лишних операций.Но всё же это больше подходит как метод обфускации кода ))) Я бы лучше явным образом описал логику, было бы очевиднее потом анализировать если что. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба Но всё же это больше подходит как метод обфускации кода ))) А применение К155ЛА7 в схемах во времена СССР - по этой же логике, метод обфускации схемы? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба N модулей с каждого выходит шина, которая если модуль выбран выставляет данные, если нет, выдает 0. Эти N модулей можно повесить на общую шину через ИЛИ. Число модулей и ширина шины - параметры. По смыслу их надо вешать не на reg, а на wire, при этом хорошо бы собирать их циклом до N, а не руками. вот и помогает сделать wire [0 : N-1] bus = 0; а потом в цикле ... for (i = 0; i < M; i = i + 1) assign bus = (bus | module_bus[i]); ... без начальной инициализации ничего не выйдет... без цикла можно и в явном виде, типа присвоить bus 0 модуль, а дальше ИЛИить, но не так красиво, и когда один модуль цикл вырождается, теряется общность... ну или через reg [0:N-1] bus = 0, а потом always @(*) begin bus = 0; for (i = 0; i < M; i = i + 1) bus = bus | module_bus[i]; end Опять же позволяет устранить ручной труд. Хотя по смыслу менее правильно. Вроде нигде не налажал с описанием... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба Golikov A., а в Вашем примере не проще ли так записать: bus = | module_bus; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба mudole_bus - это 2 мерный массив из M элементов N битных шин) И я из них получаю N битную шину собранную по ИЛИ - это общая шина. неужели 2 мерный массив сам соберется по ИЛИ таким образом бит к биту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба Golikov A., только одномерный, неуследил начальные условия. Но видимо для 2-мерного случая можно шину переформировать так (транспонировать), чтобы в цикле можно было использовать <=|bus, неуверен, надо подумать. А применение К155ЛА7 в схемах во времена СССР - по этой же логике, метод обфускации схемы? :)Ну видимо да )) В железе проще и дешевле применить "монтажное ИЛИ", этим всё обосновано. Нагляднее ли это отдельной ЛА7 - вопрос. Но в текстовом описании явная логическая операция наверняка нагляднее "тайных знаний" о возможности "монтажного ИЛИ" у синтезатора ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться