FPGA中带优先级的if else if与不带优先级的case的探讨


我们知道在书本上都说让我们尽量使用不带优先级的的数据选择器,今天我们就来探讨一下二者的区别。

例子1:带优先级的的数据选择器,综合成功,且没有任何警告。

module detection_prio
#(
    parameter NUM   = 4,
    parameter DSIZE = 8
)
(
    
    input  [1:0]          sel,
    
    input  [NUM*DSIZE-1:0]    din,
    output reg[DSIZE-1:0]     dout 
);



always@(*)begin
    if(sel == 0)
        dout = din[0*DSIZE+:DSIZE];
    else if(sel==1)
        dout = din[1*DSIZE+:DSIZE];
    else if(sel==2)
        dout = din[2*DSIZE+:DSIZE];
    else if(sel==3)
        dout = din[3*DSIZE+:DSIZE];

end


endmodule
View Code

我们观察一下其RTL视图与路径时序分析报告,最长路径为LUT6加输入输出的buff延迟为1.103。

接着我们观察一下低层的Technology Schematic视图,我们可以看出来这个数据选择器的每一个输出其实是有一个6输入的LUT6构成的,同样从资源消耗图上我们也可以看出来其实是有8个LUT构成的。

例子2,不带优先级的case

module detection_prio
#(
    parameter NUM   = 4,
    parameter DSIZE = 8
)
(
    
    input  [1:0]          sel,
    
    input  [NUM*DSIZE-1:0]    din,
    output reg[DSIZE-1:0]     dout 
);



always@(*)begin
    case(sel)
        0:begin dout = din[0*DSIZE+:DSIZE]; end
        1:begin dout = din[1*DSIZE+:DSIZE]; end
        2:begin dout = din[2*DSIZE+:DSIZE]; end
        3:begin dout = din[3*DSIZE+:DSIZE]; end
        default:begin end
    endcase;
end


endmodule
View Code

同样观察RTL等,可以看出在这种情况下,二者生产的电路是一摸一样的。

 

这里你可能会有疑问了,明明第一个是带有优先级的,为什么会是一摸一样的电路呢?

回答这个问题,首先抛开if els if case等代码形式,我们探讨一下我们为什么需要优先级,什么情况下有优先级和没有优先级是一样的的输出。

很简单,当判断的条件里出现两个或者多个条件成立的话,我们就需要优先级来确定我们需要选择哪个。换句话说,当所有判断条件有且仅有一个成立的情况下,我们就不需要优先级,因为结果也仅有一个。这时编译器就会根据里面的算法优化给你优化成一个较好的电路结构,来完成你所需要的功能。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM