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

Verilog代码优化之case语句

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Verilog代码优化之case语句
5 x6 E' h5 _) `( B9 h* h  x2 l, I
) C0 w: _6 G1 p( T. J9 S; k3 k+ h
题记:那天做完13路脉冲计数并写入dual RAM模块的设计后组长看了我的资源占用,吃惊的说怎么占用资源这么少啊,以为我偷工减料了。呵呵,其实这个也是一直困扰初学者的一个课题,可综合的verilog是一个,最优化的代码也是一个,所以就想说说这方面的问题,算是自己攒的一点经验分享吧,可能会有所欠缺或者说的不太对,还望EDN的各路高手指点。那就先从case语句和if…else语句开始吧。1 m2 d. B2 w& F* H: @0 d

  [9 F& J) x  z$ ]3 d" ]# |6 n1 _" N6 v
) p' e2 r0 L; b
5 s1 {3 B2 p! {) U* l1 @代码一:
9 e0 [! `( N6 J: z6 j& U$ r) c' J0 h1 C5 g( \8 H- a9 l
module test_3(clk,rst_n,data,add);: G( o8 V. J. ?3 t! X
( ]- e% y1 a  n& i8 R2 z1 p
4 @' p' V) [" x+ ^0 h

! w9 b1 a! e  F( ?7 K+ @. Jinput clk;
* K  {( r0 O; ?9 @* o' J4 ~# [) F; Y8 d! A  X
input rst_n;5 @6 v# S( z6 @# U! M  g7 m! h

6 f- y# n! z8 U% G+ s% O0 o6 ?- H3 [input[3:0] data;* \; C- _' R( }. L0 h& }
% p; I/ `* j( ~
output[2:0] add;
' r4 w& w( E8 ?7 \# \1 X% M0 s" n* G

# y5 R3 j0 B/ |8 r$ I8 v3 N' A3 n4 b% ]/ h, ?1 H7 d) J
reg[2:0] add;0 }7 s, T7 a# S9 ^. w9 h
: X8 g; R- |3 Z4 i! ]* g5 A9 A

! `+ y4 P( S8 |/ _5 W/ X; ]: `; g" r: u( V( X7 x2 h1 t
always @ (posedge clk) begin
6 Q0 \! u( N' v) \- n5 w. q8 F, U
6 c8 T+ P; t" Y- K* J8 p       if(!rst_n) begin
: G4 o- Z5 p4 Q% e1 g% v) ]6 n
6 {8 m1 m& m2 ]4 R) o              add <= 0;
) I: [4 q* P3 [6 G4 A7 S2 i2 X! t% O1 c$ L6 c
              end% Y% k5 w" Z: z  L

$ v( ~6 z% h6 K- m% z8 I+ r5 ?       else begin+ A: K' j. l. N1 Z3 g

: D# K) `9 o6 @8 V+ s! U2 H9 |              case(data)
. D9 a- h4 A" k: r4 j: I* L1 E. \+ y6 a
              0,1,2,3:   add <= 1;! L' X2 k. W5 r

! i4 A/ v: h3 \              4,5,6,7:   add <= 2;
" o' U  u4 r/ I( m# u1 Q+ j
' k+ N: Z0 t! C! y& |9 H: H! k9 N: n' ?              8,9,10,11:       add <= 3;
# |& z8 t' m* C( T5 m* \) ]4 W, A% d2 p9 {: l
              12,13,14,15: add <= 4;- N8 k' e6 ^% K8 N: x  g8 R, U

; @4 T- c3 @' _              default: ;
& _+ X2 n. {& v1 g+ f' R' k  `! \
              endcase4 Q( B5 V7 V3 W6 a  \: z

& i$ r- a& F4 Y1 v+ k) [4 }7 T              end
( I. w# @/ c& ^$ c2 D
2 \' E8 i' Y% `$ [2 A0 p; Iend
9 W) A. {" W% d# S  O
2 `# L7 S4 F& x8 |/ v$ \9 i2 V4 A7 w  S; I
. S  }7 L3 D4 `8 G0 x
endmodule, a& Q8 V; C; L1 R7 e. V
' E# b1 l- j5 Z& K" ]. _
资源占用情况:
1 Z- r  O% x4 E2 x3 i" I9 w3 l
# Y. ?6 B) k( R! z( V# h8 I; hDesign Statistics
3 e: m# m2 j3 e  X! Q. V3 G/ h2 \) Y5 V% f! Z
# IOs                              : 9% h+ K. [1 u+ A3 [" V5 R

# U  s, h8 {6 K0 a5 C1 a3 _4 `* c$ V& W7 H6 V4 }
) ~; f  Z2 d8 w6 |! ~1 H" ]" Y
Macro Statistics :# R' G7 R. L) ?/ T2 L- N
, u, L9 V) z1 s
# RAM                              : 1. a7 Q! Z1 c/ _/ q# L, O- S  i& a+ ^0 G0 b

( O) ]6 K$ B5 M8 X3 x' w#      16x3-bit single-port block RAM: 1
/ k( F' N4 Y# t7 }- x) g
7 t$ A, f' h/ M
# R% l  ~* X* {: d: v! a% R
9 \1 X/ Z% M9 t4 |4 ]# ~- NCell Usage :. M9 l; ?; [, J9 a
) n" B- f' Z1 v  k
# BELS                             : 3
6 R. @& W5 d, o8 |# P5 `
1 N: O* j: Y7 h" R7 D#      GND                         : 1
2 f9 j$ I0 Z7 s  k) R. e3 K+ O, D1 n$ m* C( I1 C# |# R. B
#      INV                         : 1. M$ t8 }. x- B9 J
# ?& a  q2 A! Y# `
#      VCC                         : 1
$ S% N; b: B5 n; j# X2 X$ b1 n) k9 s* `3 R( }. q
# RAMS                             : 1& ]) T! I5 p: E1 }
( X0 _3 k9 V4 _& Z$ p
#      RAMB16_S36                  : 1
, D+ v2 Y' F2 h
6 p+ M' V1 J# J8 h# o. H$ }, b5 d# Clock Buffers                    : 1
- x) r+ |& r- _6 w$ ^/ a, I* I: M3 E; @. N" r9 x0 A
#      BUFGP                       : 1
3 t7 I# m; s8 A4 M
, ~' [2 k2 V5 R; b8 X# IO Buffers                       : 86 |. l) h; ]; F6 A5 Q' L* M' i

1 U) E2 w4 A5 T. z#      IBUF                        : 5" s- X4 s8 u  Q% {* D
+ t: I& u3 a, n# B
#      OBUF                        : 3
' e; u% H( r5 _0 G6 {# Z4 N* x3 q3 A" G6 x# T8 l
! M- N  D4 o: k9 B* \" X% x

