我在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设计师想要多路复用器的原因:
- 多路复用器可以具有更理想的扇出负载驱动程序。
- 故意注入延迟以进行毛刺滤波和/或平衡逻辑传播延迟。
- 对于IC设计,它可以使手动ECO更容易,将一个输入与另一个网络交换。
使用适当的工具,上述原因在98%的情况下毫无意义。一个好的合成和时序分析工具将处理原因1和原因2。添加一个好的ECO工具,第三点就被覆盖了。另外 2% 主要用于您期望执行 ECO 的罕见情况,然后强制多路复用会使最终输出位置和负载更可预测。
对于原始问题:
仅当b
和c
是单比特时,它才是冗余的。如果它们是多个位宽度,则方程无法简化。 如果 b
和 c
在相同的位索引上都具有 1 的值,则a
将为 1。
例如,假设b
和c
的宽度为 2 位:( assign a = (b & c) ? 1'b1 : 1'b0
(
-
b
=2c
=3,a
将是 1,因为b & c
=2 -
b
=2c
=1,a
将为 0,因为b & c
=0
如果所有 a
、 b
和 c
的大小都不为 1,则不会给出相同的结果:
assign a = b & c;
但这是相同的:
assign a = b && c;