Verilog 使用嵌套条件运算符是否会造成性能损失?

Verilog 使用嵌套条件运算符是否会造成性能损失?,verilog,Verilog,下面是一个使用嵌套条件运算符将寄存器地址映射到其值的函数 reg [4:0] mux; reg [1:0] addr; mux = (addr == 2'b00) ? i0 : ((addr == 2'b01) ? i1 : ((addr == 2'b10) ? i2 : ((addr == 2'b11) ? i3 : 4'bz))); 在我的应用程序中,大约有100个寄存器,因此嵌套级别非常深。如果表达式是由CPU执行的C语言,它将非常慢 那么FPGA呢?在本例中,大多数合成

下面是一个使用嵌套条件运算符将寄存器地址映射到其值的函数

reg [4:0] mux;
reg [1:0] addr;
mux = (addr == 2'b00) ? i0 :
  ((addr == 2'b01) ? i1 :
  ((addr == 2'b10) ? i2 :
  ((addr == 2'b11) ? i3 :
  4'bz)));
在我的应用程序中,大约有100个寄存器,因此嵌套级别非常深。如果表达式是由CPU执行的C语言,它将非常慢


那么FPGA呢?

在本例中,大多数合成器将其解释为一系列2对1多路复用器

在更一般的情况下,例如

output = (one_condition)? a : (another_condition)? b : (other_condition)? c : ... 

它将为扩展异步路径的每个条件使用多路复用器。较长的异步路径意味着较长的稳定时间和较慢的最大时钟频率。

根据我的经验,这取决于合成器以及使用的选项。它可以将您的代码用作生成等效逻辑的功能指南。或者它可以将其用作结构指南,在这种情况下,每个
?:
条件运算符都映射到一个2:1 mux。您可以使用合成器进行实验,以了解如何生成等效门,并阅读手册中的合成选项

通常,当我有意使用2:1 mux(或三态驱动程序)时,我会使用
?:
条件运算符。对于更复杂的条件复用,我更喜欢使用case语句或if-else语句。此策略通常满足时间和区域要求


对于大型多路复用(您提到的“大约一百个寄存器”),满足时间和面积要求可能很困难。有时候合成器可以处理这个问题,有时候需要更多的指导。合成器指令(请参阅手册)和将多路复用器拆分为块是处理它的一种方法。您的FPGA可能有一个专用逻辑(RAM、复杂算术逻辑等)的宏模块,您可以实例化它来代替部分代码

这将花费额外的硬件,您可能会担心逻辑门之间的延迟。最好使用
case
语句。我认为,它将合成为2*1 mux系列。因为嵌套的条件运算符天生具有优先级。@KaranShah我认为合成器比它更聪明,但我检查了一些Xilinx应用程序注释,没有发现任何线索。我想你是对的。我正在更正答案。我发现,它使用了七种不同的方式来实现4对1的多路复用。你认为示例III和示例IV在我的100对1 MUX情况下比示例V好吗?@HYRY,是的,我建议III和IV优于V。如果阵列深度是2的幂,示例I和II可以工作。所有示例在功能上相同,合成的面积和时间可能不同;加上代码的灵活性和可读性。仅供参考:链接中的示例使用Verilog-95编码风格。它是有效的,但是Verilog-2001样式优先与ANSI标题样式和组合逻辑的自动灵敏度列表(
@*
@(*)
)一起使用。我建议查一下。