就时序收敛而言,多个 "ifs" 或 "if-else" 哪个更快?

What's faster in terms of timing closure, multiple "ifs" or an "if-else"?

假设我有一些逻辑依赖于三个信号 abc 来分配一个变量 d

如果我知道 abc 在逻辑上(如 知道它们会是,该工具将不会'不一定能弄清楚)将是相互排斥的,就合成结果而言,什么会更快?

这个:

always @(posedge clk) begin

   if (a) begin
       d <= foo;
   end

   if (b) begin
       d <= bar;
   end

   if (c) begin
       d <= fizz;
   end

end

或者这样:

always @(posedge clk) begin

   if (c) begin
       d <= fizz;
   end else if (b) begin
       d <= bar;
   end else if (a) begin
       d <= foo;
   end

end

我认为是前者,因为嵌套较少,因为没有检查这个,然后检查这个,然后检查这个。但我会说后者,因为如果先评估一个条件,则不需要考虑其他条件的结果。但也许我错了,遗漏了一些东西。

提前致谢!

大多数综合工具可能会根据您的结构为两者创建相同的逻辑,第一种情况是 a->b->c,第二种情况是 c->b->a 关于条件检查。

话虽如此...

任何需要查看此内容的人都可能不知道逻辑的排他性,如果这些条件检查是通过某些外部信号控制的,则可能导致他们错误地控制它。从需要真正检查代码的角度来看,它也很难阅读。 if/else 清楚地区分 "if this, else do this" 并且对于结果没有歧义。在看到你在做什么以及它是如何匹配之前,我必须先查看第一个结构中 if 的顺序。

既然我们在谈论逻辑的速度,那么我们也可以讨论模拟器的速度。在你的第一个结构上,你现在让模拟器做 3 if 检查。第二个可能低至 1,高至 3。虽然如果您的 sim 卡较小,您不会看到这种影响性能,但如果这是一些在快速时钟上实例化多次的逻辑,它就会开始消耗模拟循环。

这两段代码都会产生一个优先级多路复用器。唯一不同的是,优先级顺序分别由second/first段代码中的you/synthesis工具决定。

但是,如果您将此代码用于 FPGA,则可以将互斥部分嵌入到代码中,类似这样

always@(*)
begin
    case ( {a,b,c} )
    3'b000: d_in <= d;
    3'b001: d_in <= foo;
    3'b010: d_in <= bar;
    3'b100: d_in <= fizz;
    endcase
end

always@(posedge clk)
begin
    d<=d_in;
end 

此致, 巴拉德瓦吉