Leka 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 1 hour ago, RobFPGA said: Так кто же тут чушь? Вы. У меня четко сказано: On 12/29/2021 at 5:21 PM, Leka said: если промежуточные значения внешней переменной не используются внутри блока Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 2 hours ago, RobFPGA said: сравнить поведение этого в симе с тем на сколько оно соответствует ожидаемому поведению после синтеза ну и с рекомендуемой реализацией always_comb только с блокирующими присваиваниями. В Icarus Verilog (вывод через "always@(a1) $strobe(...);") - без разницы, независимо от типа присваивания. Другие симуляторы сейчас не использую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 1 hour ago, Leka said: У меня четко сказано: Пошли телодвижения ... В приведенном мной примере промежуточных значений переменных a и q внутри блоков нет. Эти переменные принимают только одно единственное значение. В полном соответствии с вашей же фразой: On 12/29/2021 at 3:21 PM, Leka said: Поэтому, если промежуточные значения внешней переменной не используются внутри блока, правильным будет код с неблокирующим присваиванием, как точно отражающий и поведение, и синтез. А как тогда понимать выделенные слова? А я всего лишь предельно упростил приведенный вами же пример. 3 minutes ago, Leka said: В Icarus Verilog (вывод через "always@(a1) $strobe(...);") - без разницы, независимо от типа присваивания. А это тут при чем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 1 minute ago, RobFPGA said: А как тогда понимать выделенные слова? Так: On 12/29/2021 at 5:21 PM, Leka said: Это фактически означает, что внешняя переменная всегда получает результат неблокирующего присваивания - в том смысле, что промежуточные значения никогда не видны в других процедурных блоках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба Just now, Leka said: Так: Но при этом такое присвоение имеет неправильное поведение в симе несоответствующее поведению синтезе. Так как это может быть "... правильным и точно отражающим поведение, и синтез"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 1 minute ago, RobFPGA said: неправильное поведение в симе несоответствующее поведению синтезе Это м/б следствием ошибок в коде симуляции. 10 minutes ago, RobFPGA said: А это тут при чем? Полное соответствие симуляции синтезу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 19 minutes ago, Leka said: Полное соответствие симуляции синтезу. ??? Покажите что это по вашему значит, Что и как вы симулируете? А то опять гадать что же вы имели ввиду. Если в моем примере добавить такой же вывод: module top1(input wire a1,a2, output logic q1,q2); logic a, q; always_comb begin a =a1; q1=a; end always_comb begin q = a; q2=q; end always @(a1) begin $strobe("[%t]| blocking: a1=%b, a=%b, q=%b, q1=%b, q2=%b", $time(), a1, a, q, q1, q2); end endmodule module top2(input wire a1,a2, output logic q1,q2); logic a, q; always_comb begin a <=a1; q1<=a; end always_comb begin q <= a; q2<=q; end always @(a1) begin $strobe("[%t]| non blocking: a1=%b, a=%b, q=%b, q1=%b, q2=%b", $time(), a1, a, q, q1, q2); end endmodule То получаем в Questa: Quote # [ 0 ns]| non blocking: a1=0, a=0, q=0, q1=x, q2=x # [ 0 ns]| blocking: a1=0, a=0, q=0, q1=0, q2=0 # [ 10 ns]| non blocking: a1=1, a=1, q=1, q1=0, q2=0 # [ 10 ns]| blocking: a1=1, a=1, q=1, q1=1, q2=1 Видите суслика разницу? И какой вариант по вашему имеет " ... Полное соответствие симуляции синтезу. "? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 2 hours ago, Мур said: Не могу сказать, что <отладка в железе это по большому счету время на ветер> ! Вовсе нет. Особенно, когда находишь ошибки не у себя, а в софте у программиста управляющего контроллера. Ка правило ошибки 50\50 между нами, но режим точно тик-так! Ну это уже другая задача. Не связанная с верификацией RTL, а скорее это системная интеграция. Но и это тоже можно частично делать в симе отлаживая взаимодействие софта с FPGA дизайном через DPI. Я когда то делал такое отлаживая совместную работу Cишного софта в DSP и обработку в FPGA. И за ~4 месяца пока делалось железо все основные проблемы стыковки софта с железом были таким образом решены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 5 января, 2022 Опубликовано 5 января, 2022 (изменено) · Жалоба 36 minutes ago, RobFPGA said: Что и как вы симулируете? module tb; logic a1=0; always #1 a1=~a1; logic q11,q12; logic q21,q22; top1 _1(a1,q11,q12); top2 _2(a1,q21,q22); always@(a1) $strobe("a1=%b q11=%b q12=%b q21=%b q22=%b",a1,q11,q12,q21,q22); endmodule module top1(input a1, output q1,q2); logic a,q; always_comb begin a<=a1; q1<=a; end always_comb begin q<=a; q2<=q; end endmodule module top2(input a1, output q1,q2); logic a,q; always_comb begin a=a1; q1=a; end always_comb begin q=a; q2=q; end endmodule В Icarus Verilog always_comb надо заменить на always@* (возможно, в последней версии этого уже не нужно, не проверял). Вывод полностью соответствует синтезу, строки "все "0" чередуются со строками "все "1". Изменено 5 января, 2022 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 4 minutes ago, Leka said: В Icarus Verilog always_comb надо заменить на always@* То есть на форум пишем одно, а симулируем совсем другое? Как раз замена always_comb на always @* меняет поведение сима. Эти конструкции хоть и похожи но имеют разное поведение в симе (да и в синтезе). Причем не только при разных типах присвоения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 14 minutes ago, RobFPGA said: То есть на форум пишем одно, а симулируем совсем другое? Icarus Verilog установленной версии не понимает always_comb. 14 minutes ago, RobFPGA said: Эти конструкции хоть и похожи но имеют разное поведение в симе (да и в синтезе). Ни разу не сталкивался со случаем разного синтеза always_comb и always@*. Для синтеза у меня автоматом генерируется always_comb (чтобы выскакивала ошибка latch), а для симуляции - always@*. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 7 minutes ago, Leka said: Ни разу не сталкивался со случаем разного синтеза always_comb и always@*. Может быть я и попутал. Но вот какая разница получается если добавить условие в примеры с блокирующим или неблокирующим присвоением и синтезировать latch в Vivado. always_comb begin if (a2) begin a= ~a1; q1= a; q= a; q2= q; end end always_comb begin if (a2) begin a<=~a1; q1<=a; q<=a; q2<=q; end end Угадайте какой вариант чему соответствует ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 2 hours ago, RobFPGA said: Ну это уже другая задача. Не связанная с верификацией RTL, а скорее это системная интеграция. Но и это тоже можно частично делать в симе отлаживая взаимодействие софта с FPGA дизайном через DPI. Я когда то делал такое отлаживая совместную работу Cишного софта в DSP и обработку в FPGA. И за ~4 месяца пока делалось железо все основные проблемы стыковки софта с железом были таким образом решены. Почему же не связанная? В такие моменты лишний раз проверить своё детище всегда полезно! ...более того,- такое удобство становится эффективным и предпочтительным способом отразить события в доказательстве правильности функционирования! Меня частенько приглашают на разбор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 1 hour ago, RobFPGA said: вот какая разница получается если добавить условие в примеры с блокирующим или неблокирующим присвоением и синтезировать latch в Vivado Спасибо, очень интересный пример. В Квартусе то-же самое - с защелками синтез неоптимальный (лишняя логика) в случае неблокирующего присваивания, хотя получающиеся схемы идентичны (с точностью до задержек). Получается, синтезаторы не умеют оптимизировать описания комбинационной логики одновременно с защелками и неблокирующими присваиваниями. Но если дополнить условие, чтобы не было защелок, синтез сразу становится оптимальным и с неблокирующими присваиваниями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 35 5 января, 2022 Опубликовано 5 января, 2022 · Жалоба 7 minutes ago, Мур said: Почему же не связанная? В такие моменты лишний раз проверить своё детище всегда полезно! ...более того,- такое удобство становится эффективным и предпочтительным способом отразить события в доказательстве правильности функционирования! Меня частенько приглашают на разбор. Потому что правильность реализации функционала в FPGA это не тоже самое что и правильность функционирования всей системы. Понятное дело это связанные вещи но если прощелкал системщик, выдав неправильное ТЗ программисту или FPGAшнику, или программист накосячил и не проверил свою работу, то корректный и полный сим может показать и доказать это. А просто дебаг глюков софта через FPGA к верификации работы FPGAшника отношения не имеет. Это как раз и есть этап системной интеграции. Который по большому счету должен делается уже на проверенной прошивке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться