woofer46 0 15 ноября, 2015 Опубликовано 15 ноября, 2015 · Жалоба Здравствуйте! Такой вопрос: В каком порядке выполнится программа в блоке always? Условия проверяются параллельно, а инкрементирование после? Или все параллельно? always@(posedge CLK) begin if(i<24) begin //.... end if(i==25) begin //..... end i=i+1; end Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 15 ноября, 2015 Опубликовано 15 ноября, 2015 · Жалоба Здравствуйте! Такой вопрос: В каком порядке выполнится программа в блоке always? Условия проверяются параллельно, а инкрементирование после? Или все параллельно? always@(posedge CLK) begin if(i<24) begin //.... end if(i==25) begin //..... end i=i+1; end Спасибо Могу рассказать по скайпу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 15 ноября, 2015 Опубликовано 15 ноября, 2015 · Жалоба Всё будет выполнятся параллельно. Каждый тик клока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 15 ноября, 2015 Опубликовано 15 ноября, 2015 · Жалоба Приветствую! Всё будет выполнятся параллельно. Каждый тик клока. Увы это не совсем так. Операторы в блоке begin end выполняются последовательно. И то что при синтезе в железе получится 3 параллельных части логики этого не меняет. Это особенно будет заметно если написать например так. always@(posedge CLK) begin i=i+1; if(i<24) begin //.... end if(i==25) begin //..... end end Поэтому и рекомендуют использовать для описания синхронной логики неблокирующие присваивание <= . Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 15 ноября, 2015 Опубликовано 15 ноября, 2015 · Жалоба И то что при синтезе в железе получится 3 параллельных части логики этого не меняет. Поэтому и рекомендуют использовать для описания синхронной логики неблокирующие присваивание <= . В котором написанное ниже имеет приоритет над написанным выше. A<=3; A<=1; даст результат 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 15 ноября, 2015 Опубликовано 15 ноября, 2015 · Жалоба Приветствую! В котором написанное ниже имеет приоритет над написанным выше. A<=3; A<=1; даст результат 1. Точнее сказать переменная получит значение ПОСЛЕДНЕГО присвоения. Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба always@(posedge CLK) begin if(i<12) begin i=i+1; end if(i==11) begin end end Немного непонял Все же, if(i==11) проверяется после i=i+1; или параллельно с if(i<12) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vascom 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба Лучше перепиши всю эту конструкцию чтобы не возникало ни каких сомнений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба Все же, if(i==11) проверяется после i=i+1; или параллельно с if(i<12) ? После. Все в always-блоках выполняется строго последовательно. Надо учитывать, что неблокирующее присваивание, это отложенное присваивание, а блокирующее - немедленное присваивание, и все они выполняются последовательно. Параллельно выполняются только разные блоки always, поэтому и запрещено присваивание одной переменной в разных always-блоках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба Что можно сказать про 2 варианта написания кода (допустимо/недопустимо/равноценно/…) , и что можно сказать про значения q1, q2 (всегда одинаковые/могут быть разными) ? module top(input a1,a2, output q1,q2); logic a, q; always_comb begin a=a1; q1=q; a=a2; q2=q; end … // скрыто endmodule module top(input a1,a2, output q1,q2); logic a, q; always_comb begin a<=a1; q1<=q; a<=a2; q2<=q; end … // скрыто endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 1 hour ago, Leka said: Что можно сказать про 2 варианта написания кода (допустимо/недопустимо/равноценно/…) , и что можно сказать про значения q1, q2 (всегда одинаковые/могут быть разными) ? У вас какая-то ошибка в коде, бессмысленное двойное присвоение в a, и отсутствие присвоение в q. Может вы имели ввиду такое ? logic a, q; always_comb begin a=a1; q1=a; q=a2; q2=q; end ... logic a, q; always_comb begin a<=a1; q1<=a; q<=a2; q2<=q; end Но даже так приведенные варианты будут вести себя по разному. Поведение второго варианта будет отличатся в симе и синтезе. Поэтому второй вариант недопустимо использовать. В always_comb нужно использовать только блокирующие присвоения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 1 hour ago, RobFPGA said: У вас какая-то ошибка в коде, бессмысленное двойное присвоение в a, и отсутствие присвоение в q. Присвоение в q подразумевается в скрытом коде. Подразумевается также, что результат q зависит от a. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 1 hour ago, Leka said: Присвоение в q подразумевается в скрытом коде. Подразумевается также, что результат q зависит от a. Сложно отвечать на вопрос о поведении кода догадываясь что у вас там дальше скрыто в коде. Но в данном примере и этого достаточно чтобы понять что так нехорошо делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 36 minutes ago, RobFPGA said: вопрос о поведении кода догадываясь что у вас там дальше скрыто в коде. Вот-вот, именно это и хотел-бы обсудить. Мой ответ такой (если сравнивать симуляцию и синтез, то речь идет только о синтезируемом Верилоге). В синтезируемом Верилоге явно запрещены две вещи: 1) смешивание разных типов присваиваний одной переменной, 2) присваивание одной переменной в разных блоках. Все остальное - не более, чем рекомендации. Исходя из этого, можно однозначно определить поведение приведенного кода, не зная скрытый. 1) Внешние (по отношению к данному процедурному блоку) переменные всегда получают результат последнего присваивания - независимо от типа процедурного блока, и независимо от типа присваиваний. Это фактически означает, что внешняя переменная всегда получает результат неблокирующего присваивания - в том смысле, что промежуточные значения никогда не видны в других процедурных блоках. Поэтому, если промежуточные значения внешней переменной не используются внутри блока, правильным будет код с неблокирующим присваиванием, как точно отражающий и поведение, и синтез. 2) q1 и q2 всегда будут иметь одинаковые значения, независимо от остального (скрытого) кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться