ViKo 1 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Когда Вы пишете output reg [7:0] a, output reg [7:0] b, то, естественно, получаете регистры. Задайте output [7:0] a,... и дискуссия продолжится... :smile3009: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Задайте output [7:0] a,... и дискуссия продолжится... :smile3009: С симулятором/синтезатором? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба С симулятором/синтезатором? С симулятором после синтеза и оптимизации. Т.е. тогда, когда синтезировано устройство, соответствующее задумке автора. А не всякие там промежуточные этапы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Внутри always только с reg можно работать, с wire - будет error. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 марта, 2010 Опубликовано 24 марта, 2010 (изменено) · Жалоба Внутри always только с reg можно работать, с wire - будет error. Ну да? А вот так - будет ошибка? module test (input a, input b, output c); always @* c <= a & b; endmodule Изменено 24 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба А вот так - будет ошибка? Да. Так только assign можно делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 68 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Вы бы хоть стандарт почитали, прежде чем такое писать. 9.2.1. Определеннее некуда. А вы бы хоть мой пост #234 почитали - я там эту цитату привел. И еще привел другие цитаты. И еще написал, что все это не определяет порядка выполнения выражений как такового, а еще есть stratified event queue, обработка которой и определяет порядок обработки событий. Блокирующее присваивание - это активное событие. Вычисление RHS неблокирующего присваивания - это тоже активное событие. Порядок обработки активных событий из очереди событий не определен! насчет порождения триггера - да, он порождается. Я это и не отрицал. Я утверждаю, что породившись, он умирает. И это соответствует смыслу того, что писал автор. Умирает он потому что оптимизатор его выкидывает. Заблокируйте оптимизатор, и все останется. Вот я вам еще "дровишек" накидаю: module slon ( input clk, input [7:0] x, input [7:0] y, output reg [7:0] sum ); reg [7:0] a; reg [7:0] b; always_ff @(posedge clk) begin sum <= a + b; a = x; b = y; end Заметьте - a и b не используются за пределами блока. Результат: Опа! Триггеры остались! Как так? Но самое главное - по результату получается, что неблокирующее присваивание заблокировало нижеидущие блокирующие? Как это? Оно ведь не может ничего блокировать. Поиздеваемся над кодом дальше: always_ff @(posedge clk) begin a = x; sum <= a + b; b = y; end Результат: Один триггер остался, второго нет. Что это получается? Неблокирующие присваивание опять заблокировало нижеследующее? Объясните такое поведение синтезатора. С позиции вашей цитаты. А поведение-то легко объяснимо, если прочитать внимательно упомянутый выше пост (#234). Побороться с застойными, на мой личный взгляд, принципами и подходами. Прежде чем бороться, надо сперва собственный уровень в обсуждаемых вопросах поднять, иначе получается, извините, ламерство. Ничего личного. Когда Вы пишете то, естественно, получаете регистры. Задайте output [7:0] a,... Если убрать reg, то компилятор выдаст ошибку - он не позволяет в procedural блоках делать присваивания (любые) не-reg объектам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба А вы бы хоть мой пост #234 почитали - я там эту цитату привел. И еще привел другие цитаты. А другие цитаты к делу отношение имеют сугубо косвенное. Если вдруг что либо, следующее за блокирующим присваиванием, (включая все неблокирующие), описанное внутри последовательного блока, будет осуществлено до записи результата блокирующего присваивания, то это прямое и однозначное нарушение 9.2.1. (слово "shall" юридически обязывает беспрекословно исполнять данное требование в любых случаях и ситуациях), и соответственно нарушающий это требование синтезатор или симулятор не может быть признан соответствующим стандарту. И еще написал, что все это не определяет порядка выполнения выражений как таковое, а еще есть stratified event queue, обработка которой и определяет порядок обработки событий. Блокирующее присваивание - это активное событие. Вычисление RHS неблокирующего присваивания - это тоже активное событие. Порядок обработки активных событий из очереди событий не определен! Это не отменяет более жесткого требования 9.2.1, показывающее, что ничего не может вычисляться в блоке, находящееся после блокирующего присваивания, пока это присваивание полностью не вычислено. Т.е. должно выполняться И то, И это условие стандарта. А не или то или это. Следовательно порядок действий в случае блокирующего присваивания полностью и четко определен пунктом 9.2.1. Все разговоры о неопределенностях могут быть только от непонимания значимости слова "shall" в стандартах. Умирает он потому что оптимизатор его выкидывает. Заблокируйте оптимизатор, и все останется. Верно, об этом и я говорил. Но все промежуточные этапы не интересны, интересно синтезированное в конце оптимальное устройство, и ничего более. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 68 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба А другие цитаты к делу отношение имеют сугубо косвенное. Если вдруг что либо, следующее за блокирующим присваиванием, (включая все неблокирующие), описанное внутри последовательного блока, будет осуществлено до записи результата блокирующего присваивания, то это прямое и однозначное нарушение 9.2.1. (слово "shall" юридически обязывает беспрекословно исполнять данное требование в любых случаях и ситуациях), и соответственно нарушающий это требование синтезатор или симулятор не может быть признан соответствующим стандарту. Это не отменяет более жесткого требования 9.2.1, показывающее, что ничего не может вычисляться в блоке, находящееся после блокирующего присваивания, пока это присваивание полностью не вычислено. Т.е. должно выполняться И то, И это условие стандарта. А не или то или это. Следовательно порядок действий в случае блокирующего присваивания полностью и четко определен пунктом 9.2.1. Все разговоры о неопределенностях могут быть только от непонимания значимости слова "shall" в стандартах. SM, я вас не узнаю! У вас все силы высосала дискуссия про петриков с грызловами? :) Что же вы простой логики-то не видите? Никто ведь не покушается на shall и прочее. Ответьте просто - RHS (rvalue то бишь) выражений с неблокирующими присваиваниями вычисляется на каком этапе? Не update LHS выражения с неблокирующими - т.е. не собственно запись значения в регистр, а именно правая часть присваивания. На каком этапе? До начала выполнения блока? Или вместе с первым выражением в блоке? Какова очередность действий "блокирующее присваивание" <-> "вычисление RHS неблокирующих присваиваний"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 марта, 2010 Опубликовано 24 марта, 2010 (изменено) · Жалоба Да. Так только assign можно делать. Quartus 9.0 (не самый новый, заметьте), SystemVerilog-2005 "Врачу - исцелися сам!" P.S. только имя модулю дал с заглавной буквы, чтобы с именем файла совпадало... Изменено 24 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Ответьте просто - RHS (rvalue то бишь) выражений с неблокирующими присваиваниями вычисляется на каком этапе? Не update LHS выражения с неблокирующими - т.е. не собственно запись значения в регистр, а именно правая часть присваивания. На каком этапе? До начала выполнения блока? Или вместе с первым выражением в блоке? Какова очередность действий "блокирующее присваивание" <-> "вычисление RHS неблокирующих присваиваний"? Еще раз повторю фразу из стандарта. A blocking procedural assignment statement shall be executed before the execution of the statements that follow it in a sequential block. теперь специально выделю before the execution of the statements that follow it теперь еще раз выделю statements не RHS, не update LHS, а "statements" всех в целом. И RHS, и update LHS, и всех-всех других видов statements-ов, которые только могут существовать. Т.е. по стандарту сначала обязан полностью выполнится blocking assignment вплоть до и включая update LHS, и только потом любое, описанное далее. На то он и blocking, что он блокирует ВСЁ, описанное далее него в данном блоке, от начала исполнения блока в целом и до окончания полного исполнения блокирующего присваивания. И именно от начала - так как "before the execution of the statements", а не "before statements executed". Т.е. никакой RHS не имеет права даже начинать исполняться, так как это будет уже "execution of the statements" А очередь событий она сама по себе. Но именно в ней события и заблокированы от помещения их туда и до удаления из очереди того, что собственно его заблокировало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 24 марта, 2010 Опубликовано 24 марта, 2010 (изменено) · Жалоба Как сам понимаю: //блокирующее, reg a; always ... begin a = ...; ... = a; end //и эквивалент: reg a, a_buf; always ... a_buf = a; a_buf = ...; ... = a_buf; a = a_buf; end //неблокирующее, reg a; always ... begin a <= ...; ... <= a; end //и эквивалент: reg a, a_lhs, a_rhs; always ... a_rhs = a; a_lhs = ...; ... = a_rhs; a = a_lhs; end Изменено 24 марта, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба Как сам понимаю: А теперь поясните пожалуйста, что хотели сказать :) Чтобы остальные поняли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 68 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба не RHS, не update LHS, а "statements" всех в целом. И RHS, и update LHS, и всех-всех других видов statements-ов, которые только могут существовать. :( Напоследок замечу лишь, что ни RHS, ни LHS statement'ами, о которых идет речь, не являются. P.S. Объясните поведение кода и картинок из поста #247? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 24 марта, 2010 Опубликовано 24 марта, 2010 · Жалоба ... Кстати, если закомментарить порты a и b, и раскомментарить объявления регистров a и b, то триггеры действительно исчезают (остаются только сумматор и триггер sum). Но это происходит не потому, что их там не должно быть "ни с точки зрения языка, ни с точки зрения синтезатора", а потому, что синтезатор просто их выкинул при оптимизации, т.к. на них за пределами блока ссылок нет. ... Почему же синтезатор их не выкидывает, если изменить "=" на "<="? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться