SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба По поводу замечания SM, что "товарищ галку на Verilog-2005 не заметил" - должно было бы обидеть, но почему-то рассмешило. Не должно это никого было обидеть - это указание на ошибку - что она в установленной галке, которая отключает верилог и включает SystemVerilog - мы тут все обсуждаем поведение присваиваний в рамках верилога, а Вы без предупреждения с другим языком вклиниваетесь - с SystemVerilog-ом, и еще после этого пытаетесь кого-то в заблуждениях обвинять. Сразу бы сказали - что Ваш пример не на верилоге, и претензий бы не было. Я лично просто никак не ожидал такого перехода вдруг на SV, все мысли только в рамках V были. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Я лично просто никак не ожидал такого перехода вдруг на SV, все мысли только в рамках V были. Более того, квартсусовский SV не видит разницы между wire и reg/logic/integer %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Более того, квартсусовский SV не видит разницы между wire и reg/logic/integer %) Ха. А это уже конкретно глюк :) Хотя я не столь уверен в этом высказывании, мож в стандарте SV какая лазейка есть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Ха. А это уже конкретно глюк :) Хотя я не столь уверен в этом высказывании, мож в стандарте SV какая лазейка есть... Не нету, я писал об этом глюке на этом форуме, года 1.5 тому назад %) Вы кстати по этому поводу уже высказывались, просто об этом забыли %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 марта, 2010 Опубликовано 25 марта, 2010 (изменено) · Жалоба Сразу бы сказали - что Ваш пример не на верилоге, и претензий бы не было. Я лично просто никак не ожидал такого перехода вдруг на SV, все мысли только в рамках V были. Смотрим внимательно сообщение #250. Сначала я спросил, будет ли работать. Потом попробовал, привел результат. Зачем останавливаться на Verilog? Мы же в будущее, вроде, смотрим. Я тоже до недавнего времени писал на AHDL. Но, вкусив SV, назад не вернусь. И Вам советую. Вот еще одна картинка, как стимул к переходу. P.S. Пока писал, уже то же высказали. Меня такой "глюк" более, чем устраивает. Изменено 25 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Зачем останавливаться на Verilog? потому как спор возник именно по поводу прочтения стандарта языка Verilog 2001 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Зачем останавливаться на Verilog? Да никто на нем не останавливается. Обсуждаем принципы обработки присваиваний в нем. Именно в IEEE-1364. И все. А тут вдруг - SV. И с чего бы догадаться-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 марта, 2010 Опубликовано 25 марта, 2010 (изменено) · Жалоба Откровенно говоря, Verilog/SystemVerilog находится в состоянии активного развития, колбасит его не по-детски. Как и его создателей, похоже. Что будет дальше, страшно смотреть. Методы... и т.п. Это как C++. То ли дело старый добрый C. К счастью, Quartus взял из него только кое-что, "самое нужное" :) Изменено 25 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба К счастью, 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, а глюк в квартусе есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Выделенное красным верно. Не верна трактовка - 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; Здесь не два евента, здесь их: Первый процедурный блок Второй процедурный блок Блокирующее присваивание: a=b Вычисление RHS: a+c Вычисление RHS: d Апдейт LHS: b Апдейт LHS: c Целых 7 событий. Но активных из них: Блокирующее присваивание: a=b Вычисление RHS: a+c Вычисление RHS: d всего три. И типов событий - два: блокирующее присваивание и вычисление RHS. И порядок выполнения по этим типам - не определен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба dxp: Вы мой пост №276 видели? Как прокомментируете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Что тут написано? Правильно: процессами являются примитивы, модули, процедурные блоки, таски, процедурные присваивания (блокирующие и неблокирующие). Т.е. не только блоки с 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 для описанного за ним процесса (либо блока целиком, либо отдельного присваивания - но не того и другого одновременно) И, самое главное, это подтверждается практикой - всеми известными мне симуляторами и синтезаторами. Продолжим беседу дальше только после того, как Вы приведете пример какого либо симулятора или синтезатора, работающего не по тому принципу, как описываю я. И будем разбирать его поведение. Без этого спор беспредметный. Спор двух юристов по трактовке одного и того же закона. Пора к практике перейти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 марта, 2010 Опубликовано 25 марта, 2010 (изменено) · Жалоба Попробовал свой проект в ModelSim. Подтверждаю - блоки always работают только с reg. Хотя результат - чисто комбинаторный. Можно даже принудительно это указать. module Test (input a, input b, output reg c); always_comb c <= a & b; endmodule В дальнейшем буду ставить reg где надо, где не надо, без опаски. Хотя, с точки зрения здравого смысла - уже не понимаю понятия reg. А, можно так понимать - reg - логические элементы, net - цепи между ними. Изменено 25 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба В дальнейшем буду ставить reg где надо, где не надо, без опаски. Хотя, с точки зрения здравого смысла - уже не понимаю понятия reg. Понимать его следует просто: req - это регистр, который хранит значение между последовательными проходами процедурных блоков. Только и всего. Это совсем не означает, что это триггер или еще что-то конкретное. Это понятие языка программирования, коим является верилог. А триггеры и конкретная логика - это уже получается после синтеза. В процедурных блоках можно присваивать только объектам reg, никаких wire быть не может. И наоборот, в continuos assignments нельзя присваивать объектам типа reg по понятным причинам - левая часть такого присваивания просто повторяет значения драйвера, которым является правая часть, поэтому тут нечего "регистрировать" и запоминать. dxp: Вы мой пост №276 видели? Как прокомментируете? Вычисление RHS - это не одна из частей nonblocking assignment, а один из этапов реализации присваивания, т.е. само по себе оно не является ни statement, ни его частью. Вы в свою очередь, объясните, пожалуйста, как вы понимаете эти две страницы текста из раздела 11 с 11.1 по 11.5? Про очередь событий, активные события (и неопределенность их выборки из очереди). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Хотя, с точки зрения здравого смысла - уже не понимаю понятия reg. Понимать его следует просто: req - это регистр, который хранит значение между последовательными проходами процедурных блоков. Только и всего. события (и неопределенность их выборки из очереди). Господа, как то не ожидал от вас такого. reg это тип переменной языка Verilog, никакого отношения к синтезу регистра не имеющий. И сами разработчики стандарта признали, что назвать тип переменной словом reg было большой ошибкой, потому то и заменили его в SV на тип logic. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться