If statement 什么';s在计时关闭方面更快,多个“;国际单项体育联合会;或一个;如果不是这样的话;?

If statement 什么';s在计时关闭方面更快,多个“;国际单项体育联合会;或一个;如果不是这样的话;?,if-statement,verilog,synthesis,If Statement,Verilog,Synthesis,假设我有一些逻辑依赖于三个信号a,b,和c,来分配变量d 如果我知道a和b和c在逻辑上是互斥的(正如我知道的那样,工具不一定能够找出这一点),那么在综合结果方面,什么会更快 这: 始终@(posedge clk)开始 如果(a)开始 d大多数合成工具可能会根据您的结构为两者创建相同的逻辑,第一种情况是a->b->c,第二种情况是c->b->a,涉及条件检查 话虽如此 无论谁需要查看这一点,都可能不知道逻辑的排他性,如果这些条件检查是通过一些外部信号控制的,就可能导致他们控制错误。从需要真正检查代

假设我有一些逻辑依赖于三个信号
a
b
,和
c
,来分配变量
d

如果我知道
a
b
c
在逻辑上是互斥的(正如我知道的那样,工具不一定能够找出这一点),那么在综合结果方面,什么会更快

这:

始终@(posedge clk)开始
如果(a)开始

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

话虽如此

无论谁需要查看这一点,都可能不知道逻辑的排他性,如果这些条件检查是通过一些外部信号控制的,就可能导致他们控制错误。从需要真正检查代码的角度来看,这也很难理解。if/else清楚地区分了“if-this,else-do-this”,对于结果没有模糊性。在我看到你在做什么以及它是如何匹配之前,我必须先看看if在第一个结构中的顺序


既然我们讨论的是逻辑的速度,我们也可以讨论模拟器的速度。在第一个结构上,您现在正在使模拟器执行3个if检查。第二个可能低至1,高至3。如果您的sim卡较小,您不会看到这对性能的影响,但如果这是在快速时钟上多次实例化的某个逻辑,它将开始消耗sim卡周期。

这两段代码都将导致优先级mux。唯一的区别是,优先级顺序分别由您/合成工具在第二段/第一段代码中决定

但是,如果您将此代码作为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})

HDL编译器中的3'b000:d_非常擅长优化,对于这样一个简单的电路来说绝对是如此。我想你不会发现有什么不同。你需要确保合成器理解它们是相互排斥的。
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
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