EDA365电子论坛网

标题: 这段verilog代码是不是有问题啊,仿真波形错误啊? [打印本页]

作者: mengzhuhao    时间: 2007-11-21 20:45
标题: 这段verilog代码是不是有问题啊,仿真波形错误啊?
是一个关于流水线方式实现的8位全加器
. ?9 j: K& s5 k8 X从书上抄的一个例子:
7 d9 S+ X0 }* S  r7 v9 D  n' [$ C, S& kmodule pipeline(cout,sum,ina,inb,cin,clk);. D: o* n" h0 l% }" N
    $ V* n0 n* m* Q5 a& I. G# T
    output [7:0] sum;
2 Z) [7 e5 ]* Z& b1 k8 b7 ?& G8 c    output cout;" K! N2 z0 Z) H8 M) S1 Q7 f
    input [7:0] ina;
) Q8 I3 \) X: s5 U- e8 [' g: ], }    input [7:0] inb;8 a7 j2 l  |' _% T: r) C
    input cin,clk;
: K: R+ W4 X# y2 M' c8 Q3 V/ c    reg [7:0] tempa,tempb,sum;$ O; W8 z" u+ L% U( `
    reg tempci,firstco,secondco,thirdco,cout;
5 q: d& }" o$ Z3 U    reg [1:0] firsts,thirda,thirdb;
% G& U1 M3 }9 V    reg [3:0] seconda;& r/ Y; o+ [; `5 P! s; w$ a
    reg [3:0] secondb;0 d6 D. s2 E% {, f
    reg [3:0] seconds;: K  ?1 p9 C& @( f
    reg [5:0] firsta,firstb,thirds;
/ L- I5 f+ R* ~- d% B9 l   
& h5 @' T% P( c0 a) E& x. s- t    always @(posedge clk)  
* s8 i$ s, N6 m+ u4 f        begin( m! x, B) a# [2 j) j& j" I8 q
            tempa=ina;2 e4 P7 o3 r4 Q3 E! J( M* e, J
            tempb=inb;2 D3 w. E1 H& [
            tempci=cin;+ D& T5 I" m4 ^
        end               
+ i1 Q1 v, [  E: T- L   
! A: T" S6 C9 n3 ^    always @(posedge clk)  ; \# ]3 u& {- e+ G# X. ?
        begin
- O9 `: m7 w6 `5 ?* N; z            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
( L9 Y' n8 v! {  ^4 v3 u# K            firsta=tempa[7:2];
. ^; @: k. M/ m. D) ]- J) V( i0 G            firstb=tempb[7:2];; K: j& s0 O9 c& q. L
        end      ! h/ G# {: ~% w; S
   
- ]7 b/ n2 @7 a" z    always @(posedge clk)  . v: M9 N3 N6 m: X/ a0 s" [
        begin6 Q' [: [8 g* y8 |- D! C0 _: W
            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
! S9 N1 F( ^' P            seconda=firsta[5:2];$ }( e: i, k2 X" ?3 |
            secondb=firstb[5:2];0 m; N9 k) v" c6 E, y' h! n
        end( Y6 b5 q9 [2 v4 ~$ b$ ^3 s: Y6 |& \
   
! n' X3 Q) c( U3 M' D' k    always @(posedge clk)  & K% e2 D' |: l" Y/ V( P6 Z0 d
        begin 1 {9 d6 g8 X7 Z$ B0 [- B1 |
            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};2 c' H" d8 G' M" m
            thirda=seconda[3:2];
* |) M4 U4 ?9 `8 d8 @0 s# `; n! V            thirdb=secondb[3:2];
2 l3 S" X# s: k4 s7 \        end
; M/ u4 ]7 Q: {    & \, a( H. M0 p% T
    always @(posedge clk)  
6 Z& B* y  y0 Q8 p        begin 4 s, U9 s. `% P  C# E
            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
0 j7 [8 b" I: h2 i* ~5 J        end' _6 l+ s/ c3 t0 G# O1 q! Y
      V0 z) {7 u6 ^
endmodule
; F" o; S7 r5 ~( S自己写了一个激励文件:5 k6 H0 V! u5 P4 x* B1 Q
`timescale 10ns / 1ns
. N8 r. m# G5 r" Jmodule pipeline_tb;
4 H* _( Z7 m* a* v3 H0 J6 ]$ X, |   
3 I; b6 r2 T6 l4 d" E; y: n   
- H( k+ P: g; _9 N6 K. w( H    //Internal signals declarations:
4 |# Z0 G" k. o" m: F    wire cout;  ?5 D: y1 j& G6 e! d+ i
    wire [7:0]sum;% b- t) X  y" f$ T9 R" Y1 E
    reg [7:0]ina;1 V. S5 f3 w. A, n- e& `; w7 d
    reg [7:0]inb;
, ?  l& k$ y! T9 {/ w3 d    reg cin;
# ?, x- S% k3 p9 {' ?    reg clk;
0 ^$ G2 J: F/ y7 q0 V    parameter dely=10;
  v( X% f+ `( C/ j8 H" e   
6 y& X! A3 B! l7 V6 [5 ]    , D: m' P4 H2 H6 I
    // Unit Under Test port map
7 j3 {" x- p/ j1 D" e    pipeline UUT (. l$ _9 h+ z5 {/ U* r) x1 C
        .cout(cout),& a' @0 l9 P5 U9 `8 X, k
        .sum(sum),
' D' o/ V3 Y  u! L        .ina(ina),
& [  k; F# _2 O2 J  H8 o        .inb(inb),
" M% H! b) ~: f) I  K        .cin(cin),
6 t# ?  H& R& B# K; m. Q        .clk(clk));     
) Q1 V3 A+ W! {$ k1 l- y    ' a2 r/ P3 z7 m* o# e$ _4 h' F- V
    always #(dely/2)clk=~clk;   
$ k) }  g3 P4 c& A   
- @9 G& u, U, W  V/ M% w    initial
- S. [! h6 T4 z        begin
7 @$ \4 S3 P$ H' g; K# h# v            clk=0;) ~  z5 q4 J* k4 o
            cin=0;+ c( p  U3 {. l/ o" K
            ina=8'b0;
: @( t( u1 h/ e            inb=8'b0;
' A% {6 F) P( c8 a+ G  c            #(dely*1000)    $finish;
; @) Q% N5 a' ~" a        end    0 }* F$ E+ e: |8 E6 ?! j% _! V
   
7 x. L; g" Z: O/ l( m    always #(10*dely) cin=$random;- m- {+ X( d5 F' f. Y  c' Q
   
+ A. n$ R- X8 B& c    always #(10*dely) ina=$random; 3 h" w" `+ ^4 ]  ?) L( G
   
2 Y3 ?% @8 {8 H2 b6 m    always #(10*dely) inb=$random;
4 j! m7 M% d) t4 v   
- U& N6 N; I  P8 ^) r    initial, J& c! y# Z, q: y
        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
  K% k. H- O) A: X& Jendmodule
) y0 ~/ c  R2 d* M但是仿真出来的波形明显不对啊

Snap1.jpg (105.58 KB, 下载次数: 13)

Snap1.jpg

作者: langhuamin    时间: 2007-11-22 13:28
就是中间那组数据有一位算错了。估计是连续进位的问题。8 U& J- ?3 j. q4 {" R$ \0 S. ~
# M( \; I/ R0 R( N' ^& Y5 M
[ 本帖最后由 langhuamin 于 2007-11-23 08:31 编辑 ]
作者: mengzhuhao    时间: 2007-11-23 08:58
原帖由 langhuamin 于 2007-11-22 13:28 发表 * r5 t2 _; p( i4 E0 \
就是中间那组数据有一位算错了。估计是连续进位的问题。
问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?
作者: langhuamin    时间: 2007-11-23 12:28
据猜测,程序可能有问题。
' _& G; M/ P+ T* h( Q+ @& l{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
, Y7 p; z' j' E0 F) w; ^2 n# o
$ g4 \0 g: o; U% E" w$ I8 ~
, B8 A! P$ V0 Y% x' t- t& p  ~其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位," f' S4 A0 `( s- |
" A7 ?3 N/ g2 t  M
导致最高进位出现问题。
  H# {6 o0 H  F" U6 g! x
4 O2 v4 C, q! O6 W7 M此属推断,待验证。。。
8 Z# w- S5 R6 p$ }
* F1 P1 E) W+ O+ o可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
" p. W& `5 C3 O
: V: a. X1 u1 D1 l' N6 n# J2 E" H/ [! T再{thirdco,thirds}={second[2:0],seconds};
6 y' s( C( l+ X% |" s! F - t/ z* U( D/ e+ ]" f% X
不过我这边现在没装这个工具软件。。。
- s0 {+ n- b3 \$ v- X+ ?
% O5 q* u4 w  x' S! K

/ |- {9 n; s  v! ^$ V, {( M* A[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]
作者: langhuamin    时间: 2007-11-24 11:54
回去试了一下,确实如此。
* v3 C& `$ H4 b& F( T而且程序段可以作以下简化:, v; [0 h& d3 z. c
8 p2 j3 F# f2 t0 ~: C

$ B0 Q3 }# v$ n2 d& _1 ireg [8:0]ins;7 m9 g+ {; _" S

) i* t+ h% O5 S" lalways @(posedge clk)  
$ x" g- P9 _0 j" k4 P  begin9 Q+ S* n  C2 `$ y
       tempa<=ina;# Y" Z5 Z: ^( T6 p! S( k/ S
       tempb<=inb;
8 T' z+ J: \$ y: a# z/ I       tempci<=cin;/ W1 D$ y. v& O# d- P
   end               * a) d: q9 v" Q. g6 A
always @(posedge clk)  
+ ~* X; H) n0 O1 k; P- D begin   ]+ f9 K$ `7 r. C2 [/ U  ^
       ins=tempa+tempb+tempc;      
# C, C* t+ z8 K2 N/ n3 R       {cout,sum}={ins};
2 |/ \. k8 W* M end
作者: mengzhuhao    时间: 2007-11-24 21:22
原帖由 langhuamin 于 2007-11-24 11:54 发表 " e0 s! S3 t  r0 p3 B
回去试了一下,确实如此。
: Y& e- J( s! E' t' _0 s; `而且程序段可以作以下简化:5 U% d. V7 U7 }/ k9 y% Q" u, c3 w
( R- ]+ \4 C9 l2 l+ \, e% v

) U8 q6 b$ C- Z9 G" Qreg [8:0]ins;
5 \- G7 r1 J; l0 T( t# A" v. v1 a
8 d8 k" d1 z/ m. ^1 S3 Y. Talways @(posedge clk)  
6 G: [, l, M- V/ q; p% q- c. _  begin
" F- x: J% P6 Z1 W, m       tempa

* K6 _" l) V) N* q- w6 |. ]虽然没错1 L+ Q# r, _3 E. T
这样的代码综合出来比流水线效率低
$ `* o$ i+ c/ K9 ]# ~/ W, ^5 n( l综合出来用的器件也多哈; n0 ~+ [8 K% F' ~7 s
呵呵
作者: mengzhuhao    时间: 2007-11-24 21:25
原帖由 langhuamin 于 2007-11-23 12:28 发表 4 c1 i+ y$ t$ M* [5 Z2 |
据猜测,程序可能有问题。
& P, A- n' _" k1 ~4 x( B* k{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
( P* d6 P/ I" C; r
3 A8 `& _! A* s% r; @) {  [# e7 W8 h7 A4 p; A" ^
其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,3 s& T) r7 G6 c# t- C; q

4 N* T: F9 e; N/ R/ z# r+ I3 ?5 p导致最高进位出现问题 ...
" ]$ ?/ y1 V7 ]2 K$ h8 ~1 y% f
这个问题我也注意到了0 g" w9 T& d  q3 ]. j* N- k/ z
但问题在于为何第一也是这样的效果为何就有进位变化
- W. z5 N- a* j9 g; b5 X而只有后面的两个有错误?
- r3 k2 _" x: e, y0 [2 ~) b6 _' I% j4 M& g! e
不知道是否与verilog语言本事有关系?
1 O$ B3 a' }! h" [; Y" S$ {0 f% a' ?4 m3 Z& j% ?0 D7 b
我自己试了试8 h! K$ L& l% H' f: K7 u
如何在加之前先把2位的值赋值给一个3位的值
0 h. {0 M7 }8 g0 L& b这样就能保证赋值间的位数一样3 H, J: x" Y( }5 L
这样进位的值就不会丢失了
作者: langhuamin    时间: 2007-11-24 22:05
原帖由 mengzhuhao 于 2007-11-24 21:25 发表
8 K$ ~% H8 ?* K" d+ n% r; n
% d* p0 {1 ^+ l9 g. i/ n4 b这个问题我也注意到了
; w% G; J( g+ ^) `, y但问题在于为何第一也是这样的效果为何就有进位变化
0 b, y' T- ^! {1 @1 V1 w! ?而只有后面的两个有错误?2 b0 ?7 }6 w* [5 l  Y- \# v% @, G
1 Q# Z! r0 _+ {4 p) A6 ]) ^! V
不知道是否与verilog语言本事有关系?
4 y* H& {5 ~; m! k
2 m4 O3 I: t! ?6 S我自己试了试
$ [) }$ g# n* {如何在加之前先把2位的值赋值给一个3位的值
5 W) {! F' x8 }9 _5 D这样 ...
& ^% |0 F& N9 d4 l" _

$ ?0 j, [- C7 }  m4 i" V. G
2 P1 A& Q7 D* F  b0 n$ B% U3 m2 p/ ]& k8 o! P, {) _6 ~
也可以说是verilog本身的原因吧,
0 J( t0 j8 Q/ I# S( q4 K5 @因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}$ c4 Z5 t1 h, W
并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
9 e. }% [( l  A1 ?' t  F这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
( |; l4 d- f$ r( W9 u) l本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
  J* o0 G8 I7 m) G一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB
作者: langhuamin    时间: 2007-11-24 22:09
原帖由 mengzhuhao 于 2007-11-24 21:22 发表 , u  v1 B# O# f! }! x
1 C4 K+ O5 T# z# |# d
虽然没错' B% N2 e8 r. ]6 i! H3 b7 l
这样的代码综合出来比流水线效率低7 s, J, W, k9 j" A( y$ a
综合出来用的器件也多哈
" H' p( A' n- l+ P- h呵呵

) P" `+ `/ r4 m+ B8 \: n+ o, D/ Q) I" t2 ]% {9 K9 P  o; z9 s

3 I5 m. x; ]2 _9 }+ O呵呵,这个我倒没考虑过
作者: mengzhuhao    时间: 2007-11-25 21:52
原帖由 langhuamin 于 2007-11-24 22:09 发表
: g6 b3 _% z% ^/ Z( f) a; M, |" Q
/ b+ X! z5 y6 t+ M: w
  o7 O; l# d. u9 H& x" ^
- F" H3 c3 J- t' I( L/ z4 ?( N' C呵呵,这个我倒没考虑过
! u, T4 L  G1 T) `2 R, f6 Y
2 ?& X* Q* |* K: C& u2 q
你可以参看一些教程里面的综合结果实例对比
6 |! w8 b8 \  B$ ]
. X1 B* j, x( X$ P8 a, u1 E: z4 x: |3 x代码不同效率不一样 虽然结果相同
作者: langhuamin    时间: 2007-11-26 10:43
嗯好的,有机会会多去看看的.呵呵




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2