首页 > 解决方案 > 首先分配,然后在 if 块中重新分配,以替代 Verilog 中的 if-(else if)-else

问题描述

最好先给变量赋值,然后在 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

鉴于条件 1 和条件 2 是互斥的,我认为这两个块应该综合相同的逻辑,并且选择一个而不是另一个纯粹是审美。我的想法是正确的,还是一种实现的合成方式与另一种不同?如果我的想法是正确的,社区更喜欢哪种方法?

编辑:在 racraman 的评论之后添加了互斥标准。

标签: logicveriloghardwarehdl

解决方案


至于您要问的一般原则:走哪条路线都没有关系。合成器将足够聪明,无论如何都可以解决它。对于模拟,首先执行默认分配的选项可能执行得更慢(特别是如果分配是非阻塞的),但我不会担心。

就我个人而言,我更喜欢第二种,因为对于普通读者来说,更明显的是,您在生成不需要的闩锁方面已经涵盖了您的基础(换句话说,您总是分配给var)。

说了这么多,你的例子(原则上)非常简单,在这种特殊情况下,很明显需要一个 mux,你可能根本不需要一个 always 块,应该只使用assign一个三元运算符.

我说“原则上”是因为你的逻辑没有真正的意义。你说你的条件是互斥的,但是如果两个条件都不活跃会发生什么?你真的需要一个锁存器来保存以前的输出吗?如果不是,为什么你有两个条件?


推荐阅读