首先分配,然后在 if 块中重新分配,以替代 Verilog 中的 if-(else if)-else

First assign and then reassign in if block as alternative to if-(else if)-else in Verilog

是不是先给一个变量赋值,然后在 if 块中重新赋值,而不是使用 if-(else if)-else 块,如果 if 和 else 块中的赋值相同,而在else if 块是不同的赋值。

always @(*) begin
    if condition1 begin
        var = val1;
    end
    else if condition2 begin
        var = val2;
    end
    else begin
        var = val1;
    end
end

always @(*) begin
    var = val1;
    if condition2 begin
        var = val2;
    end
end

鉴于 condition1 和 condition2 是互斥的,我认为这两个块应该综合相同的逻辑,选择一个而不是另一个纯粹是美学上的。我的想法是否正确,或者一种实现的综合方式与另一种不同?如果我的想法是正确的,社区更喜欢哪种方法?

编辑:在 racraman 的评论后添加了相互排斥的条件。

在使用 always@(*) 块时,您可能最终会在设计中推断出无意的闩锁。 对于您提到的类型的赋值,最好使用三元运算符。

assign var = (cond1)?(val1):(cond2)?(val2):(val1); 
                                 //Assuming cond1 and cond2 are mutually exclusive

如果cond1和cond2可以同时出现那么上面的assign可以改成

 assign var = (cond1 && cond2)?(val1):(cond1)?(val1):(cond2)?(val2):(val1);
                                //Assuming val1 when both cond1/2 are high

至于你问的一般原则:走哪条路都无所谓。合成器将足够聪明,无论如何都能解决这个问题。对于模拟,首先执行默认分配的选项可能执行得更慢(特别是如果分配是 non-blocking ),但我不会担心它。

就个人而言,我更喜欢第二种,因为对于偶然的人来说更明显 reader 你已经涵盖了生成不需要的闩锁的基础(换句话说,你总是分配给 var).

话虽如此,您的示例(原则上)非常简单,在这种特殊情况下,很明显需要多路复用器,您可能根本不需要 always 块,应该只使用带有三元运算符的 assign

我说'in principle'是因为你的逻辑不通。你说你的条件是相互排斥的,但如果两个条件都不活跃会怎样?您真的需要一个锁存器来 保留 之前的输出吗?如果不是,为什么你有两个条件?