冗余条件运算符



我在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) );

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

更新的问题:

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

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

  1. 多路复用器可以具有更理想的扇出负载驱动程序。
  2. 故意注入延迟以进行毛刺滤波和/或平衡逻辑传播延迟。
  3. 对于IC设计,它可以使手动ECO更容易,将一个输入与另一个网络交换。

使用适当的工具,上述原因在98%的情况下毫无意义。一个好的合成和时序分析工具将处理原因1和原因2。添加一个好的ECO工具,第三点就被覆盖了。另外 2% 主要用于您期望执行 ECO 的罕见情况,然后强制多路复用会使最终输出位置和负载更可预测。


对于原始问题:

仅当bc是单比特时,它才是冗余的。如果它们是多个位宽度,则方程无法简化。 如果 bc 在相同的位索引上都具有 1 的值,则a将为 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

如果所有 abc 的大小都不为 1,则不会给出相同的结果:

assign a = b & c;

但这是相同的:

assign a = b && c;

最新更新