- J+ n% M* `  j# p: GSelected Device : 3s50pq208-5
4 Y- [9 i, `  _1 Q
9 s8 a: ?- j- L% G& n0 Z+ j# t8 C- I5 J4 X6 x3 d3 C

2 S- d! @- A3 X! ^. I% DNumber of bonded IOBs:                  9  out of    124     7%
  P- g1 J' T% F9 M
# |8 D  G" A! k4 ?9 {Number of BRAMs:                        1  out of      4    25% + K( {9 @/ n5 H! l0 ~
1 g+ F+ R. ]  Q5 ?$ {
Number of GCLKs:                        1  out of      8    12%9 L# l' E1 x: b. O2 }3 b$ b
- Q/ J, i8 U) V% a( U

6 Z* c0 d  S: A5 |) `  E- n- w  n" P4 {, e
5 Q4 v* Z; r  k5 j7 }- E0 ~, d4 B1 ]8 |
( n8 S7 i8 y0 ]% s$ f4 e
代码二:" w, ?/ ?4 W, V  H( ^% E

" O6 N! _( C- p  p' A6 Umodule test_3(clk,rst_n,data,add);
' a5 w  y8 G) [: M7 ~9 J) S
# h" p+ f4 R: V/ X5 Y2 }. \8 t# r# R
/ V  [! }% `/ i+ C3 H! q% u0 c
input clk;, }& R0 d, c6 d7 m. c' ~5 B3 T9 X- m

" A: D4 m. u, ?input rst_n;
% Q! E/ j; O2 y; L7 m: o
- K% q" N# e, d. @input[3:0] data;
* h6 G0 B/ Y, a8 ]0 R+ R" E* D8 l0 v2 m6 \% _' G( e' b) o( r
output[2:0] add;
; \* L5 c4 m, ~$ u6 T) ]" S7 z& X, O4 u/ L% g& S

7 Z2 W/ v& Z  g. w7 \3 ~: W  a* |4 t9 G6 m% o
reg[2:0] add;/ V0 J6 S. G% Z2 i" R# p
8 Z' L' t: j" h6 v; j- }3 X
$ s# v. a* B6 w0 E

5 J: m' ]: j; {/ c+ valways @ (posedge clk) begin1 t( q, A: X3 u) q' B8 v

* U3 N5 g+ s! z( J- Z/ ^6 Y9 H       if(!rst_n) begin7 i. N$ I2 e. ^) \% C! E
+ W9 B5 S$ F2 K
              add <= 0;$ A) p8 N0 z* S% Q! C, w, {$ S
; t5 |1 m+ p' z& K
              end/ v4 L3 _9 P- P6 t4 e. d' z$ i. g' Q

# l3 P' N& V& Z) J) r       else begin
8 j* i2 ], u3 i) M5 X& \& H0 [
              casex(data)
+ E3 m: y; f; d2 ?9 S7 q! z9 F5 \8 Z
              4'b00xx:  add <= 1;+ N9 I9 o) R' c6 \1 }4 T
( b5 F0 Q4 X, F* w9 i; U
              4'b01xx:  add <= 2;) c8 Y- p+ W- B- @0 G- T4 V$ X

: I# v1 }8 O' r: y  z              4'b10xx:  add <= 3;
6 z" C8 ?$ W, H/ S2 ~# u0 S* i! v5 X+ c3 Y. m+ C
              4'b11xx:  add <= 4;
; b8 [: _) p$ C. }. A" I. u
' f0 w2 A6 c7 S+ z% W) |              default: ;8 C# N: z' t# N4 O
  M  ~: Y6 w2 p  t) v+ Q4 Z" Z
              endcase" l: _' ?" o& E6 J) U2 V

( b4 h$ `/ w9 N+ Y1 L) Q              end
' F! {# z  a3 Y, v' }' [9 t% U( M. @, \( c+ b: S! s$ N1 A' O1 g
end" @( i- ]' ^! y" y1 @( q' v8 P9 O
, r( a& {! K% E) ~0 ^
; C; y# x0 [& O$ I! a% o3 z
: q* U; h5 n% o6 Y
endmodule
' ~4 l8 P! ]( K% J8 ^6 m% ]8 i. b2 p) g. n6 l' a
资源占用情况:6 Q1 h/ |1 R) P1 g+ _8 K5 Q3 V
( R, d: j7 N; D$ A# C
Design Statistics
  }7 L8 I! ]8 v9 J- i/ S  E& r* ^3 G9 ]! t" c
# IOs                              : 9
' ?' R& u) p- T; Y1 V! ]' N. j1 f0 o7 n1 x  x$ B, n* H

6 ?: o" Z; T2 H/ d8 j: j
8 H+ V# v7 ?# u  V) F( pMacro Statistics :
1 g. P4 _  t: Q) w$ O  H8 ?) }7 g3 d( ]& x' b+ ?- M6 a* y. C/ B2 M
# Registers                        : 1# K" x3 q" X. W/ a: k- T6 U5 y/ V# n
" Y8 ]! q1 k  x# q
#      3-bit register              : 1
; b, t- Q4 g1 o" [0 k$ X0 b  m* t

8 e5 _3 ^2 T1 p; i( _! b/ P: L
" O8 }+ P% }3 D. fCell Usage :% D  ^, O3 Y( f# g9 y

( o; O( I. q1 d% A. x% o- t# BELS                             : 4
1 U$ |0 g4 g/ X& m5 ]* H! o/ m; `% [' W1 D( d9 R
#      INV                         : 2/ m! U5 o0 z$ B6 W1 h& {* f/ M5 B
6 {$ r  l! P* i4 A8 h
#      LUT2                        : 2: Z$ S5 l5 c5 b

' h8 W, e4 i9 O# FlipFlops/Latches                : 3& u* _1 `$ `" _0 Q0 i1 B$ x! D
! S' m5 n! P0 G3 {1 g
#      FDR                         : 35 Y' X6 Q/ c* K+ O

2 H! t' z  Z4 b: b# Clock Buffers                    : 1
& w2 \+ H6 h& K: d0 Z- R/ i+ M% ?* A( n' u1 x
#      BUFGP                       : 1  {" h: {0 W. t
9 Y$ F% _4 K1 l( R0 h2 ]
# IO Buffers                       : 6
! D! Y: A; V7 f1 Z" C
5 K7 ]$ x6 _6 X8 i' k) n#      IBUF                        : 33 c, B( i4 E" G6 i- p
( b4 e" Q( x: N& D
#      OBUF                        : 3
+ ?+ ]2 ^% O- ~. H% n8 _+ ?% m1 t9 p$ y$ {1 w
9 ~: o' N/ f3 h; w, e
4 s, B9 @0 T7 A' C; \$ ^
Selected Device : 3s50pq208-5! P0 }8 ^/ S/ V+ |: w  J) p

" C+ @# E3 g" M5 l! x( w% Q) t: d( u4 W  k- [3 O6 k

: P1 ^% Y* y6 d0 LNumber of Slices:                       2  out of    768     0% 9 e# d* O2 j  \5 z

- Q8 Z6 T8 Q9 s8 Z/ ~Number of Slice Flip Flops:             3  out of   1536     0% 2 M& b4 o  z( V, S' K! L8 |

3 O. r4 I  p" k; G- a% Z2 iNumber of 4 input LUTs:                 2  out of   1536     0%
2 v6 i# I4 C3 j0 N. E4 L' F1 ?$ x4 b
Number of bonded IOBs:                  9  out of    124     7%
$ }+ @0 u/ D0 {  Z3 K0 A" N* C+ D# c% P) |- `6 @
Number of GCLKs:                        1  out of      8    12%0 ~! U% P7 {/ b8 W) g1 Z5 e! j

, X" Y# D1 `* V" r1 r
% N- r( v  ~3 R0 C0 D
+ H- S* T+ N3 x, @. @) R
' S& ~) x5 @" ~) \# X+ v# x- m
8 _( k0 S: F) F- S代码三:
# h3 ~2 o: n# d
# q+ z$ i% ?6 u3 {3 tmodule test_3(clk,rst_n,data,add);
# `- w$ X  D, w' {% \4 ?2 f
. w) ~; x% _2 E* m
- v, k4 z: u/ G2 Y# ]4 Z
7 R6 v$ h" m; K* u  j) ~, j; Cinput clk;8 w) Z! _1 ]! W2 J' g1 [0 U( x" B* s

" t+ n5 C& v" E/ }7 ?% Zinput rst_n;
" M. q6 [8 c! D
7 L, V  P0 ^* K6 Dinput[3:0] data;) o( q/ e; |! l: ]2 t# u7 |% b& e
2 |, \; R9 z; r
output[2:0] add;& t6 K# F+ w1 F- Z- H( }. |

2 A- W  F- t% r* r2 z% l3 |
6 M  _3 K/ z! i8 O8 o8 L+ _  H+ K' @; m7 V
reg[2:0] add;
: s0 z8 p5 t5 t# [. {! t5 E$ X8 s, {  I

* \% ^" i* u; V) ^0 h! M
! Z7 N' W  K4 galways @ (posedge clk) begin
* m3 Q) F8 p0 b2 a) p2 n  o5 I+ U; e, M( z, s) D7 M
       if(!rst_n) begin
