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

Verilog代码优化之case语句

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Verilog代码优化之case语句

( u. R' g, X7 P+ ?/ s/ R/ ]
- p  l. r6 `5 o. ]" x
题记:那天做完13路脉冲计数并写入dual RAM模块的设计后组长看了我的资源占用,吃惊的说怎么占用资源这么少啊,以为我偷工减料了。呵呵,其实这个也是一直困扰初学者的一个课题,可综合的verilog是一个,最优化的代码也是一个,所以就想说说这方面的问题,算是自己攒的一点经验分享吧,可能会有所欠缺或者说的不太对,还望EDN的各路高手指点。那就先从case语句和if…else语句开始吧。! W- S  B) t/ W7 @, \0 J' f* H

" Q) E, o2 L; p8 A
& t! l" U' L' |6 ]  D9 o
3 i4 H" s3 b+ e! @. D" ?# q& q: U代码一:5 j9 @+ a0 N0 ~* ]7 i

+ A9 Y7 ?& X3 C  v/ L! c  Z: e$ k+ t" Emodule test_3(clk,rst_n,data,add);
, d. M* [4 K$ t9 @- [% V: ^; Y
) e( Y6 P3 P2 K6 |+ T- I" k) Q* j
0 ]: e! ^! R0 n
, R5 r, z* L1 {input clk;5 M4 c' I% w7 ~+ i6 {. ]7 ?
+ I' |0 x; y- A( v& l/ f0 q5 Q
input rst_n;  P! ?: D2 w0 A

/ E3 v9 l2 C3 c) kinput[3:0] data;. q- W5 X6 \# c# X

6 j2 ^  P5 G1 d$ H: I) ~- Ioutput[2:0] add;
/ x# O1 c4 H% \0 E7 C, i, J# _
' A2 B1 x8 }% N9 q, r% W& n& j; @
4 e( p  D* i- {8 n; M, Q# P9 C& j  ?7 w  A9 u! y% `% K
reg[2:0] add;
: I3 S8 @) i; r; c0 ?4 c) X* K" b5 t& q8 P1 H

) _. @& H0 c* i% Y
& j$ i5 d+ Q+ q5 G5 q6 Ualways @ (posedge clk) begin* e# k% {. w) Q( R" w# v: ^

8 C% I. h8 }3 G) j& r       if(!rst_n) begin
, W+ m6 ^% X/ e% p! r! F7 i; j# `  t! f
              add <= 0;
