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

Профессия RTL Designer не имеет будущего?

По поводу замечания SM, что "товарищ галку на Verilog-2005 не заметил" - должно было бы обидеть, но почему-то рассмешило.

Не должно это никого было обидеть - это указание на ошибку - что она в установленной галке, которая отключает верилог и включает SystemVerilog - мы тут все обсуждаем поведение присваиваний в рамках верилога, а Вы без предупреждения с другим языком вклиниваетесь - с SystemVerilog-ом, и еще после этого пытаетесь кого-то в заблуждениях обвинять. Сразу бы сказали - что Ваш пример не на верилоге, и претензий бы не было. Я лично просто никак не ожидал такого перехода вдруг на SV, все мысли только в рамках V были.

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


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

Я лично просто никак не ожидал такого перехода вдруг на SV, все мысли только в рамках V были.

Более того, квартсусовский SV не видит разницы между wire и reg/logic/integer %)

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


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

Более того, квартсусовский SV не видит разницы между wire и reg/logic/integer %)

Ха. А это уже конкретно глюк :) Хотя я не столь уверен в этом высказывании, мож в стандарте SV какая лазейка есть...

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


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

Ха. А это уже конкретно глюк :) Хотя я не столь уверен в этом высказывании, мож в стандарте SV какая лазейка есть...

Не нету, я писал об этом глюке на этом форуме, года 1.5 тому назад %) Вы кстати по этому поводу уже высказывались, просто об этом забыли %)

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


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

Сразу бы сказали - что Ваш пример не на верилоге, и претензий бы не было. Я лично просто никак не ожидал такого перехода вдруг на SV, все мысли только в рамках V были.

Смотрим внимательно сообщение #250.

Сначала я спросил, будет ли работать. Потом попробовал, привел результат.

Зачем останавливаться на Verilog?

Мы же в будущее, вроде, смотрим.

Я тоже до недавнего времени писал на AHDL. Но, вкусив SV, назад не вернусь. И Вам советую.

Вот еще одна картинка, как стимул к переходу.

P.S. Пока писал, уже то же высказали. Меня такой "глюк" более, чем устраивает.

post-10362-1269505534_thumb.jpg

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

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


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

Зачем останавливаться на Verilog?

потому как спор возник именно по поводу прочтения стандарта языка Verilog 2001

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


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

Зачем останавливаться на Verilog?

Да никто на нем не останавливается. Обсуждаем принципы обработки присваиваний в нем. Именно в IEEE-1364. И все. А тут вдруг - SV. И с чего бы догадаться-то?

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


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

Откровенно говоря, Verilog/SystemVerilog находится в состоянии активного развития, колбасит его не по-детски. Как и его создателей, похоже. Что будет дальше, страшно смотреть. Методы... и т.п. Это как C++. То ли дело старый добрый C.

К счастью, Quartus взял из него только кое-что, "самое нужное" :)

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

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


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

К счастью, Quartus взял из него только кое-что, "самое нужное" :)

 

Да глюк в нем, ГЛЮК. Попробуйте это (без слов "logic", "reg", "integer" и т.п. после "output", т.е. точь-в-точь из поста 256) скомпилировать в том же модельсиме в режиме SV - получите кучу матершины. И правильно получите. В кэденсе тоже получите. И в Synopsys DC получите. Так что, все так, это просто обнаруженный глюк квартуса. Вот Вам таки цитата из IEEE 1800-2007

 

If the first port direction is specified, but no port kind or data type is specified, then the port shall default to a net of net type wire

 

Так что никаких других умолчаний в SV нет, все как и было в V, а глюк в квартусе есть.

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


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

Выделенное красным верно. Не верна трактовка - event-ом является сигнал к запуску вычисления блока begin...end целиком (The evaluation of a process is also an event, known as an evaluation event), а не отдельно взятого statement-а из него.

 

A design consists of connected threads of execution or processes. Processes are objects that can be

evaluated, that may have state, and that can respond to changes on their inputs to produce outputs. Processes