' w, o& W; L+ I6 L; }9 }" k4 p  }
8 z( ~4 P' e; F1 j              add <= 0;
! c) P$ E7 @2 g7 y; c$ s7 {6 X  R
              end
9 F5 K2 i4 Z! @6 H8 d- O' F7 P9 ?8 ]" k) ]/ u; R
       else begin
: H, _  S* A/ B! d! r/ a* R; g+ I' _* S, y- J" S
              if(data<4) add <= 1;# R0 Z1 A0 g0 D$ ]5 a; ^, i1 M  J

' }6 C/ M3 t! a2 J              else if(data<8) add <= 2;
0 O" t1 o3 \, p. o/ K' j! j1 x  w3 k% w- y) g
              else if(data<12) add <= 3;
. E$ o0 \/ ?- L# a5 P
7 J6 w3 j2 y5 |  ?' S8 W              else add <= 4;
- ]2 h! e9 b0 }6 O1 Y2 f0 S+ n, n
' l$ j! g8 y5 ?9 _$ I              end- o( I: r3 [  K
5 a+ \% u& Q. p% ]
end
2 h7 k+ i& v" {5 F
! c, F% U- s! x8 _0 ~2 g
! a- k$ p/ @) z7 O
, C5 b  B$ s* L+ v: mendmodule
+ a" p" L& L' j. n7 h
& N$ c1 N# g8 f5 |9 k资源占用情况:
$ O  D5 w! N8 C4 i$ v0 Z0 L; `: i. G1 K: ~$ x) u! Q
Design Statistics( |) o0 `+ k* L% C. v/ m

