找回密码
 注册
关于网站域名变更的通知
查看: 682|回复: 1
打印 上一主题 下一主题

Verilog代码优化之case语句

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-11 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-28 21:47 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表