Почему объединение этих операторов if приводит к более высокому использованию логических элементов?

У меня есть проект в Verilog, где я отслеживаю дату. У меня есть следующий код для обработки разной продолжительности месяцев, если я не ошибаюсь, я могу объединить их все, указав каждое условие и просто имея один оператор if. Однако это приведет к использованию еще 1 LE. Почему?

        if( ( months == 4 || months == 6 || months == 9 || months == 11 ) && days == 31 && set_state == 0 ) begin
            months = months + 1;
            days = 1;
        end
        else if( months == 2 && years[1:0] == 0 && days == 30 && set_state == 0 ) begin
            months = months + 1;
            days = 1;
        end
        else if( months == 2 && years[1:0] != 0 && days == 29 && set_state == 0 ) begin
            months = months + 1;
            days = 1;
        end
        else if( days == 32 ) begin
            months = months + 1;
            days = 1;               
        end

РЕДАКТИРОВАТЬ: это то, что использует дополнительный LE

    if( ( ( months == 4 || months == 6 || months == 9 || months == 11 ) && days == 31 && set_state == 0 ) ||
        ( months == 2 && years[1:0] == 0 && days == 30 && set_state == 0 ) ||
        ( months == 2 && years[1:0] != 0 && days == 29 && set_state == 0 ) ||
        ( days == 32 ) ) begin
        months = months + 1;
        days = 1;
    end

person Ben Pye    schedule 21.08.2014    source источник
comment
Кстати, вы можете использовать это, чтобы проверить месяцы с марта по декабрь. months > 2 && days > 32 - ((months - 3) % 5 % 2)   -  person OdraEncoded    schedule 23.08.2014
comment
Я не знаю, как вы можете рассматривать любой из них; они оба совершенно необслуживаемы. Было бы намного проще использовать временную переменную для length_of_this_month.   -  person Ben Voigt    schedule 23.08.2014
comment
Если они действительно логически эквивалентны (у меня не было времени проверить!), я бы поднял ошибку у поставщика инструмента.   -  person Martin Thompson    schedule 01.09.2014


Ответы (1)


Эти два утверждения логически эквивалентны с использованием следующего логического закона:

A | (~A & B) = A | B 

Я думаю, что это связано с алгоритмом минимизации логики инструмента синтеза, который не синтезирует точно такие же схемы, хотя они логически эквивалентны.

person Ari    schedule 22.08.2014
comment
@Philippe: я написал заявление OP как: if (C1) P else if (C2) P else if (C3) P else if (C4) P, что эквивалентно: if (C1 | ~C1 & C2 | ~C1 & ~C2 & C3 | ~C1 & ~C2 & ~C3 & C4) P. Это можно упростить до if (C1 | C2 | C3 | C4) P. Что мне не хватает? - person Ari; 25.08.2014