. [% a+ X9 Y  j4 ?8 q9 G# IOs                              : 9" U; {/ B7 i; D5 h

7 I( g% E' E7 ~- \1 Y5 R! n9 Y" u" W- l

' ^8 f! E% P* {Macro Statistics :: Q: D3 U3 k- {7 w) b/ o1 D. Z

8 o& `! ]$ o4 t1 T* M# Registers                        : 3) a: \; z" n& L

0 E( j/ Y; {+ ~& \$ P; K. C2 {+ D) l#      1-bit register              : 3; g- `$ p  J, m& @& A( q4 m7 m5 D
0 _0 p( s" l/ N& G3 Z
# Multiplexers                     : 1- d8 ?, n1 i4 @5 G; v/ k. a: q

) M' }. S' J1 z9 B$ J#      3-bit 4-to-1 multiplexer    : 1
; O  j5 ]; l( X. R! j! p  C2 p) w+ k0 Z/ [' `2 Q
# Comparators                      : 3
9 ?' K( l  Y# y/ d- L
) Z' A& x6 ^) {( Q* l) W# t6 A#      4-bit comparator less       : 3
" K; z! R6 ?+ T' q9 z  W3 V: }; l, z2 f$ G
, e& x  C  n; W  _% V5 I
: q* S' M0 x6 I* S
Cell Usage :
9 H, \# t' R" x* C. q" G' P
/ ]& C% \- X7 i& K# BELS                             : 6$ ~" n" X2 B8 d6 X  e8 @
  x' f) }1 c2 ]% |
#      INV                         : 1+ g, L, _- N) g2 q* d6 X
$ }2 Q" M  e& e& x0 u
#      LUT2                        : 45 ?: w! E/ w/ ]5 h/ _

- x1 O3 l2 L3 |. {2 f7 f#      LUT3                        : 1
# t' v; V9 V- X; ]! J. J! X7 m. x/ G, v* w
# FlipFlops/Latches                : 3
1 S& k) {! {# g* p
5 I3 I  x, G2 [0 m1 ?' R#      FDR                         : 2
! q. h% {! Q2 P! c
- x6 q0 g: f, V; C#      FDRS                        : 1$ Z1 S) C' U  S1 J

5 x" Z. Q0 A* N- M% T# Clock Buffers                    : 1
2 K2 N1 _* x* ~. K5 _( A3 J: H  X& z  H
#      BUFGP                       : 1
& x, y( i1 r4 W& @( V# x8 i6 c" G: I/ O$ h+ M4 ?$ k
# IO Buffers                       : 6, t2 m' m! R  e+ T+ }$ T

$ I+ J+ ^: k2 A: C6 t#      IBUF                        : 3
) |! t, v4 q. t- Z
- z( x9 V( L* G  H#      OBUF                        : 3
3 t7 {' z( i, S5 ~6 k! H) c3 t
, |. b2 n4 v& d# O! w, w$ U' h% H2 I: R! C, {+ l
3 S. _8 |" V) @
Number of Slices:                       3  out of    768     0% 6 Y6 U" z4 y  f2 C! `

( R" g+ k- A$ eNumber of Slice Flip Flops:             3  out of   1536     0% # ~5 c  d& z9 Q  a
4 a, P" k' y* `* `) q
Number of 4 input LUTs:                 5  out of   1536     0% # N3 w- l+ o! `- {/ D9 Z7 x

( ^. r8 ^8 S5 A! F4 PNumber of bonded IOBs:                  9  out of    124     7% ; x7 B7 G& n$ b5 a( c

' n  f" y3 j9 w, ]: bNumber of GCLKs:                        1  out of      8    12%
: t2 o3 w! [2 v* Y, o& v- F6 W& h- X; I! t

6 R* O: c2 ^$ J' r: d7 r& _' _6 t2 D6 w6 Y) r

: K! {  a* M1 h4 ]
4 |  R! S- f7 K: g结语:硬件设计和软件编程不同,在C语言里if…else和for循环满天飞,可以说用这两个语句打天下都是不成问题的,但是HDL设计中这是万万不可的。我们先分析上面的结果,从以上的代码综合后的占用资源情况对比,case语句和casex语句是差不多的,一般在设计中如果可以使用casex语句那就优先考虑,其次case语句也是很常用的,至于if…else语句,明眼人一看就知道,比case(x)语句多出的寄存器比较器如果是一个更高级的if…else嵌套那么无非对硬件资源是一个巨大的浪费,至于for语句,这里没有进行对比,虽然在很多的综合工具里这个语句是可综合的,但是因为它在设计中往往不是可以和case或者if…else语句互相代替使用,所以放在后面再讨论。
1 ?  K/ g0 b( c1 @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 12:05 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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