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

这段verilog代码是不是有问题啊,仿真波形错误啊?

[复制链接]
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器
    ) y5 P( n# f6 _) O* B# H从书上抄的一个例子:& @7 T- _1 T* }+ {% L
    module pipeline(cout,sum,ina,inb,cin,clk);! d' y4 p( U1 \3 Y( n
        ; }0 j( H, H  x$ O0 [
        output [7:0] sum;
    ( U, t! x+ l& ~" R6 L: r    output cout;
    7 q/ J1 R  Q0 `6 E- p+ p    input [7:0] ina;- t0 ]  w. v, A) c
        input [7:0] inb;
    ( F7 E4 w) j) f" @  e0 c. h: S    input cin,clk;
    / U- x' M1 n: N) m5 E    reg [7:0] tempa,tempb,sum;6 v# }1 ]. C1 J1 h" _
        reg tempci,firstco,secondco,thirdco,cout;9 O4 `0 G  v1 h& N
        reg [1:0] firsts,thirda,thirdb;% F+ m: V' B8 a: e) g+ G
        reg [3:0] seconda;1 c4 Y/ J$ \6 Z' F0 F* I
        reg [3:0] secondb;* e" ^" g) B4 W' i7 t; D
        reg [3:0] seconds;. e7 N3 i9 Y" k" U
        reg [5:0] firsta,firstb,thirds;7 S2 J4 A# W* z0 u
        / l* X+ ^+ {% W. d3 K. r% B* ]
        always @(posedge clk)  
    + O7 l2 E: G3 q7 S        begin: p" l; B0 [, D8 q4 V3 O
                tempa=ina;+ q/ h6 D/ P6 f" `, A8 c% _8 ^
                tempb=inb;
    6 p& Q. k, A+ M4 T+ t% V, ]            tempci=cin;! Y! k* V0 q# W2 X' d" ?
            end               
    7 t7 V' H5 }1 h% Z6 [   
    / A7 e. |% U4 H, C    always @(posedge clk)  
    ' l9 s3 W( G3 i8 L        begin " _) Y: y( q3 H* j  [
                {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    1 N: H# h7 M4 ~) w1 `: V            firsta=tempa[7:2];
    2 j, m( J' c( A( O6 w/ U0 \            firstb=tempb[7:2];
      h: k  s1 H8 l4 q        end      : {! O' Z  R; v6 n# n
        2 D: A3 g" |$ t$ |- |3 b# F
        always @(posedge clk)  
    9 k6 e3 J7 g9 v1 c. i9 H        begin
    6 k# ]( i( X. B8 s# E            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
    9 N- e8 g7 }! t: `* {9 a( \6 }            seconda=firsta[5:2];  g$ \7 s2 ~+ n* V
                secondb=firstb[5:2];6 n+ V/ G$ h- r( Y# d+ R5 R
            end3 S! }1 K" J) T- E& U! O+ a
       
    1 h  @! ?2 N/ F* }    always @(posedge clk)  
    " l) \  }" M$ Z  _        begin
    ; J) u+ @. b4 L- b4 U            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
    1 |9 i9 J( q; [9 V$ X0 i+ `            thirda=seconda[3:2];3 x) T4 _1 T. C; I- ^8 F
                thirdb=secondb[3:2];
    5 t+ @. T- \; A% M        end7 v3 r1 ]: b, _& A# L$ ?( L
       
    2 l0 y4 e# G( {% j+ |    always @(posedge clk)  
    ' O$ K  x9 }% A, c' }0 d        begin / E" V- P" t9 V& |+ @8 [' O
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};+ M, y+ m( j8 q8 ]( Z; m7 i
            end1 ]+ w5 c7 Y6 t  w5 V
        , e$ U- m' D. |% q3 Q
    endmodule. d3 y! I% r4 `+ p4 |
    自己写了一个激励文件:  a' H) a$ J% u& A! N! F) q
    `timescale 10ns / 1ns4 V8 g+ y; S' J; A
    module pipeline_tb;
    / ~7 h8 ?% d/ r2 I" B3 Q' f    9 L: l! _# T$ A9 o" x& ^( M
        , p. _1 k, \9 ^& b4 k" M' _
        //Internal signals declarations:
    7 }8 s0 L' q. |# m* X( w    wire cout;1 r1 _0 I) H# N2 c) O: V5 f
        wire [7:0]sum;$ w* D1 c2 ~# R/ y  b! T$ T
        reg [7:0]ina;0 c! @; t# |* p% ^4 M; P; ^
        reg [7:0]inb;$ N2 {, A$ v+ y2 e/ _
        reg cin;
    # q/ k) \( Y5 u. l    reg clk;
    6 [4 j) g0 n& u( R1 I% g    parameter dely=10;3 O- u' M/ ]4 U& y" ^
        5 I; I' m. x: L+ x5 A; a% c
       
    & B( ]* }0 m6 l/ ~    // Unit Under Test port map
    : e/ G+ U2 O" V  M4 W1 m! I    pipeline UUT (
    : O+ @! i3 }0 R. X- S* u        .cout(cout),
    & Q; b5 b$ U+ m8 ^% T8 o1 V        .sum(sum),  \* n8 \7 w; U. o, r: y; r9 D
            .ina(ina),; \% C* K  {$ W3 Y% E
            .inb(inb),- M0 H; z3 a" D
            .cin(cin),
    & r) _- ~. D+ g7 q$ A. L. u        .clk(clk));     
    2 I! ?, ]6 M& v8 @# ]& J, H   
    2 }! r* H' H) i/ m+ V8 W# r( O3 @    always #(dely/2)clk=~clk;   
    " w) x; S  Q. I/ ~7 k    ) R4 l7 q: _* _) R
        initial
    2 J' ^; `6 i3 c5 d6 l        begin 7 O! r/ y1 B3 f- g7 O, K5 ]
                clk=0;
    ; Z9 E/ K/ e+ d! q& p8 X            cin=0;
      O/ ~' Y8 p; b( C$ {            ina=8'b0;; ?# s4 I- D3 B
                inb=8'b0;8 Y0 {8 s' \; z& d+ Y
                #(dely*1000)    $finish;
    1 m7 o5 k! s8 l" R) E3 b# j        end    . q) b6 H( Z* `7 K/ C- D# J
       
    , t- i+ G8 c, l    always #(10*dely) cin=$random;
    4 e4 b0 ~- ~1 o- ], s   
    + G/ r. b  `1 }. }* e    always #(10*dely) ina=$random; 8 {0 g5 P/ D, f2 @
       
    5 o- t, K9 h* e3 q4 f5 D    always #(10*dely) inb=$random;
    $ x4 R: d1 F# ~) {* c5 j    4 x" y. r0 i. H- e/ z3 e
        initial
    0 y) S& }+ Y- |! F- Z; k" n4 U        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);7 q/ \/ H+ o6 R8 T
    endmodule. P( E# y, E. c) m. @7 A
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    ( o4 Z% f0 v, b( Y% s* e) K& ^. o9 V# W( i8 C
    [ 本帖最后由 langhuamin 于 2007-11-23 08:31 编辑 ]
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
     楼主| 发表于 2007-11-23 08:58 | 只看该作者
    原帖由 langhuamin 于 2007-11-22 13:28 发表 ! z8 |. W# V% u+ F
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。# g% z+ O, I; y# ~* G% F
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB$ S* F) O9 L! Z! l

    : H5 H5 i3 B. n1 h9 t
    7 x" N0 M% \$ h3 I5 X+ I1 O其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    1 D' h0 p8 S! O: |3 B2 z
    7 T" Y+ K& d$ i导致最高进位出现问题。: _9 [# F6 }; |: w5 K1 p
    ! Q6 e2 u& U  v
    此属推断,待验证。。。8 }" W/ e# ~5 H2 u
    , q0 e3 K: @" J6 `- }
    可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    ! G" w6 B9 j4 l1 ?$ Y" i
    * A* C0 D+ t5 n+ Y8 E再{thirdco,thirds}={second[2:0],seconds};
    : |! T8 D; i3 M9 Y: ]9 l9 N$ K
      k8 w# a: H7 f1 Y不过我这边现在没装这个工具软件。。。
    2 Q' J7 ]8 g1 @. K% Y( @  b

    " j$ X/ X" @! q* p& W* _1 @+ l% x/ t! v8 a8 r; X4 O. A
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。# _3 h+ |  r3 c9 Q- Q9 d" p! v
    而且程序段可以作以下简化:4 ~/ ?* X7 Y8 E: u; ]9 N8 B$ t* Y4 M

    * T# ]7 J% c8 d% E1 |! g/ b- B9 C' ^" H# @1 o2 f
    reg [8:0]ins;
    1 J9 B% O9 v: c$ U2 x9 V* r' v  I
    # q# ?7 s! M" j$ |  [5 L" Jalways @(posedge clk)  , o& a9 _* t  o/ N7 d! L  t
      begin# h8 x, f+ @9 |, l. _9 U9 K/ U
           tempa<=ina;
      W/ t' k4 @# O, h4 s% z       tempb<=inb;
    ! U$ R3 U1 w* p( h) C       tempci<=cin;
    2 ^8 n9 S$ v" b7 {% H   end               - B8 U' T+ y' R4 w/ j
    always @(posedge clk)  / J: H$ a0 j! W6 I" R1 n
    begin * G# c, J* z& Z8 |0 u
           ins=tempa+tempb+tempc;      
    1 [3 v- P4 [6 t( s' `       {cout,sum}={ins};
    - F% @4 C6 Z$ b, Q; ~0 r end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 6 G$ M: o2 z; @' \$ `
    回去试了一下,确实如此。% `. C- ~7 T) L; F8 X
    而且程序段可以作以下简化:# [' C' S( W- Z; O5 e3 P

    . b' r, a7 c  g) ^6 M, h/ R! j# |; @* v' ~' m, O
    reg [8:0]ins;! d1 g. g4 s, @9 l

    & T7 v4 O- d8 a: ~" ]( Walways @(posedge clk)  
    " P! v: Q# b6 n  o" d( E  begin
    . j1 T/ Z$ U* O# v: A- ?5 v       tempa

    8 t. @$ ~/ L7 [- ^% g虽然没错6 E) @7 A, S* R; q6 b
    这样的代码综合出来比流水线效率低
    5 v( T& h( m7 o3 E, p综合出来用的器件也多哈4 J' r+ t3 K& ~9 j
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 " |# P: I2 H$ k+ x
    据猜测,程序可能有问题。
    , M! l: }/ g. `4 Z+ @7 @{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB5 O9 x( [* z$ H. C3 z
    6 F: @# I' B# E4 P% R

    5 k5 ?* |7 E5 O: L# @) K4 h其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    " u0 C5 P: u2 \1 ?% _$ Z
      T+ S+ ~0 U. p. \导致最高进位出现问题 ...

    7 ^) U! R* Y! O8 Z这个问题我也注意到了! X/ H, R  r8 p! `! P
    但问题在于为何第一也是这样的效果为何就有进位变化" |* n' |4 ]% H* K1 [
    而只有后面的两个有错误?
    5 v( D; {+ U, X! E- w' [' F& v  F1 d4 E9 P5 w" n8 d1 C$ X; z" H
    不知道是否与verilog语言本事有关系?/ q" Q9 Z6 |, p: L! ^4 a$ ~

    + b- B+ Z* _" W3 a8 z我自己试了试2 _+ [3 X0 T1 i4 d
    如何在加之前先把2位的值赋值给一个3位的值
    ; v6 v3 X1 [2 @; Z2 w9 C: m& {这样就能保证赋值间的位数一样
    : F$ q1 N4 T2 C5 y* r这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
    / C7 l' }8 X3 Q, v0 a% k" O3 O5 h( x, C
    这个问题我也注意到了, \& v) D: [+ j' g% q4 j( Q5 P  Y
    但问题在于为何第一也是这样的效果为何就有进位变化* V" W, L! L8 x% ^( P0 p7 `/ e1 v, `
    而只有后面的两个有错误?9 Z. p( |% C3 X0 E7 r) |+ l' c& Q: u4 f

    ( @, s" R( _0 ]' ?不知道是否与verilog语言本事有关系?
    ( R( v; C2 t2 G( Y* `/ o. Z) m$ Y/ [* s8 v: P
    我自己试了试
    $ w9 _( I& s8 [) k/ S$ G" x2 N如何在加之前先把2位的值赋值给一个3位的值
    9 `8 ^# S9 ^' F4 M! h( e这样 ...

    4 e! S* Z; E9 j- S! S' v# V% _& A! u
    1 J( ?' E2 ~7 B
    ! g# @, x( R. {
    也可以说是verilog本身的原因吧,
    - y; I% J; X  I9 l因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}' z1 _7 i+ @! o6 p
    并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
    % z! g' W1 ^% w" z* B这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    ( P/ ^" Z; X" e/ ~5 [9 c0 S本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    # [  z: g' g+ d* J: W一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表 6 O5 U; E) G; Y
    : m# s/ z; |9 @
    虽然没错
    - \6 e" g% c! {$ Y这样的代码综合出来比流水线效率低
    4 H+ h: Z$ k$ ~% `- b! I1 w综合出来用的器件也多哈4 w, K0 K# F+ ?- |/ t
    呵呵
    5 m; ?1 a& n6 ]1 J; E7 `3 M
    1 k4 V. f- T/ ]

    + Z: o% c  O: I( b5 G" C0 M呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    0 [/ O/ K! U5 Q5 w8 x: s. ^
    ( o! F+ ^0 m/ D3 J- [) v' q! Y+ f, E7 N7 N
    0 ]" T+ p5 J/ ~+ U1 X3 K. d2 U
    呵呵,这个我倒没考虑过
    7 f1 m$ j6 f1 K5 F

    1 ^+ v. F; n% n你可以参看一些教程里面的综合结果实例对比0 J/ p- Y) X: r2 o! }; ?

    " s4 X  y2 N# @1 B5 L# c4 C代码不同效率不一样 虽然结果相同

    该用户从未签到

    11#
    发表于 2007-11-26 10:43 | 只看该作者
    嗯好的,有机会会多去看看的.呵呵
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-19 07:15 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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