冗余条件运算符

时间:2013-10-12 00:25:58

标签: verilog

我在verilog代码中偶尔遇到过这种编码风格:

input enable;
input [1:0] mode;
wire mode_enable;

assign mode_enable = ( enable & (mode == 2'b00) ) ? 1'b1 : 1'b0;

条件运算符的目的是什么?这似乎是多余和令人困惑的,因为我认为这给出了完全相同的结果:

assign mode_enable = ( enable & (mode == 2'b00) );

这是否有助于模拟或指导合成?

2 个答案:

答案 0 :(得分:2)

更新问题:

( enable & (mode == 2'b00) )( enable & (mode == 2'b00) ) ? 1'b1 : 1'b0之间的唯一区别是后者在综合时推断出多路复用。合成甚至可以优化多路复用器。

RLT设计师想要有多路复用器的原因:

  1. 多路复用器可能有一个更理想的扇出负载驱动程序。
  2. 故意为毛刺滤波注入延迟和/或平衡逻辑传播延迟。
  3. 对于IC设计,它可以使手动ECO更容易,用另一个网络交换一个输入。
  4. 上述原因在98%的情况下使用适当的工具毫无意义。一个好的综合和时序分析工具将处理原因1和2.添加一个好的ECO工具,并涵盖第三点。另外2%主要用于您期望执行ECO的罕见情况,然后强制多路复用器使最终输出位置和负载更加可预测。


    原始问题:

    仅当bc为单位时才是多余的。如果它们是多位宽,那么方程式不能简化。如果ab在同一位索引上都有1个值,则c将为1。

    例如,假设bc为2位宽:(assign a = (b & c) ? 1'b1 : 1'b0

    • b = 2 c = 3,a将为1,因为b & c = 2
    • b = 2 c = 1,a将为0,因为b & c = 0

答案 1 :(得分:0)

如果abc的大小都不是1,则不会产生相同的结果:

assign a = b & c;

但这是一样的:

assign a = b && c;