1

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

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

4

2 回答 2

2

要更新的问题:

( 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是单个位时,它才是冗余的。如果它们是多位宽度,则无法简化等式。a如果b两者c在相同的位索引上都有 1 值,则为 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
于 2013-10-12T00:54:29.330 回答
0

a如果所有、b和的大小都不为 1,则这不会给出相同的结果c

assign a = b & c;

但这是一样的:

assign a = b && c;
于 2013-10-14T08:35:30.263 回答