特权同学

case与if…else优化(续)

0
阅读(18348)

上回提到了if…else和case在某些情况下实现的结构完全一致,但是这次特权同学同样举一个例子。只不过这一次if…else和case所实现的结构却不 一样。

//if…else实例

input clk;

input rst_n;

input close,wr,rd;

output[2:0] db;


reg[2:0] dbr;


always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

dbr <= 3'd0;

end

else begin

if(close) dbr <= 3'b111;

else if(rd) dbr <= 3'b101;

else if(wr) dbr <= 3'b011;

else dbr <= 3'd0;

end

end


assign db = dbr;

//case实例

input clk;

input rst_n;

input close,wr,rd;

output[2:0] db;


reg[2:0] dbr;


always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

dbr <= 3'd0;

end

else begin

case({close,rd,wr})

3'b100: dbr <= 3'b111;

3'b010: dbr <= 3'b101;

3'b001: dbr <= 3'b011;

default: dbr <= 3'd0;

endcase

end

end


assign db = dbr;


对于上面两段代码,单从代码上分析,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 mode3

Total registers3

I/O pins 8

Maximum fan-out node close

Maximum fan-out3

Total fan-out 17

Average fan-out1.55

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 3

-- 2 input functions 0

-- 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 mode3

Total registers3

I/O pins 8

Maximum fan-out node wr

Maximum fan-out3

Total fan-out 18

Average fan-out1.64

二者的资源消耗是存在差异的,那么二者的最终实现也一定是不一样的。下面再看看它们综合后的RTL视图。


图1 if…else综合后RTL视图


图2 case综合后RTL视图

从RTL视图看,二者实现的确确实实也是如我们早先所预期的,一个带优先级,一个并行处理。再看看最后布局 布线后的结构吧。


图3if…else布局布线后Technology Map Viewer


图4 case布局布线后Technology Map Viewer

从最终的结构看,和RTL视图很接近。这两个 实例代码所使用的if…else和case最终实现的结构是有差异的。从之前的实例分析看这并不稀奇,意外的是使用if…else实现的结构资源消耗居然比case要来得少(只是相 对而言)。这样的结果似乎能够很好的反驳不少人提出的所谓“多用case语句,少用if…else语句,因为实现带优先级的结构比并行结构更耗费资源”的论断。特权同学提出这一点,并不是认为实现 带优先级的结构更节省资源,而是想强调一点,任何代码的实现都不是绝对的,所谓好的代码风格也不是一层不变的,是需要设计者在实践中更多的具体问题具体分 析。

另外,补充一点,该例子中使用多个if…if…语句实现的结果会和case语句的结果一致。 实例代码如下:

//if…if…实例

input clk;

input rst_n;

input close,wr,rd;

output[2:0] db;


reg[2:0] dbr;


always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

dbr <= 3'd0;

end

else begin

dbr <= 3'd0;

if({close,rd,wr} == 3'b100) dbr <= 3'b111;

if({close,rd,wr} == 3'b010) dbr <= 3'b101;

if({close,rd,wr} == 3'b001) dbr <= 3'b011;

end

end


assign db = dbr;

Baidu
map