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

Последовательные и параллельные операции Verilog

1 hour ago, RobFPGA said:

Так кто же тут чушь?

Вы.

У меня четко сказано:

On 12/29/2021 at 5:21 PM, Leka said:

если промежуточные значения внешней переменной не используются внутри блока

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


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

2 hours ago, RobFPGA said:

сравнить поведение этого в симе  с тем на сколько оно соответствует ожидаемому поведению после синтеза ну и с рекомендуемой реализацией always_comb только с блокирующими присваиваниями.

 В Icarus Verilog (вывод через "always@(a1) $strobe(...);") - без разницы, независимо от типа присваивания.

Другие симуляторы сейчас не использую.

 

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


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

1 hour ago, Leka said:

У меня четко сказано:

Пошли телодвижения ... В приведенном мной примере  промежуточных значений переменных a и q внутри блоков нет.  Эти переменные принимают только одно единственное значение. В полном соответствии с вашей же  фразой:

On 12/29/2021 at 3:21 PM, Leka said:

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

А как тогда понимать выделенные слова? :scratch_one-s_head:  А я всего лишь предельно упростил приведенный вами же пример. 

 

3 minutes ago, Leka said:

В Icarus Verilog (вывод через "always@(a1) $strobe(...);") - без разницы, независимо от типа присваивания.

А это тут при чем?  

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


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

1 minute ago, RobFPGA said:

А как тогда понимать выделенные слова?

Так:

On 12/29/2021 at 5:21 PM, Leka said:

Это фактически означает, что  внешняя переменная всегда получает результат неблокирующего присваивания - в том смысле, что промежуточные значения никогда не видны в других процедурных блоках.

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


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

Just now, Leka said:

Так:

Но при этом такое присвоение имеет неправильное поведение в симе несоответствующее поведению синтезе.  Так как это может быть "... правильным и точно отражающим поведение, и синтез"?  :scratch_one-s_head:

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


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

1 minute ago, RobFPGA said:

неправильное поведение в симе несоответствующее поведению синтезе

Это м/б следствием ошибок в коде симуляции.  

 

10 minutes ago, RobFPGA said:

А это тут при чем? 

Полное соответствие симуляции синтезу. 

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


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

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

Видите  суслика разницу?  :wink2:  И какой  вариант  по вашему имеет  " ... Полное соответствие симуляции синтезу. "?

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


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

2 hours ago, Мур said:

Не могу сказать, что <отладка в железе это по большому счету время на ветер> ! Вовсе нет.  Особенно, когда находишь ошибки не у себя, а в софте у программиста управляющего контроллера.  Ка правило ошибки 50\50 между нами, но режим точно тик-так!

Ну это уже  другая задача. Не  связанная с верификацией RTL, а скорее это системная интеграция. Но и это тоже можно частично делать в симе отлаживая взаимодействие софта с FPGA дизайном через DPI. Я когда то делал такое отлаживая совместную работу Cишного софта в DSP и обработку в FPGA. И за ~4 месяца пока делалось железо все основные проблемы стыковки софта с железом были таким образом решены.    

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


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

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".

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

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


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

4 minutes ago, Leka said:

В Icarus Verilog always_comb надо заменить на always@* 

 То есть на форум пишем одно, а симулируем совсем другое? :shok:  
Как раз замена  always_comb на always @* меняет поведение сима.  :unknw:  Эти конструкции хоть и похожи но имеют разное поведение в симе (да и в синтезе).  Причем не только при разных типах присвоения. 

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


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

14 minutes ago, RobFPGA said:

То есть на форум пишем одно, а симулируем совсем другое?

Icarus Verilog установленной версии не понимает always_comb.

14 minutes ago, RobFPGA said:

Эти конструкции хоть и похожи но имеют разное поведение в симе (да и в синтезе).

 Ни разу не сталкивался со случаем разного синтеза always_comb и always@*. 

 

Для синтеза у меня автоматом генерируется always_comb (чтобы выскакивала ошибка latch), а для симуляции - always@*.

 

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


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

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

Угадайте  какой вариант  чему соответствует ? :wink2:  

tst1.png

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


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

2 hours ago, RobFPGA said:

Ну это уже  другая задача. Не  связанная с верификацией RTL, а скорее это системная интеграция. Но и это тоже можно частично делать в симе отлаживая взаимодействие софта с FPGA дизайном через DPI. Я когда то делал такое отлаживая совместную работу Cишного софта в DSP и обработку в FPGA. И за ~4 месяца пока делалось железо все основные проблемы стыковки софта с железом были таким образом решены.    

Почему же не связанная? В такие моменты лишний раз проверить своё детище всегда полезно!

...более того,- такое удобство становится эффективным и предпочтительным способом отразить события в доказательстве правильности функционирования!  Меня частенько приглашают на разбор.

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


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

1 hour ago, RobFPGA said:

вот  какая разница  получается  если добавить условие в примеры с  блокирующим или неблокирующим присвоением и синтезировать latch в Vivado

Спасибо, очень интересный пример.

В Квартусе то-же самое - с защелками синтез неоптимальный (лишняя логика) в случае неблокирующего присваивания, хотя получающиеся схемы идентичны (с точностью до задержек).

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

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

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


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

7 minutes ago, Мур said:

Почему же не связанная? В такие моменты лишний раз проверить своё детище всегда полезно!

...более того,- такое удобство становится эффективным и предпочтительным способом отразить события в доказательстве правильности функционирования!  Меня частенько приглашают на разбор.

Потому что правильность реализации функционала в FPGA это не тоже самое что и правильность  функционирования всей системы.  Понятное дело это связанные вещи но если прощелкал системщик,  выдав неправильное ТЗ программисту или FPGAшнику, или программист накосячил и не  проверил свою работу, то корректный и полный сим может показать и доказать это. А просто дебаг глюков софта через FPGA к верификации работы FPGAшника отношения не имеет. Это как раз и есть этап  системной интеграции.  Который по большому счету должен делается уже на проверенной прошивке.  

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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