include primitives, modules, initial and always procedural blocks, continuous assignments, asynchronous

tasks, and procedural assignment statements.

 

Что тут написано? Правильно: процессами являются примитивы, модули, процедурные блоки, таски, процедурные присваивания (блокирующие и неблокирующие). Т.е. не только блоки с begin-end, но и целая куча всего, т.ч. не надо осебятину нести, основанную на вырванной из контекста цитате. Кроме evaluation events еще бывают update events:

Every change in value of a net or variable in the circuit being simulated, as well as the named event, is

considered an update event.

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

Events can occur at different times. In order to keep track of the events and to make sure they are processed

in the correct order, the events are kept on an event queue, ordered by simulation time. Putting an event on

the queue is called scheduling an event.

 

которая и называется stratified event queue. Следующую цитату уже приводил ранее, но вы, очевидно, не читали ее, поэтому:

The Verilog event queue is logically segmented into five different regions. Events are added to any of the

five regions, but are only removed from the active region.

 

a. Active events occur at the current simulation time and can be processed in any order.

b. Inactive events occur at the current simulation time, but shall be processed after all the active events

are processed.

c. Nonblocking assign update events have been evaluated during some previous simulation time, but

shall be assigned at this simulation time after all the active and inactive events are processed.

d. Monitor events shall be processed after all the active, inactive, and nonblocking assign update

events are processed.

e. Future events occur at some future simulation time. Future events are divided into future inactive

events and future nonblocking assignment update events.

Итак, что тут написано? Что при обработке очереди все события в ней разбиваются на пять частей, которые (части) обрабатываются по очереди. Первая часть - active events, она гарантировано выполняется вперед остальных событий очереди. И в active events, смотрим на картинку, входят:

 

  • Blocking assigments
  • Evaluate RHS of nonblocking assigments
  • Continuos assigments
  • $display command execution
  • Evaluate inputs and change outputs of primitives

Нету тут никаких блоков begin-end - это вы придумали. И порядок выполнения этих активных событий - не определен (смотрим на картинку): These events may be scheduled in any order. И в нашем обсуждении нас интересует конкуренция двух типов событий из этого списка - первых двух. Все, спорить тут не о чем.

 

т.е. вот ДВА евента, и сигналом к помещению в очередь их является "posedge clk":

 

always @(posedge clk)
  begin
     a=b;
     b<=a+c;
  end;

always @(posedge clk)
    c<=d;

Здесь не два евента, здесь их:

  1. Первый процедурный блок
  2. Второй процедурный блок
  3. Блокирующее присваивание: a=b
  4. Вычисление RHS: a+c
  5. Вычисление RHS: d
  6. Апдейт LHS: b
  7. Апдейт LHS: c

 

Целых 7 событий. Но активных из них:

 

  1. Блокирующее присваивание: a=b
  2. Вычисление RHS: a+c
  3. Вычисление RHS: d

 

всего три. И типов событий - два: блокирующее присваивание и вычисление RHS. И порядок выполнения по этим типам - не определен.

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


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

Что тут написано? Правильно: процессами являются примитивы, модули, процедурные блоки, таски, процедурные присваивания (блокирующие и неблокирующие). Т.е. не только блоки с begin-end, но и целая куча всего, т.ч. не надо осебятину нести, основанную на вырванной из контекста цитате.

 

Вы считаете так (имеете полное право трактовать стандарт как лично Вам нравится), а я вместе с разработчиками симуляторов и синтезаторов - иначе.

 

Во первых - что такое собственно event (нас интересует только evaluation event, так как update event-ы их запускают, а нас интересует процесс вычисления, а не запуска, поэтому я и опустил апдейт-евенты, в уме подразумевая, что они есть).

 

читаем определение. Оно единственно и непоколебимо.

 

Every change in value of a net or variable in the circuit being simulated, as well as the named event, is consideredan update event.

 

Processes are sensitive to update events. When an update event is executed, all the processes that are sensitive to that event are evaluated in an arbitrary order. The evaluation of a process is also an event, known as an evaluation event.

 

После этого мы знаем определения - что evaluation event-ом может быть "evaluation of a process" и ничего более.

 

далее смотрим, что такое process:

 

Processes include primitives, modules, initial and always procedural blocks, continuous assignments, asynchronous tasks, and procedural assignment statements.

 

Да, видим, что процессом может как и procedural block, так и procedural assignment. Но! Это прямо не указывается, но это понятно и так (по крайней мере разработчикам тулзов и мне), что если объявлен procedural block - то именно он является процессом целиком, для чего и придуман. А если блока не объявлено - то процессом является отдельный assignment. А запускать одновременно и блок целиком по правилам вычисления блока, и каждое из присваиваний внутри него как отдельный процесс - это, извините, просто бред. Вот это главное, что не видите Вы и авторы тех картинок, но слава богу видят разработчики тулзов. Возможно, это недоработка текста стандарта, что нет прямого указания на это, и есть свобода трактовки - что или-или-или, или "и то и это и третье сразу".

 

Таким образом в моем примере именно ДВА evaluation евента - первый - вычисление процесса, описанного процедурным блоком begin...end и чувствительного к апдейт-евентам переменной clk, второй - вычисление процесса, описанного процедурным присваиванием (неблокирующим) без применения процедурного блока.

 

Слова always, initial, assign - НЕ ЯВЛЯЮТСЯ евентами (евенты - блоки или присваивания за ними). Они являются описанием того, по какому update event-у должен формироваться evaluation event для описанного за ним процесса (либо блока целиком, либо отдельного присваивания - но не того и другого одновременно)

 

И, самое главное, это подтверждается практикой - всеми известными мне симуляторами и синтезаторами. Продолжим беседу дальше только после того, как Вы приведете пример какого либо симулятора или синтезатора, работающего не по тому принципу, как описываю я. И будем разбирать его поведение. Без этого спор беспредметный. Спор двух юристов по трактовке одного и того же закона. Пора к практике перейти.

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


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

Попробовал свой проект в ModelSim. Подтверждаю - блоки always работают только с reg. Хотя результат - чисто комбинаторный. Можно даже принудительно это указать.

module Test (input a, input b, output reg c);
  always_comb
    c <= a & b;
endmodule

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

А, можно так понимать - reg - логические элементы, net - цепи между ними.

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

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


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

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

Понимать его следует просто: req - это регистр, который хранит значение между последовательными проходами процедурных блоков. Только и всего. Это совсем не означает, что это триггер или еще что-то конкретное. Это понятие языка программирования, коим является верилог. А триггеры и конкретная логика - это уже получается после синтеза. В процедурных блоках можно присваивать только объектам reg, никаких wire быть не может. И наоборот, в continuos assignments нельзя присваивать объектам типа reg по понятным причинам - левая часть такого присваивания просто повторяет значения драйвера, которым является правая часть, поэтому тут нечего "регистрировать" и запоминать.

 

dxp:

Вы мой пост №276 видели?

Как прокомментируете?

Вычисление RHS - это не одна из частей nonblocking assignment, а один из этапов реализации присваивания, т.е. само по себе оно не является ни statement, ни его частью.

 

Вы в свою очередь, объясните, пожалуйста, как вы понимаете эти две страницы текста из раздела 11 с 11.1 по 11.5? Про очередь событий, активные события (и неопределенность их выборки из очереди).

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


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

Хотя, с точки зрения здравого смысла - уже не понимаю понятия reg.

 

Понимать его следует просто: req - это регистр, который хранит значение между последовательными проходами процедурных блоков. Только и всего. события (и неопределенность их выборки из очереди).

 

Господа, как то не ожидал от вас такого. reg это тип переменной языка Verilog, никакого отношения к синтезу регистра не имеющий. И сами разработчики стандарта признали, что назвать тип переменной словом reg было большой ошибкой, потому то и заменили его в SV на тип logic.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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