我在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) );
这是否有助于模拟或指导合成?
答案 0 :(得分:2)
更新问题:
( enable & (mode == 2'b00) )
和( enable & (mode == 2'b00) ) ? 1'b1 : 1'b0
之间的唯一区别是后者在综合时推断出多路复用。合成甚至可以优化多路复用器。
RLT设计师想要有多路复用器的原因:
上述原因在98%的情况下使用适当的工具毫无意义。一个好的综合和时序分析工具将处理原因1和2.添加一个好的ECO工具,并涵盖第三点。另外2%主要用于您期望执行ECO的罕见情况,然后强制多路复用器使最终输出位置和负载更加可预测。
原始问题:
仅当b
和c
为单位时才是多余的。如果它们是多位宽,那么方程式不能简化。如果a
和b
在同一位索引上都有1个值,则c
将为1。
例如,假设b
和c
为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)
如果a
,b
和c
的大小都不是1,则不会产生相同的结果:
assign a = b & c;
但这是一样的:
assign a = b && c;