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

Как работает оператор IF в HDL, если в скобках комбинация условий? (на примере Verilog)

Собственно, такой код, будет ли он корректно работать?

reg A,B;

if ( A == 1'b1 && B == 1'b0 )

действие1;

else

if ( A == 1'b1 && B == 1'b1 )

действие2;

 

Меня смущает что во втором if A проверяется на ==1, будет ли оно проверяться или считается, что здесь A==0. По идее, надо делать общий if с проверкой A, а внутри проверять только B. Если сигналов много, то это затруднительно, поэтому вопрос (извините, если глупый).

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

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


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

Соревноваться в оптимизации логических функций с синтезаторои бессмысленно. Он это сделает лучше вас.

Пишите понятный человекочитаемый код.

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


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

8 часов назад, ianpo сказал:

Собственно, такой код, будет ли он корректно работать?

reg A,B;

if ( A == 1'b1 && B == 1'b0 )

действие1;

else

if ( A == 1'b1 && B == 1'b1 )

действие2;

 

Меня смущает что во втором if A проверяется на ==1, будет ли оно проверяться или считается, что здесь A==0. По идее, надо делать общий if с проверкой A, а внутри проверять только B. Если сигналов много, то это затруднительно, поэтому вопрос (извините, если глупый).

 

Это конструкция нежизнеспособна. И конструкция по идее тоже нежизнеспособна. Результаты будут разные, а какие сходу никто не скажет.

Вы схему какую хотите получить. На базе д триггера или на базе д триггера с входом ena? На вход ena Вы хотите подать только а, или результат комбинаторной логики?

Имеет смысл:

if ( A == 1'b1 && B == 1'b0 ) действие1;

if ( A == 1'b1 && B == 1'b1 ) действие2; Потому что они взаимоисключающие  и введение приоритетности только добавляет неясности. Во что эту приоритетность превратит синтезатор, сходу никто не скажет.

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

Или

if ( A == 1'b1 && B == 1'b0 )  rg <= d;

else if ( A == 1'b1 && B == 1'b1 )  rg <= e;

else  rg <= f; нужно перебрать оставшиеся не описанные комбинации условий.

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


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

7 часов назад, ianpo сказал:

Собственно, такой код, будет ли он корректно работать?

Так смоделируйте и проверьте. Каким симулятором до этого пользовались?

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


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

17 hours ago, ianpo said:

Меня смущает что во втором if A проверяется на ==1, будет ли оно проверяться или считается, что здесь A==0.

Будет  - так как в вашем выражении  в ветку else  можно попасть  и при условии  A=1 и при условии A=0   

 

9 hours ago, sazh said:

if ( A == 1'b1 && B == 1'b0 ) действие1;

if ( A == 1'b1 && B == 1'b1 ) действие2; Потому что они взаимоисключающие  и введение приоритетности только добавляет неясности. Во что эту приоритетность превратит синтезатор, сходу никто не скажет.

Приведённая конструкция вполне жизнеспособна и  даёт однозначный вариант в приоритете выполнения.  Как впрочем и приведённый  вами  вариант 

f ( A == 1'b1 && B == 1'b0 ) действие1;

if ( A == 1'b1 && B == 1'b1 ) действие2; 

Приоритет в данном случае однозначно определяется  условиями под if потому как эти условия взаимоисключающие 
А если бы условия были неоднозначны  то приоритет все равно был бы понятен - по принципу "кто последний присвоил того и тапки" ...

Зная это не обязательно расписывать полные  ветвистые деревья  if else.   

 

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


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

2 hours ago, RobFPGA said:

Будет  - так как в вашем выражении  в ветку else  можно попасть  и при условии  A=1 и при условии A=0

Это я и хотел услышать.

 

У меня была ситуация, когда второй if не работал. Видимо, я где-то напутал с условием, но так и не понял, где именно,  и ошибочно решил, что это if так работает 😕

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


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

2 hours ago, ianpo said:

У меня была ситуация, когда второй if не работал. Видимо, я где-то напутал с условием, но так и не понял, где именно,  и ошибочно решил, что это if так работает 😕

В какой среде и на какой ПЛИС проверяли?

 

У GoWin в ранних версиях среды (года 2 назад) такой код глючил от фазы луны.

 

Были такие глюки:

begin : BadCode
rg <= 1;
if (A) rg <= 0;
end

begin : GoodCode
if (A) rg <= 0;
else   rg <= 1;
end

 

и такие:

begin : BadCode
if (A) rg <= 0;
else if (B) rg <= 1;              
end

begin : GoodCode
if (A) rg <= 0;
else 
    begin
    if (B) rg <= 1;
    end
end

 

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

 

 

 

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


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

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

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

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

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

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

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

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

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

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