Перейти к содержанию
    

Непрерывное присвоение на Verilog

от нее все и беды...

 

Все беды (а точнее, "детские ошибки") от незнания стандарта (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" не подразумевает шагов влево-вправо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

помниться летом обсуждали это... тогда пришли к выводу что все не так как кажется, это надо просто запомнить и все...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда пришли к выводу что все не так как кажется, это надо просто запомнить и все...

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

А что надо "просто запомнить", так это понятно, как и вообще, все остальные правила использования языка как для синтеза, так и для моделирования :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ещё такой подводный камень, недавно столкнулись: объявляешь сигнал как reg, делаешь инициализацию, но используешь его как wire.

А ещё оказывается можно вайр инициализировать (найдено в индусских исходниках).

Синтезатор в ауте от такого, чопопало делает )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А ещё оказывается можно вайр инициализировать

Конструкции вида

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я про инициализацию типа wire test1 = 1'b0. А затем где-нибудь ниже портмаппинг типа .testout(test1).

Таким же макаром можно объявить и reg test2 = 1'b0, но затем использовать как комбинаторику через always @* test2 <=...

 

А почему такая инициализация ваиров имеет право на жизнь? Просто как константа? Никогда почему-то не требовалось...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

отладка одного модуля без другого.... или устранение модуля вообще.

Сигналы которые шли между модулями забиваешь константами, можно было бы и в месте где модуль инстанцируется, но тогда если что вернуть опять придется проводки прокладывать, а так проводки подтянул к земле-питанию от смысла зависит и вуаля...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему такая инициализация ваиров имеет право на жизнь? Просто как константа? Никогда почему-то не требовалось...

это аналог

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 ее естественно.

Изменено пользователем serjj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему такая инициализация ваиров имеет право на жизнь? Просто как константа? Никогда почему-то не требовалось...

 

Вообще, можно одному вайру сделать кучу 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" - и подключаем на нее все модули сразу без лишних операций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Век живи, век учись... )

Делаем линию "irq" типа "wor" - и подключаем на нее все модули сразу без лишних операций.
Но всё же это больше подходит как метод обфускации кода ))) Я бы лучше явным образом описал логику, было бы очевиднее потом анализировать если что.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но всё же это больше подходит как метод обфускации кода )))

А применение К155ЛА7 в схемах во времена СССР - по этой же логике, метод обфускации схемы? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Опять же позволяет устранить ручной труд. Хотя по смыслу менее правильно.

 

Вроде нигде не налажал с описанием...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

mudole_bus - это 2 мерный массив из M элементов N битных шин)

 

И я из них получаю N битную шину собранную по ИЛИ - это общая шина.

 

неужели 2 мерный массив сам соберется по ИЛИ таким образом бит к биту?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Golikov A., только одномерный, неуследил начальные условия. Но видимо для 2-мерного случая можно шину переформировать так (транспонировать), чтобы в цикле можно было использовать <=|bus, неуверен, надо подумать.

 

А применение К155ЛА7 в схемах во времена СССР - по этой же логике, метод обфускации схемы? :)
Ну видимо да )) В железе проще и дешевле применить "монтажное ИЛИ", этим всё обосновано. Нагляднее ли это отдельной ЛА7 - вопрос. Но в текстовом описании явная логическая операция наверняка нагляднее "тайных знаний" о возможности "монтажного ИЛИ" у синтезатора )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...