case与if…else优化<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
两段代码, EX1使用if…else语句,EX2使用case语句,它们综合的结果有多大差异呢?最终布局布线后的结构又有多大差异呢?
EX1:
input clk;
input rst_n;
input[3:0] data;
output[2:0] add;
reg[2:0] add;
always @ (posedge clk) begin
if(!rst_n) begin
add <= 0;
end
else begin
if(data<4) add <= 1;
else if(data<8) add <= 2;
else if(data<12) add <= 3;
else add <= 4;
end
end
EX2:
input clk;
input rst_n;
input[3:0] data;
output[2:0] add;
reg[2:0] add;
always @ (posedge clk) begin
if(!rst_n) begin
add <= 0;
end
else begin
case(data)
0,1,2,3: add <= 1;
4,5,6,7: add <= 2;
8,9,10,11: add <= 3;
12,13,14,15: add <= 4;
default: ;
endcase
end
end
先看看综合后的RTL视图。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
If…else语句综合的RTL视图
case语句综合的RTL视图
单从RTL视图来看,二者综合后的结果是有明显区别的。If…else趋向于有优先级的结构,而case则是并行的结构。
但是,我们再往下看。它们所占用的资源情况:
If else结构的资源占用:
Resource Usage
Total logic elements 3
-- Combinational with no register 0
-- Register only 0
-- Combinational with a register 3
Logic element usage by number of LUT inputs
-- 4 input functions 0
-- 3 input functions 2
-- 2 input functions 1
-- 1 input functions 0
-- 0 input functions 0
Logic elements by mode
-- normal mode 3
-- arithmetic mode 0
-- qfbk mode 0
-- register cascade mode 0
-- synchronous clear/load mode 0
-- asynchronous clear/load mode 0
Total registers 3
I/O pins 9
Maximum fan-out node rst_n
Maximum fan-out 3
Total fan-out 14
Average fan-out 1.17
case结构的资源占用:
Resource Usage
Total logic elements 3
-- Combinational with no register 0
-- Register only 0
-- Combinational with a register 3
Logic element usage by number of LUT inputs
-- 4 input functions 0
-- 3 input functions 2
-- 2 input functions 1
-- 1 input functions 0
-- 0 input functions 0
Logic elements by mode
-- normal mode 3
-- arithmetic mode 0
-- qfbk mode 0
-- register cascade mode 0
-- synchronous clear/load mode 0
-- asynchronous clear/load mode 0
Total registers 3
I/O pins 9
Maximum fan-out node data[2]
Maximum fan-out 3
Total fan-out 14
Average fan-out 1.17
二者资源占用的情况基本是完全一样,连平均扇出也一致。
再看他们的Technology Map Viewer:
If…else的Technology Map Viewer
Case的Technology Map Viewer
二者完全的一致,所以,可以明确的说,在这个例子中,If…else和case语句最终的实现都是并行的,而且完全一致。
记得特权过去也曾认为If…else和case综合实现的结果是不一样的。也曾就这个实例写过博文,分析的头头是道。但是现在的结果似乎推翻了这样一种思想,过去使用的是Quartus II 7.1i做这个测试,现在使用了9.1版本,8.1的也测试了,也许If…else和case语句的优化随着软件的升级,已经不再简单的交给用户的代码来决定,而是默认优化了。就像状态机中讨论独热码好还是格雷码好一样,其实这个优化已经成为了软件选项了。
而综合的RTL视图到Technology Map Viewer其实也还是有差距的,它们之间的优化就是映射所要干的活。
总之,If…else和case语句实现的结构到底是怎样还是要看工具,具体问题具体分析。不能片面的强调If…else和case语句谁好谁坏。
用户961355 2013-4-26 09:03
用户377235 2013-4-15 10:32
用户1665873 2013-4-10 14:30
用户377235 2013-3-2 23:24
用户575829 2010-12-6 16:38
用户234619 2010-4-25 20:20
用户1377542 2009-8-11 00:26
用户536736 2009-8-5 11:32
ilove314_323192455 2009-7-22 13:49
ash_riple_768180695 2009-7-22 08:56