在定时关闭,多个“ if”或“ if-else”方面更快些?

时间:2018-10-17 17:22:01

标签: if-statement verilog synthesis

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

如果我知道abc在逻辑上是合理的(如 I 知道的那样,则该工具不一定能够指出)将是互斥的,那么在综合结果方面会更快些?

此:

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

我认为前者是因为嵌套较少,因为没有检查,然后检查,然后检查。但我之所以说后者,是因为如果一个条件首先评估,则无需考虑其他条件的结果。但是也许我弄错了什么,错过了什么。

提前谢谢!

2 个答案:

答案 0 :(得分:0)

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

话虽如此...

任何需要研究的人都可能不知道逻辑的排他性,如果这些条件检查是通过某些外部信号控制的,则可能导致他们错误地控制逻辑。从需要真正检查代码的角度来看,这也很难读懂。 if / else清楚地区分“ if if else,则这样做”,并且在结果方面没有歧义。在查看您的操作及其匹配方式之前,我必须先查看if的顺序。

由于我们在谈论逻辑速度,因此我们也可以讨论模拟器速度。在第一个结构上,您现在正在让模拟器执行3 if检查。第二个可能低至1,最高可能是3。虽然如果您使用较小的sim卡,则看不到这种影响性能;如果这是在快速时钟上多次实例化的某种逻辑,它将开始吃光模拟循环。

答案 1 :(得分:0)

这两个代码段将导致优先级复用。唯一的区别是,优先级的顺序由您/综合工具分别在第二/第一段代码中确定。

但是,如果您要针对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 

关于, 巴拉德瓦(Bharadwaj)