+ m5 d7 c1 O( M; `! t* D( C  \$ `! g& W; Q, i8 Z! q* x
              end7 x4 C  c5 @- o+ s6 J% v; |7 x3 \
+ u$ Z' L7 |0 q1 k8 M
       else begin: @8 q! G+ a' _/ U
4 Z; T" @; n4 u& Q
              case(data)
/ g9 ^( M# d1 s7 f' j( P0 I
$ P& Q& J1 l; y$ U              0,1,2,3:   add <= 1;
( T; X" W9 g* \; f, q  G; g3 j1 e4 Z# X9 z/ b; C% W7 s% Y# Q
              4,5,6,7:   add <= 2;
1 d) ?$ a( S, H+ z$ l" D+ N. \1 `2 B1 T2 z+ x
              8,9,10,11:       add <= 3;
, v) Z- g* N: x( p$ `$ d3 v* c- @( ~! S5 C
              12,13,14,15: add <= 4;
7 i8 R0 i9 y0 r' u- s' r. Y5 e
0 |9 ?, S' y; Z: s8 v# U              default: ;6 Z  N5 H  a  l6 @  M8 o; O
5 N( Y6 g3 s, a- r0 Y
              endcase
3 I& S" L; u2 A, M
; g8 t2 i# E0 I& j5 B              end
' K* [- R9 y: @7 @  g4 O1 W3 v5 {
end
  B5 p: j" z$ \, n/ R1 s! ]: C  }: `
# H9 w7 h* ?- g- t& |' P, Y! u
7 E1 x9 N, T, ^
endmodule
! \2 L  [7 v& V9 x2 P: L6 r$ i% T6 r. f2 I
资源占用情况:
" O6 p& i0 w$ Y0 Y- E% c. C% q9 t( f9 v
Design Statistics4 `% o) y  K; c+ v+ G$ w
* b- X' X9 c5 D9 w
# IOs                              : 96 C+ [( q# i: B9 n

- \( ?7 t8 y$ a  [% a# O( ]8 U( R+ m1 T' Z

- p$ b7 A" F. S' TMacro Statistics :
4 J' A4 u" H/ [) P, g: s1 h6 n  [3 C0 Q
# RAM                              : 1
) \- t- ^) ]. _* w- _, w. @2 [! q8 N! Q6 d  ^' p/ J
#      16x3-bit single-port block RAM: 1
$ H' U) t0 V- m- V* c1 C
+ L! l- [. J$ M6 H( y" m# H9 w! E
7 h1 Q. w3 s2 G! b4 V. ]2 j
Cell Usage :5 t) N1 Y9 }( g" F9 q$ L

; L% v, X$ M% t/ }! ?0 w  O+ s% z# BELS                             : 3$ i$ E$ g% f- @/ I
2 T9 ^9 p) u# r; T& @: G
#      GND                         : 1
: w0 u% ]$ Z+ @7 y6 I# Z6 l% S
7 ~9 N$ I( p/ r#      INV                         : 1
3 ]# H) B1 a2 q( L% s! t. a
+ f( L. Z5 J8 j( j- D' Z8 h#      VCC                         : 1) [: [. K* E% ]2 A  ^5 ^( Y* R

- H% L4 c" n6 }# RAMS                             : 1: S" I. c& d1 a$ C1 ?
2 ]+ y- M4 J: s
#      RAMB16_S36                  : 1
- @2 `* }! d  s" X* H
8 W. ], Y+ b- \+ x# Clock Buffers                    : 1: y# @6 w! h) W) m5 f& ~) r$ h0 w
2 C4 S9 P9 C& t
#      BUFGP                       : 1
, L: i* ?( H5 |4 H- M, K0 b" ~) q. [9 ]8 |( V2 e' c; `: W
# IO Buffers                       : 8
7 `: u3 A; t' K. J6 ^9 T" b6 _9 S: j
#      IBUF                        : 5
8 b4 u8 R2 H* Q) [4 m8 W# w( [( T
$ j3 J; t/ D1 e; x9 w5 r" M+ s#      OBUF                        : 3
! @+ u8 E& U& K' x$ N6 G' R% |9 _0 O# [4 l- W

  L' Q$ r* i8 \1 R) x
3 _) O  a" i( OSelected Device : 3s50pq208-5! D  V! f+ C+ l. X0 L5 @9 m, j" g

$ a$ }# I: t8 t$ V0 J, Q, x6 z! q$ V
; r0 T; h; M" `4 ?- R
( V/ c( [5 W) b! N, Z( y( uNumber of bonded IOBs:                  9  out of    124     7%
" |& G8 W5 M$ G1 a
$ ?1 D( D9 z) t: JNumber of BRAMs:                        1  out of      4    25%
( W' X, v, P' i1 A2 i2 ^' p4 k& Z2 r3 o" ~3 M+ F
Number of GCLKs:                        1  out of      8    12%7 L0 H" w4 U7 c& K; r% U) O# `

9 K" k: X) a6 a4 H# H
! c2 Z0 M' L0 t" c2 u/ s4 |) D. C6 H  D# {7 F/ N

: n4 a( N! H2 k: n6 Z
" ^  j6 ?( b7 H  _0 h代码二:
' v) `: o0 O0 @5 d# B1 ]. B% \2 r: `/ O9 S- a
module test_3(clk,rst_n,data,add);
1 p0 N* O8 v6 e' C  B6 x! S& h! v

# S6 J' @2 g/ b* m3 D5 `" ]
, m2 r; n0 \- X8 ~input clk;
/ z; F6 y5 ]- c( P4 [: X6 F9 b) u5 F
input rst_n;; x4 _4 M; Q  x: [. n3 ?- N1 b
1 r+ w. s4 x8 U3 q! \4 R
input[3:0] data;
% S; ?8 w1 J* q- @# x
% |: |3 ^& M# q9 v) ~5 w2 Houtput[2:0] add;
' r, o' n  F3 t. N' m" r7 f" N5 W( V: [6 T9 l
8 s7 e* ]7 [; T/ i& l; ~
) O! A2 k. R: }
reg[2:0] add;& c1 C! f+ ?3 _4 j9 F3 P
  Z4 a+ w- ^3 s! h

6 U# @2 y" M1 M! s0 Q* ~( u7 n# k) Y& r" b: b
always @ (posedge clk) begin0 ]& p' v' h6 H* }) T: A3 m

5 `- N7 I8 u/ i- n       if(!rst_n) begin$ D: j+ F3 A6 \3 e5 a' |/ |
: D% s3 S. J! R  Z1 s4 |2 D& ?
              add <= 0;! @7 }! W4 d' r$ z6 q

. m6 r$ [' o8 g; L4 a              end7 [& s* L2 k* Z9 A

0 G4 _! A# m4 Z) k% N' X! Z       else begin
) y" ?* k4 L0 R* D$ U
4 i2 L8 w4 ?" |* B; N& d              casex(data)
- ?! I. b, _* L# r0 z3 X" s' ?8 |- G
              4'b00xx:  add <= 1;5 z" u6 K5 \4 i; K# {- Q

1 y. s0 ^6 \2 a              4'b01xx:  add <= 2;
' u' k! i1 l! R* ]# {# n0 h) y# ~0 l- u
              4'b10xx:  add <= 3;
0 y4 p. ]8 D  {9 _: ?/ g# \. U! l+ g4 M- }6 K
              4'b11xx:  add <= 4;
3 x# y+ P, Q8 D1 M8 @, k: d0 q8 M' g; \& L7 ^5 A
              default: ;
+ k9 S0 D" @& N: D7 ^" N, D+ b" c) R/ a8 r
              endcase
% X% w, G+ F& ]) Z( j1 B% r0 }& L0 p9 O6 K# k8 |6 ^  R: M
              end+ Z% @; j  s. ]
; n' g6 |) m2 P, _% }5 I
end2 ]: _5 h" l2 {) H( V$ ~9 r# j

- T4 v; v5 B+ [. j9 R& f1 R  {( f, d8 y- M/ C, C( O, s

8 T$ \5 s' `5 `& G# Cendmodule
" Y( l' n% v8 K% J) |. b
2 L% m/ S7 b/ ~. z% \: W) Q4 ]资源占用情况:& H, _) p' M) n7 G9 m6 j- x- T

6 B: v  {; S! i6 L, N5 \Design Statistics
7 y- D, [* s' U: C
0 m0 ?  D5 ]+ w! u# Z6 B/ l# IOs                              : 9
9 J* O* U* ^, [& @' f6 [; S+ ^) s; X" E0 M4 _
: D" [# s* c' Q5 M1 C

1 h( D, B- X5 }) }) J- vMacro Statistics :
( ?. O# f" m! O
2 s4 W  x  r3 g# Registers                        : 1
5 P- P0 M5 k/ }3 N2 v7 P2 s8 K7 I1 C
$ M( u* {0 t! e5 G- w  u#      3-bit register              : 1) p3 i3 m9 }  q5 x! c. V+ C

# x% ?5 T7 [( U# w  b. i* M8 w+ d* S  k; U( s: E4 q/ K: C
. W1 a1 V: z5 u/ q7 g, Z
Cell Usage :
$ R3 F* e6 H( x: m3 M" V1 G  P5 G3 o
# BELS                             : 4
) U$ W4 t0 Z5 b0 q6 p
6 H4 Y5 I; c2 u#      INV                         : 2
0 l$ \* _: ?! a6 q1 F% \7 Z
0 @9 r5 |$ }! T4 U; [1 y9 u" |& N#      LUT2                        : 2; k( `; F% z3 {" {  B9 y; i; a
$ n8 _) m  S1 p3 v
# FlipFlops/Latches                : 3
$ @: q2 _4 V3 S5 Z& ~4 q- K" k& z1 p7 F: e2 Z/ Y
#      FDR                         : 3
8 M3 O4 D; |8 _' z& O# z% C
: p' x7 |) E# u5 `# i( y# Clock Buffers                    : 1
+ ^! O8 |- i. B" n4 E
& g( B( @2 i+ x7 R2 Y1 V#      BUFGP                       : 1
9 s  W/ x% _: a5 l6 h# m. s" Q! n3 l6 C* y5 ?
# IO Buffers                       : 6
( i( H6 S  }& }  G! N
0 V( B$ Y+ e  P3 K4 }6 S. ^#      IBUF                        : 3
7 S# Y; K! e* J9 `# _1 H; Y
) O' h5 i  B# f  P, C#      OBUF                        : 3+ @! z# G$ M8 d
1 ~6 t1 i) q2 C8 c2 Q3 f
- z3 i/ G$ l/ `, [( l7 S3 v
4 c% t7 G9 S9 \) d2 E7 n( O
Selected Device : 3s50pq208-5
  z4 o/ M) o0 }& Z3 U# y" A
6 K- ^4 r0 T$ j
$ X- b( P5 j! \- ?; D1 y# a' ^1 |( {# i/ f" ?0 l. J5 |- @, k
Number of Slices:                       2  out of    768     0%
1 ]- M7 U8 }0 P8 l  ^+ n
* S. O: O0 |# a/ ?" c% @$ mNumber of Slice Flip Flops:             3  out of   1536     0%
0 J6 E3 b  _9 z7 z4 p) I3 b$ [9 |2 g8 @& K  m% v
Number of 4 input LUTs:                 2  out of   1536     0% 9 Z0 P) s) d# d# e

: t- b# ^7 d: v( g" ^Number of bonded IOBs:                  9  out of    124     7%
; \8 z! D+ X" w, ~8 W
. `. m9 k0 l1 R1 dNumber of GCLKs:                        1  out of      8    12%
+ N+ ?; C( o0 O% r% x# K' X' @% m  P+ K1 C2 |$ w: v
. b0 Z+ h$ z9 m) M# o+ ^  L

, v& @" [( _2 ?& x+ b) X( K& z  i0 Z) {$ H6 O: U7 b# i/ ^' [6 ?
9 K4 R9 a: i: R' ]) o) b
代码三:
4 y3 a$ Q0 x2 ^2 r$ D, Y
' V' D8 e; e8 cmodule test_3(clk,rst_n,data,add);. w7 [9 s2 r6 M" ?
" a( L% \5 }( k3 a3 Z8 Y1 \( @4 n

5 k6 B5 U1 K8 g' J& S9 r6 {, C, ]* ^* O; _/ A5 U8 O: F7 ?. s
input clk;
3 X: P) c2 M% X# J' L( r0 T2 S* p. D
* G$ K' f& W+ W# T/ |- Y( S9 oinput rst_n;
# n3 F  g' S- c% J( U+ H  Q6 F5 `8 O6 n1 {5 F+ `5 u- z
input[3:0] data;
' Z' I5 t7 ^  s# p+ U
  j# l. s$ f- \0 f6 \output[2:0] add;
6 M, o4 N5 s- F) g
' E& O& F9 `# s9 c" m* O6 {. F% ]+ J' m0 a( R: c$ u! V
' t6 m* \1 c4 Y: q7 P. g  D) Z
reg[2:0] add;3 {' N! k) p! ?, r0 ^& @

) \# M5 N& e6 n" W% v7 y" f( [* ~0 L
7 I4 B% M* A  R: f+ k; V5 X
always @ (posedge clk) begin
7 g: f3 u0 W. m  U
- B  A" L, T* K5 q. h. W       if(!rst_n) begin3 Q* a8 }& Y/ t; j- p
2 d& H+ s/ e4 M* u1 q. z$ ?
              add <= 0;
: d/ Z% I' b. D, o# b* v5 a% ~6 a3 H- |6 T2 s: b5 Y
              end* J: d4 W6 G3 K5 P8 {% W

1 K9 x, Q; H- g6 g% Q       else begin6 Z) `) G* W$ B' f
) e/ D8 I; u  [0 K& w( m1 p
              if(data<4) add <= 1;. }6 d+ P, Q& Z
6 q+ E% Q3 @7 N7 l- b, {, v
              else if(data<8) add <= 2;( I; [$ \7 I8 G5 }' j4 X1 p' Y7 s: J

9 F0 e# d7 u% j: x: y              else if(data<12) add <= 3;
; T5 z' `# ^: @  D9 Z: x7 i7 C/ A% P3 U' @$ W8 \
              else add <= 4;8 z$ G! ^, w& c; }1 ^

- A5 Q. X' `( W6 M              end+ A! ~0 U& c7 r3 h# [

. s$ E. y7 C* U' B1 m/ \- {- Cend
2 [$ l* X, ?6 e) F7 K! P6 G+ |6 R7 ^& u2 r2 ]' Y

1 v# I3 n1 i/ j" F
" W. L6 T4 [) o) Y" l' Kendmodule
: u9 d6 s- l( v; X5 l2 n/ k6 z& e$ q! p5 Z! k5 J
资源占用情况:& Q+ M. d3 [) B9 e% g  V
  d+ g8 K8 ~+ R0 I
Design Statistics; g1 V: _4 T* M6 ~+ F5 c

5 U# O! ?" T; ?& p. K7 @' m1 F3 s/ ]# IOs                              : 9( q' X/ L0 c' I) f+ Z# r' P

# S4 S( Z8 U$ \3 P( ~5 \
$ X3 X4 u& B$ p1 U: \
( R5 C$ b% r1 g- o( K: F0 ^2 ~Macro Statistics :, g+ C* {. K5 {  l

; ~$ [+ f* j! n5 o; `: C7 z# Registers                        : 3$ O2 c; m; t1 b
/ V$ h- A1 E5 W* p
#      1-bit register              : 3" b8 j$ p& Y4 s) E6 M& x
' E1 T9 b1 F8 Q* `6 _4 }2 V, X
# Multiplexers                     : 1
7 j# e6 w6 q- g9 M5 @/ p5 T2 _7 P8 x
#      3-bit 4-to-1 multiplexer    : 1
* }  Q; q3 y& d1 i) ]( ~% F' l! H+ s1 P- [0 \' d- ~
# Comparators                      : 36 X; T" t) z+ h. |$ @

# |/ s# u+ E6 E8 g. c#      4-bit comparator less       : 3/ h% G  V& O& ]$ v5 J. c

* t6 q1 W2 i' [+ {8 ]; g0 |9 w
) i7 o! [6 s. f5 J' q% E! O% W, ?4 `4 C! M! J! l- L( v% \
Cell Usage :* m# B- W* C9 l- L
" l% C& K7 G8 c) K1 N
# BELS                             : 6
2 |2 `4 w/ u4 ]1 w5 L6 m1 E$ m# G' V, s9 S
#      INV                         : 17 f  e6 E, ?; _; Z3 J

6 y) x6 {* Q' Y! }: Y1 z+ e#      LUT2                        : 4
! y7 P& R+ I3 `' M) N" @: H6 m! _* u
#      LUT3                        : 13 ?! X1 i, }, J' [0 r3 `

8 _7 y5 i' u0 D. s- f3 e2 A9 W# FlipFlops/Latches                : 3* e8 ^" D& v0 M( _$ T
9 f5 X/ R. m* ~
#      FDR                         : 2' M4 I& t; N# H3 G

2 _" t- }" f" L: G; L#      FDRS                        : 1) m. N: x7 m, Q3 e& s0 j6 x
4 U4 K: G" Q, V. ^. f# B
# Clock Buffers                    : 1
1 |; e6 h. {% ?0 `9 \  ?' k8 S6 x9 n8 X  o
#      BUFGP                       : 1
& e* ]2 [8 e- y5 g- H9 A9 n, S/ V  G2 b1 P1 u4 C* D8 l
# IO Buffers                       : 6& W* M; Y; w1 c1 \% d& A- b& p
; [  c# t( `5 c( u5 ~
#      IBUF                        : 3
  e# v4 Q7 U$ q5 \5 D4 S  m5 m9 i) ^# B" K
#      OBUF                        : 3
  c# m0 C. W) b1 \' s% I
9 E; K( u) u5 m$ ?8 \0 T4 ~
7 i- q: q/ M& S6 V/ ?) `. K9 R* c: h4 v9 c8 n
Number of Slices:                       3  out of    768     0%
, F" w9 f& G3 \! S/ H0 a
' S# X( n+ x1 m; A( qNumber of Slice Flip Flops:             3  out of   1536     0% + r3 U* }0 Z3 a( R, h% l
  W1 V1 D+ X$ f( d  r# n6 M7 E
Number of 4 input LUTs:                 5  out of   1536     0%
5 V6 I: N4 j, [2 g  I; i4 B7 o. u1 R' {8 E3 E! k
Number of bonded IOBs:                  9  out of    124     7% 0 J+ f8 k4 o& K2 Z
, i' F- I9 m8 o6 {9 W" u, e
Number of GCLKs:                        1  out of      8    12%   @$ R( o& {4 @. @

) }3 n; }7 c; D" p! v; A
7 J% F3 Z$ [1 l8 @* t  W" W/ p3 l4 M( P
# V2 X5 V+ e8 r8 N

. Y. C* q5 h% T# h4 A8 L结语:硬件设计和软件编程不同,在C语言里if…else和for循环满天飞,可以说用这两个语句打天下都是不成问题的,但是HDL设计中这是万万不可的。我们先分析上面的结果,从以上的代码综合后的占用资源情况对比,case语句和casex语句是差不多的,一般在设计中如果可以使用casex语句那就优先考虑,其次case语句也是很常用的,至于if…else语句,明眼人一看就知道,比case(x)语句多出的寄存器比较器如果是一个更高级的if…else嵌套那么无非对硬件资源是一个巨大的浪费,至于for语句,这里没有进行对比,虽然在很多的综合工具里这个语句是可综合的,但是因为它在设计中往往不是可以和case或者if…else语句互相代替使用,所以放在后面再讨论。

: a4 u$ J! H0 y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-28 09:05 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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