|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog代码优化之case语句 ( M' C* s1 ~8 U" y
- T0 [- b& S' y* j) D$ C: ^题记:那天做完13路脉冲计数并写入dual RAM模块的设计后组长看了我的资源占用,吃惊的说怎么占用资源这么少啊,以为我偷工减料了。呵呵,其实这个也是一直困扰初学者的一个课题,可综合的verilog是一个,最优化的代码也是一个,所以就想说说这方面的问题,算是自己攒的一点经验分享吧,可能会有所欠缺或者说的不太对,还望EDN的各路高手指点。那就先从case语句和if…else语句开始吧。
z! ~) w% K5 x
/ q! C! W" }' S4 C$ `- x! L4 u* Z6 U& k- ]$ Q$ d9 @
, s! A2 D( b* o; s. o- p代码一:
4 h* l. \3 h* n' I% D6 p! x- ?. Q
+ h; _; g4 w B$ ^module test_3(clk,rst_n,data,add);
8 S0 L* v1 t( V- R; q
* `) S6 _2 O/ D4 t- s. _( k, [6 _' m. w p3 C4 {3 C
0 ?% l; y- f1 B3 d% [9 tinput clk;2 m Q6 z$ m2 _" {- m- f
- G) Z$ ?$ N$ ~input rst_n;
1 M, f0 z! u* l: i* x% d0 Q' E) A) n# C2 e
input[3:0] data;
, T* D9 {+ M# @2 x2 x' ~% X
& N' |4 n! q4 u2 u6 Y, k ]output[2:0] add;$ K& N+ E: j6 ?3 L4 l; G# O' t
' s' `' B5 U% w s
5 y" `& R) F+ v6 G0 Z9 ~% ^+ k+ H' H7 z( |( C, _
reg[2:0] add;
. k% Y% h% @9 t3 v, Q4 F- n6 e B* g
; [, ?6 q5 B! P( \# \* x6 E2 i; D7 W) n; P% d4 r$ ]- W6 K
always @ (posedge clk) begin# R# I3 |2 Y t2 |2 v
* C# n' Z, g, y
if(!rst_n) begin7 a5 B: q# ~7 S( P5 y+ f
& B a3 K* C0 r' s# U/ X add <= 0;
2 P0 w, O* M. \4 P3 `, d8 M/ o' Q2 t# [6 C% u
end7 l$ n2 @3 {- i4 @
0 ]+ Y+ b) `9 I% k$ H4 d
else begin; N( K/ r8 U9 A+ v- P7 c3 `1 J
) r6 p2 T; ]2 N3 W+ q" x7 R case(data)
6 D( J7 s( Y2 R o# a2 a6 h; ~- e6 X% `5 M* s
0,1,2,3: add <= 1;. ?( {" H- L- f: r
% s3 s r4 U" m; _ 4,5,6,7: add <= 2;0 E$ _1 {0 w8 x- V% D( s
# `8 x9 v5 s! d8 M3 O
8,9,10,11: add <= 3;9 a# r/ W, V, ^* f
' G; J" p% g; O6 \ 12,13,14,15: add <= 4;: J. N6 n# M! {) A
- M: x/ ~9 ~' u$ J9 T, L3 f
default: ;
4 C# v7 O% P; Z7 g3 Q! |8 S! a2 T# y2 r' F9 z% x$ |0 T
endcase4 p' Y! A7 \, ~7 ~1 \* T) @; n
" {' I* V; K* \: J) i! A# ^. b6 i end
$ j! f- W+ [# e: F1 r6 e0 \7 V4 x. d* @; O
end
0 U/ y8 P. q" g' y8 R, H& l# E: a! I! A
( |( p2 R* v( N5 W
4 r/ P8 r* ?! c/ X& E4 b! xendmodule. E, j8 x% w5 X# ?% l/ |
3 V4 t# h( t; j9 g& e: ?' o, b资源占用情况:- C; j: Q0 |+ l5 B; _: n. H/ k
0 T( x: @* J5 y7 K# VDesign Statistics$ M+ f5 K+ ?: P0 `( v* h8 Z" l
/ D+ o c; y$ U* @! P; } P8 o
# IOs : 9, {! i( D7 h- Y, X5 z
; ^0 @" m1 Y x/ C+ M
* X3 h+ V4 X8 j$ u( t/ T/ W6 ^! M Z
) M* i2 M/ L7 ZMacro Statistics :0 i6 v( @% f; ?( h; e/ _& }6 f9 E
% n; d) A) e$ b' L0 D# RAM : 1
. W5 o( M1 b+ o6 B l* G- a8 v
. }' y V: Y2 u$ z1 ]# I4 l4 I# 16x3-bit single-port block RAM: 17 }. m/ u8 A% M% ?! _+ D. \
' z3 X" L! I7 ^8 u* A( }
6 D1 i i3 t- a8 [! f N. h& k! |
: E+ W4 F! v! t/ q' d; gCell Usage :& m( n* d3 I* ~8 p% e
3 @7 `7 h! j5 ]8 d& c, D
# BELS : 3
$ W1 ]+ x* p$ y2 u; q$ t
# L5 p: G; o1 J: G# C4 |% X* D# GND : 1
0 N, T9 g5 r3 n' {3 a) y8 R. B3 ?! n( [
1 f @) [6 E+ f# INV : 1: T" P7 u2 [1 o$ i
4 n/ }7 R/ `8 k3 H6 Y) i
# VCC : 1
& I4 m9 q$ a2 F V& V3 _2 O. s( O2 M% a7 r; c; l
# RAMS : 1
3 j5 L0 {% x0 ^5 L8 @& z
( @2 ?+ x6 y8 Q% [# RAMB16_S36 : 1
2 V. H1 t# [4 r F5 C, R# v
8 z. T- l, p( R2 F$ i# Clock Buffers : 1
2 H" u0 g1 \) J5 D( Z- o' `( W1 f5 \+ q
# BUFGP : 1: |' l8 U3 a9 E# C$ \
" }2 e; s4 K# X& a' ~# IO Buffers : 8
9 O5 X- J% m C( E2 D2 N4 a) B! Y& {6 ~; B7 J x
# IBUF : 57 c2 p# W+ Y, r- E1 }
, a$ F3 T# J1 X0 t, H- b
# OBUF : 3
+ a% d2 ~* n: U9 U8 {
/ v2 ~$ V# o1 H' K
& S% _9 j Y6 G4 M$ s/ `/ |) Q& g8 T
Selected Device : 3s50pq208-5
* R. i- V$ @: B: n! Y( l. l I2 a; U; q% X. v$ C
3 z2 W, \! k0 H2 |+ f! i, p. _
7 l) |& Z: n% o) Z
Number of bonded IOBs: 9 out of 124 7%
$ T- g. g+ r: v
# U9 }% ]# a) a) s; S: a. d8 CNumber of BRAMs: 1 out of 4 25%
0 C3 D; @) |' v4 ^; s
4 @( e* \: y. q) t8 U8 X' o) m& vNumber of GCLKs: 1 out of 8 12%( C7 J; C# h) h8 ~( {9 B! Z
2 O) U/ r3 D0 y3 p ?) s! Q
5 _" e/ ]$ z+ A( J# |% x* W
3 o- }1 g7 j; h- C7 S- F( Q* i. T; x8 A& w- U H7 u7 N8 j
) k! ^& X3 U, C$ O# k2 }& \
代码二:% ]) X; d3 S( U$ a! Q' C' K) N
w; {3 L$ g$ F a( {4 X# r5 u2 bmodule test_3(clk,rst_n,data,add);4 V: j+ ~. E( ^ ]3 s0 ^1 ?
, A, V1 X( }# m5 J& s6 j
3 @$ U G, c- u2 _- I! @* O- @) H9 g8 F% w. Q3 l8 N' o; O# E
input clk;
% N/ \3 A( z0 u, p6 _, H6 ?1 T& ~# k! V! X, |
input rst_n;0 z( r* L1 T: r8 W, O2 d( I) ^" V7 T* ]
$ I( C7 f) I! q! U `
input[3:0] data;2 s4 Y. k# p$ }" B1 x2 m' R3 y
3 |$ i7 {5 d& k) s" z* uoutput[2:0] add;: }0 ]; O0 U* n6 o1 |
( C9 `0 d( N* Q* X; G4 ~9 G+ C+ e8 ]1 T7 [) l5 i
3 s+ K( ^" F; j' ^& C% \, L# Y' K1 creg[2:0] add;
7 O" T# M7 h6 \$ Y( y7 j1 `7 X5 G* \: [
3 O) F* a& _- C; Y$ h. u6 }
& W; B& [6 ?/ \: h! r+ H! ?
always @ (posedge clk) begin
5 z2 z2 J$ F7 _7 o8 }
5 c; I9 h2 |/ N if(!rst_n) begin
+ Y' x% h+ W- m4 ~9 Q9 \: p3 u- ~! `0 J0 ] z
add <= 0;
- ] b! s G/ Y [0 _0 }7 h/ o6 z, P, Y0 d+ B. v$ ~: W m% d
end, t# T' S) y# }- J. n2 K8 M
: J. y9 X' ]# d/ B3 Q' j( x' b
else begin8 f3 F7 }3 M) s( W6 s# D
5 H! a, q N- Q2 \3 N5 b/ c# O casex(data)" `2 T2 J) R: T/ _
4 @( d( n) }- z. o0 a. w% W8 a
4'b00xx: add <= 1;
/ }( T# x5 e j
: g; v" U2 j3 H; l! \! [0 B# } 4'b01xx: add <= 2;
+ ]0 B+ I8 y5 ~- n4 A
! }/ N, }* j8 `6 { s2 ` 4'b10xx: add <= 3;# f8 w4 C: f; q9 v
5 }3 U3 j, Y) u& m; e5 P+ |- q$ A1 E 4'b11xx: add <= 4;
4 v) d$ X$ u- {$ D! s9 y& L/ z+ x6 o% ^9 N4 c G9 F* T2 M7 G
default: ;
( u0 f6 w0 ^4 w+ B8 e% M2 }7 j) { H4 T' p) ~5 a& Q" U
endcase
6 j% A L6 Z$ }0 h
1 j. h1 {6 P9 D) l4 s end2 S' U. X/ z* M. Z& n$ p& ^ { _
; w8 u3 {2 X: a# p, }end8 c. G& |7 ]0 {" k6 L) g9 P+ L
$ R0 M% j1 J" A* J/ k" a. ?; C' ~
6 t O$ [4 l* O
! s U: z/ A5 o& k# ~2 t4 b$ O
endmodule
: w% S1 _8 z- R
) K6 {2 ?+ m% R! f资源占用情况:& z" |0 x& j7 i" Q1 z
' K/ }4 A1 @( a) Q7 n" ?Design Statistics- _2 L7 m% _# B
( x7 ^0 y$ V" w( ~* T
# IOs : 9
Z7 [0 L- }( t
, K# g ]9 ~2 L! a* T7 l7 ~' D5 Q
" ~8 e, R9 n: a4 v
; b/ ]- L0 g2 b+ {& s( F) _! M8 kMacro Statistics :
. {- V+ ?! M: a& w" a$ c$ B8 E- k" _! h# {. G8 H+ m$ q
# Registers : 1
% G* Y" ?& C% }+ [( {! G3 t8 K6 |
# 3-bit register : 11 s# Z* y& P7 v9 K3 i
5 u: v6 t! [( ]' \0 |2 `: n% N; J& C" {7 y
1 k/ z! x; R. b1 v; v; E/ G+ c
Cell Usage :0 K0 h3 S6 J: v+ j. o0 b" ~7 j
/ L5 |: s' L. ?! ]; U. O4 E# BELS : 4 H. ^2 t& o5 _$ X4 m0 T
( Z! t) O& @; l W# [4 \- }
# INV : 20 o2 y; ?7 Y6 N( t) _( B: |3 F% m
5 ?# L% B; U+ L. q6 o, e7 K
# LUT2 : 2/ C" t2 H2 k2 Q. _
. n. g3 I1 O" G# R0 }
# FlipFlops/Latches : 38 ~/ |$ M! K& u1 C% z/ u% r& ~4 W$ d4 X
% L) h/ W7 [$ j$ v& ^$ @6 R. h# FDR : 3
! N+ m/ y3 j ~) I3 D$ ~9 N; j5 |+ i2 U, w8 p l
# Clock Buffers : 15 H1 _5 v' R7 n6 v- ]! L% b
1 [+ u* D0 j. Z# BUFGP : 1
2 c* s( u! u/ [
- m! y) C l8 W# IO Buffers : 6* [/ t+ {- \/ C
0 {* [, q. B5 n4 Z- E0 o ^- ?9 Y7 z. e- L
# IBUF : 3
c Q7 B0 S! h+ F9 e7 N
8 G5 J, A3 ~9 d# m* v$ [# OBUF : 37 _+ X1 |. e3 v4 `" j, P6 B# J% C2 r
* B, d, ]/ u6 l# L- U3 D& Q0 p: O$ B/ f9 Y7 `6 \: B
9 K8 {+ ?- G1 t- _ f \8 q! o% b/ }
Selected Device : 3s50pq208-5
* z/ E* {" w4 n6 H
' ^- m) e8 k1 i8 J- s( S$ V' K) L5 |$ m N6 O, z& f
6 l* v; ?7 [7 w+ w8 |7 N+ c: m
Number of Slices: 2 out of 768 0%
# z. Y2 W! K& ]7 C1 b: r* m$ r% R/ h
Number of Slice Flip Flops: 3 out of 1536 0% $ ]* i0 R& b# U1 {
9 V! \0 t1 \* [8 K. Y8 d- K
Number of 4 input LUTs: 2 out of 1536 0%
# X) U* J( `4 S# w, @( P
+ g% U8 [% ]2 e/ {. b# Y* }$ h* }/ hNumber of bonded IOBs: 9 out of 124 7% 4 @; K: e" W) u1 A9 |
7 t2 c% w ]& ?$ w+ b" e4 M3 G8 I: CNumber of GCLKs: 1 out of 8 12%
$ I3 p. ?- ~4 @. G* e% w6 z# V- y& Q4 r# A S
5 D5 r2 U+ p3 T5 ]; |6 A2 d
. ^/ q% p6 \; S3 |" v" ?
" h; ^( M* A7 i0 N% T" \, e# Z, D e7 N: c u3 H/ \8 R; t
代码三:# F: @" @$ V5 j: k7 i8 v1 W+ s
% Y7 g2 i9 {& c: \) c4 [& l) zmodule test_3(clk,rst_n,data,add);
* c- @" {; m7 s+ B8 v% E6 q7 z
$ z. W+ S& Y% B) G% c% w
+ J. f: L- c' q7 a% C
' | ^$ G4 C& s( Z% H/ Einput clk;
/ ?, r" O1 I% o7 l$ L& r4 X$ H9 z. B- ]# t
input rst_n;
' F& f" e# r8 A, d6 P/ H2 ]+ m7 n( T9 R& s& T" x
input[3:0] data;
- x6 ]4 [. \3 c1 g2 l
5 N, S5 N4 D" I0 t0 d7 [! }output[2:0] add;
/ N Q. u; h( Y: t! b/ `9 X4 z$ s- _2 r' L+ G2 p2 @
) O* ~; X* T" k3 F& z- q* r) l
q1 g- F7 o, u) W% ?& i1 j/ Rreg[2:0] add;
0 k7 T8 g. S# ]5 I$ J8 ]
9 k8 j& d# R3 u) W* P& R6 j1 ?- w4 Z; k' ?2 e
. u: b3 ]' W' S* m# Palways @ (posedge clk) begin+ w$ T! A0 w0 U9 Q# ]
* U Y: _, R2 a( o& X5 f if(!rst_n) begin
% I9 D% g" R8 t( F$ W
Q- z) c# v/ j: n add <= 0;8 q$ i* z A& t+ s9 t/ Y/ v
/ P' g5 ~- j" q+ @6 E3 U: Q% Y
end
0 g2 n7 k# [2 A
2 v0 V; @. J8 Q) k4 y else begin
! G2 V1 }7 |$ H D+ m
( H- e# k# e. q- ^) M& ~0 B/ [ if(data<4) add <= 1;9 q/ z4 f, l- Y% b, E
5 t) Q0 ?! b4 d3 r
else if(data<8) add <= 2;
: M6 u! h2 R% d, a( {' m& l$ ?3 {" n0 h% [& y
else if(data<12) add <= 3;* `8 d4 Z2 y$ |+ w
% Z) s& X$ N# u4 ^. m else add <= 4;/ R6 m6 R2 J+ i0 x1 G2 x
; n' u, i% P" y0 d
end
, u8 U; d9 g8 G6 p% l0 n* j5 I0 X5 B/ M) k7 F- N# Z
end# Z* z* r, C5 [6 r) y; e* g/ |3 w/ \
; R9 e; E" d2 V0 k+ U6 m8 w
2 t6 q1 x; }- [6 N6 ]2 I' a8 C- x- I V& p8 A
endmodule
/ ] o9 V r* P$ q( c, L7 f4 [4 p. V* r
资源占用情况:) z& W. h c" l. n% \. _3 I
9 Y; g( Q A& z5 \5 n: Q# EDesign Statistics
; B. f) p* r" a, \" G9 [0 l# T- O" _2 N! ^: U
# IOs : 9& z% V0 u' ^8 {1 ~' p
7 a, D5 }$ m {0 x! W, Z: I) ^7 F9 v+ e% B
v/ D& G, y; B6 @Macro Statistics :% |8 z) {! O Y
0 U! ?5 C% ]' B* T V) J# Registers : 3! M M3 C$ z$ P. U9 ?
' v: `7 j1 e) e: G# 1-bit register : 35 n% n9 O& ~6 W) l$ Q2 R
0 w* V+ R' Z3 @8 V- C
# Multiplexers : 1& N& r, M& B# W6 @% H% q% G" }
4 \& |+ i! m# z5 I+ G) }2 J# 3-bit 4-to-1 multiplexer : 1
9 M ~9 m* V/ F. i. ?& |: O, J. @: h f# c5 U
# Comparators : 3! }* C( }! U! c* i2 A' {
- U/ S! L' U+ _9 @# 4-bit comparator less : 3* a6 a$ x; m8 Y. I! w! W; G8 b
8 [0 v3 e! U; L1 U9 B
! z5 u- e; Y$ Z$ |7 u+ i
9 q7 ~! X& {* [" HCell Usage :, d* V; l) a# _$ ^. I2 Z+ f8 u
, t3 b! h5 N! b( o) I# BELS : 6- ?8 a Z$ K% w0 |# n( W! z, E
; g3 k% M3 n' Z% e6 P# INV : 1
& H* [1 x P r4 ]& o- X( y: |# n% z, K" L7 _% f
# LUT2 : 4- \' t) w" q: w( |
6 |( M' ^7 L$ F8 x/ h& r; s# LUT3 : 1
3 T' O1 I2 [# L- N8 J3 k2 J* [5 \- l4 d' [4 F
# FlipFlops/Latches : 3
- F8 y' a6 U4 _, ?# P; p$ V0 U! H9 x6 X9 ] A
# FDR : 2
, g. Z! u7 X |" t# c( ?' _) }/ F. T. @) S: u
# FDRS : 1
7 z4 @) Y0 V6 G+ m9 X* n) [# i; K! d7 V ]9 ^$ \
# Clock Buffers : 1% w. g; A$ H, z# z0 A8 x
) i8 O; y0 i( ?6 `; g/ F' E- Z+ s
# BUFGP : 1
8 P9 q: F0 W4 ]! i) A
/ h% {: l; G- \5 s4 H0 X# IO Buffers : 6
. M9 [9 D% T& L8 |1 o x" x1 q" q
( T! c: D' y) ]9 z: P# IBUF : 38 ^2 `0 G9 d. _5 r+ } d
% `% d. E) s6 m0 }
# OBUF : 3& {+ q2 s" _ |
t( M7 D. d7 o8 y [
+ [0 _8 \3 q) Z7 l( A8 T
: g& @) b/ ]4 p2 U
Number of Slices: 3 out of 768 0%
: g$ |# c& W' W" V. Y7 C7 p2 w0 A
9 ]% u8 ^+ m( k9 T3 a gNumber of Slice Flip Flops: 3 out of 1536 0%
6 u& c7 b* r$ n3 z+ U9 B V, f0 ~9 _6 a, p0 r* v6 N: ?
Number of 4 input LUTs: 5 out of 1536 0%
, ~. a5 A# B7 h2 ~- [+ O, v" F% m8 G+ E, L" |
Number of bonded IOBs: 9 out of 124 7%
8 T: ^( F2 y# e! d0 c( J; ~4 d# @/ [- d: T- p( d7 F6 w
Number of GCLKs: 1 out of 8 12%
. P6 a( R0 q* R& m
6 A+ u/ s+ F6 V& A- {( j* K0 \0 T- K1 b" J$ u' [( X U+ S& s
% G3 M+ C. c, @- n% {
& ^' c% h) u. \) {, H. G
4 V3 W! W4 P* b结语:硬件设计和软件编程不同,在C语言里if…else和for循环满天飞,可以说用这两个语句打天下都是不成问题的,但是HDL设计中这是万万不可的。我们先分析上面的结果,从以上的代码综合后的占用资源情况对比,case语句和casex语句是差不多的,一般在设计中如果可以使用casex语句那就优先考虑,其次case语句也是很常用的,至于if…else语句,明眼人一看就知道,比case(x)语句多出的寄存器比较器如果是一个更高级的if…else嵌套那么无非对硬件资源是一个巨大的浪费,至于for语句,这里没有进行对比,虽然在很多的综合工具里这个语句是可综合的,但是因为它在设计中往往不是可以和case或者if…else语句互相代替使用,所以放在后面再讨论。 |
( u3 t# ~& A1 w+ V0 V* [4 } |
|