Verilog 为什么组合这些if语句会导致更高的逻辑元素利用率?

Verilog 为什么组合这些if语句会导致更高的逻辑元素利用率?,verilog,fpga,intel-fpga,Verilog,Fpga,Intel Fpga,我在verilog有一个项目,我在那里跟踪日期。我有下面的代码来处理不同长度的月份,除非我弄错了,否则我可以通过对每个条件进行oring并只使用一个if语句来组合这些。然而,这将导致多使用1个LE。为什么? if( ( months == 4 || months == 6 || months == 9 || months == 11 ) && days == 31 && set_state == 0 ) begin mont

我在verilog有一个项目,我在那里跟踪日期。我有下面的代码来处理不同长度的月份,除非我弄错了,否则我可以通过对每个条件进行oring并只使用一个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

这两个语句在逻辑上是等价的:


我认为这与合成工具逻辑最小化算法有关,该算法不能合成完全相同的电路,尽管它们在逻辑上是等效的。

顺便说一句,您可以用它来检查从3月到12月的月份。2个月,32个月,3%个月,5%个月,我不知道你们可以考虑哪一个。它们都是无法维护的。如果使用一个临时变量来表示本月的长度,那就简单多了。如果它们在逻辑上是等价的,我就没有时间检查了!,我会用这个工具引起一个bugvendor@Philippe:我把OP的陈述写成:if C1 P else if C2 P else if C3 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。我遗漏了什么?
A | (~A & B) = A | B