就时序收敛而言,多个 "ifs" 或 "if-else" 哪个更快?
What's faster in terms of timing closure, multiple "ifs" or an "if-else"?
假设我有一些逻辑依赖于三个信号 a
、b
和 c
来分配一个变量 d
。
如果我知道 a
和 b
和 c
在逻辑上(如 我 知道它们会是,该工具将不会'不一定能弄清楚)将是相互排斥的,就合成结果而言,什么会更快?
这个:
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
此致,
巴拉德瓦吉
假设我有一些逻辑依赖于三个信号 a
、b
和 c
来分配一个变量 d
。
如果我知道 a
和 b
和 c
在逻辑上(如 我 知道它们会是,该工具将不会'不一定能弄清楚)将是相互排斥的,就合成结果而言,什么会更快?
这个:
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
此致, 巴拉德瓦吉