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

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

Когда Вы пишете

output reg [7:0] a,

output reg [7:0] b,

то, естественно, получаете регистры. Задайте output [7:0] a,...

и дискуссия продолжится... :smile3009:

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


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

С симулятором/синтезатором?

С симулятором после синтеза и оптимизации. Т.е. тогда, когда синтезировано устройство, соответствующее задумке автора. А не всякие там промежуточные этапы.

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


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

Внутри always только с reg можно работать, с wire - будет error.

Ну да?

А вот так - будет ошибка?

module test (input a, input b, output c);
  always @*
    c <= a & b;
endmodule

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

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


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

Вы бы хоть стандарт почитали, прежде чем такое писать. 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 не используются за пределами блока. Результат:

post-1343-1269426371_thumb.png

 

Опа! Триггеры остались! Как так? Но самое главное - по результату получается, что неблокирующее присваивание заблокировало нижеидущие блокирующие? Как это? Оно ведь не может ничего блокировать. Поиздеваемся над кодом дальше:

 

always_ff @(posedge clk) begin
    a = x;
    sum <= a + b;
    b = y;
end

Результат:

post-1343-1269426464_thumb.png

 

Один триггер остался, второго нет. Что это получается? Неблокирующие присваивание опять заблокировало нижеследующее?

 

Объясните такое поведение синтезатора. С позиции вашей цитаты. А поведение-то легко объяснимо, если прочитать внимательно упомянутый выше пост (#234).

 

Побороться с застойными, на мой личный взгляд, принципами и подходами.

Прежде чем бороться, надо сперва собственный уровень в обсуждаемых вопросах поднять, иначе получается, извините, ламерство. Ничего личного.

 

Когда Вы пишете

 

то, естественно, получаете регистры. Задайте output [7:0] a,...

Если убрать reg, то компилятор выдаст ошибку - он не позволяет в procedural блоках делать присваивания (любые) не-reg объектам.

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


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

А вы бы хоть мой пост #234 почитали - я там эту цитату привел. И еще привел другие цитаты.

А другие цитаты к делу отношение имеют сугубо косвенное. Если вдруг что либо, следующее за блокирующим присваиванием, (включая все неблокирующие), описанное внутри последовательного блока, будет осуществлено до записи результата блокирующего присваивания, то это прямое и однозначное нарушение 9.2.1. (слово "shall" юридически обязывает беспрекословно исполнять данное требование в любых случаях и ситуациях), и соответственно нарушающий это требование синтезатор или симулятор не может быть признан соответствующим стандарту.

 

И еще написал, что все это не определяет порядка выполнения выражений как таковое, а еще есть stratified event queue, обработка которой и определяет порядок обработки событий. Блокирующее присваивание - это активное событие. Вычисление RHS неблокирующего присваивания - это тоже активное событие. Порядок обработки активных событий из очереди событий не определен!

Это не отменяет более жесткого требования 9.2.1, показывающее, что ничего не может вычисляться в блоке, находящееся после блокирующего присваивания, пока это присваивание полностью не вычислено. Т.е. должно выполняться И то, И это условие стандарта. А не или то или это. Следовательно порядок действий в случае блокирующего присваивания полностью и четко определен пунктом 9.2.1. Все разговоры о неопределенностях могут быть только от непонимания значимости слова "shall" в стандартах.

 

Умирает он потому что оптимизатор его выкидывает. Заблокируйте оптимизатор, и все останется.

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

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


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

А другие цитаты к делу отношение имеют сугубо косвенное. Если вдруг что либо, следующее за блокирующим присваиванием, (включая все неблокирующие), описанное внутри последовательного блока, будет осуществлено до записи результата блокирующего присваивания, то это прямое и однозначное нарушение 9.2.1. (слово "shall" юридически обязывает беспрекословно исполнять данное требование в любых случаях и ситуациях), и соответственно нарушающий это требование синтезатор или симулятор не может быть признан соответствующим стандарту.

 

Это не отменяет более жесткого требования 9.2.1, показывающее, что ничего не может вычисляться в блоке, находящееся после блокирующего присваивания, пока это присваивание полностью не вычислено. Т.е. должно выполняться И то, И это условие стандарта. А не или то или это. Следовательно порядок действий в случае блокирующего присваивания полностью и четко определен пунктом 9.2.1. Все разговоры о неопределенностях могут быть только от непонимания значимости слова "shall" в стандартах.

SM, я вас не узнаю! У вас все силы высосала дискуссия про петриков с грызловами? :) Что же вы простой логики-то не видите? Никто ведь не покушается на shall и прочее. Ответьте просто - RHS (rvalue то бишь) выражений с неблокирующими присваиваниями вычисляется на каком этапе? Не update LHS выражения с неблокирующими - т.е. не собственно запись значения в регистр, а именно правая часть присваивания. На каком этапе? До начала выполнения блока? Или вместе с первым выражением в блоке? Какова очередность действий "блокирующее присваивание" <-> "вычисление RHS неблокирующих присваиваний"?

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


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

Да. Так только assign можно делать.

Quartus 9.0 (не самый новый, заметьте), SystemVerilog-2005

"Врачу - исцелися сам!"

P.S. только имя модулю дал с заглавной буквы, чтобы с именем файла совпадало...

post-10362-1269429272_thumb.jpg

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

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


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

Ответьте просто - 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"

 

А очередь событий она сама по себе. Но именно в ней события и заблокированы от помещения их туда и до удаления из очереди того, что собственно его заблокировало.

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


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

Как сам понимаю:

//блокирующее,
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

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

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


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

Как сам понимаю:

А теперь поясните пожалуйста, что хотели сказать :) Чтобы остальные поняли.

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


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

не RHS, не update LHS, а "statements" всех в целом. И RHS, и update LHS, и всех-всех других видов statements-ов, которые только могут существовать.

:(

 

Напоследок замечу лишь, что ни RHS, ни LHS statement'ами, о которых идет речь, не являются.

 

P.S. Объясните поведение кода и картинок из поста #247?

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


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

...

Кстати, если закомментарить порты a и b, и раскомментарить объявления регистров a и b, то триггеры действительно исчезают (остаются только сумматор и триггер sum). Но это происходит не потому, что их там не должно быть "ни с точки зрения языка, ни с точки зрения синтезатора", а потому, что синтезатор просто их выкинул при оптимизации, т.к. на них за пределами блока ссылок нет.

 

...

 

 

Почему же синтезатор их не выкидывает, если изменить "=" на "<="?

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


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

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

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

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

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

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

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

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

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

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