找回密码
 注册
查看: 3556|回复: 10
打印 上一主题 下一主题

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器
    , n# P2 O* `! \从书上抄的一个例子:
    - ^$ g( M5 k* |+ x% l) Fmodule pipeline(cout,sum,ina,inb,cin,clk);0 v. |8 j) \# n: V2 `1 M5 j/ T
       
    8 n. b' n' K; e0 ^4 G' P% C9 K; T    output [7:0] sum;4 g- w" b8 k/ P
        output cout;
    3 X8 ~5 A6 v6 f( V# R    input [7:0] ina;
    ) t( j) }! ~/ }! W6 }( [    input [7:0] inb;
    . X$ t+ ^2 V8 v. M6 t# O/ F    input cin,clk;' S8 s# m2 m; ?; A- U% {8 d
        reg [7:0] tempa,tempb,sum;" T3 W- b& ^4 `% g$ [
        reg tempci,firstco,secondco,thirdco,cout;
      I  R8 X% ^* z! o, c- g  x    reg [1:0] firsts,thirda,thirdb;6 k4 j! T) B2 q8 A
        reg [3:0] seconda;
    ' E1 [$ T* a# Z5 Q9 V    reg [3:0] secondb;  J$ C5 k0 ]* q7 o3 t/ E
        reg [3:0] seconds;
    8 i' W0 V- x$ u5 D+ d) G    reg [5:0] firsta,firstb,thirds;
    + }( S0 H: a! ?9 H7 N+ R. x    9 i0 K  U9 z/ e4 }. `: |% |3 }
        always @(posedge clk)  
    % U# C4 O1 D6 [) r' F0 S0 N        begin  _! a$ k% g. j' R( ^& ]
                tempa=ina;
    ; }0 E" C9 D$ z2 J5 K/ E            tempb=inb;8 D% d7 d# m8 a( ~1 D
                tempci=cin;
    , ]# ~3 ~( |, g) p/ w        end               8 \$ m5 |* P0 ]. @8 b: f1 M
        ; f: f4 t( z& F- p# A- E3 v
        always @(posedge clk)  : q0 R- k( s  c
            begin
    : J3 ?8 `, w* s8 l6 S& s            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;" Z4 Y3 }. J  e
                firsta=tempa[7:2];
    + S9 l$ h4 v" P9 \8 [* B' ]            firstb=tempb[7:2];" V1 X6 a2 A* P" i: b- t" ?
            end      8 c* R# R9 t& Z- M. Y+ s: r
       
    0 o% L1 ~3 R( k    always @(posedge clk)  
    - P' D/ v% x* {6 L        begin
    6 \/ t( B; n4 j8 s# ]: Q9 @            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
    - g% P1 |4 t, V0 ?# j5 W/ e- u2 |, _            seconda=firsta[5:2];
    . f$ s8 c; w7 |9 K6 j  b            secondb=firstb[5:2];# ]) y0 o9 ^( }0 e, ]& K: Z
            end
    - h4 }, A' ?4 O5 j; g8 z" B    , |2 o& W& N) r, _( |6 r2 \
        always @(posedge clk)  
    ) L$ x, u; z6 V& H6 A1 m) O+ {        begin " }+ h7 @8 a) \* w7 k
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
    " T& f. u( ^. }4 j9 g2 a            thirda=seconda[3:2];
    - S8 d% X/ B2 f+ H' K0 s; a            thirdb=secondb[3:2];
    6 {; |/ y4 z+ E4 ?' A        end9 y) p0 v/ \+ d) L/ H# N8 f
        - e4 F9 g5 M  O9 u$ d
        always @(posedge clk)  
    5 ?' V* S$ L" }4 W1 S' b2 N        begin
    7 Z: ^: }4 N7 O3 L+ F4 _            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};* Q  A- Q4 _. m! b" U
            end
    9 s: O" ~$ g0 t% Q! E# }3 R, _1 n   
    ( b( r' D! p. X- {) Jendmodule
    ) s9 I/ D8 L/ r1 C! v8 S自己写了一个激励文件:
    & P# E7 O- F- Z1 z0 ]; u`timescale 10ns / 1ns( V2 ]8 ?, b1 `2 [' f$ [: u) t
    module pipeline_tb;
    2 s. |- J( O: t/ o/ \& @    ! ~1 {" D2 ~- R1 Q6 [& r
       
    4 A7 b% {2 [! f! I9 d5 j& X3 _2 ?    //Internal signals declarations:8 y# A. Q6 {4 _# }. R2 P# U7 ~0 \
        wire cout;1 f4 _, b# s! Z5 `# Z' d2 }
        wire [7:0]sum;
    , Z4 K1 d- G. Z7 u- i3 u: r# l    reg [7:0]ina;
    + p8 ~2 |0 L+ e2 J" E+ t    reg [7:0]inb;
    ) p4 n! |6 ]( m, n7 c    reg cin;* p* f5 L3 ~  n% j3 |. t  p. i
        reg clk;
    0 R9 H: R! B4 s    parameter dely=10;+ I* D5 d& W$ e/ Y8 t
       
    8 F" |* H6 |% O" b: c% ?   
    2 I2 C3 o" K9 g+ R  I- \! b    // Unit Under Test port map% L+ p/ x, v, X: I
        pipeline UUT (3 [* t( |# e% v  f; T
            .cout(cout),
      m& N7 A/ M) O* H& _5 Z& n  T        .sum(sum),
    3 q1 V7 q# L% k/ y+ c7 @% t        .ina(ina),8 g) _* |/ d7 d5 e- v* Q4 R
            .inb(inb),
    & A5 h3 g6 q+ f  A+ L, N2 |        .cin(cin),+ E0 |. Z, z0 h! W- M
            .clk(clk));     9 ^( w+ l9 U$ i
        1 r: z( _, n+ E  m
        always #(dely/2)clk=~clk;   
    " i. _3 k1 S! u( K1 [7 G9 n    5 j9 Y" u& P' l2 B1 o
        initial
    9 `5 T, `# ^: \! b8 P# ^4 K        begin 6 m8 n# g8 h: U# Z# U1 {( J3 A4 u
                clk=0;
    2 @- Z# G4 S) X' q( [            cin=0;/ d3 b' \' i1 ?, d) c. O5 ~0 T
                ina=8'b0;8 `. r6 l% I8 ?* Z
                inb=8'b0;
    + s5 j) C- H6 p) ^6 ~' J            #(dely*1000)    $finish;5 m0 n' ~" P9 S  f8 y' ~9 r
            end   
    # w0 v) d  V& V% ]9 |5 A3 e; B    ! J$ d3 G! ]. G5 s& e; L
        always #(10*dely) cin=$random;
    6 x- v2 a- g! |( @    . ]3 q! ?" r# P! f3 B) d- O
        always #(10*dely) ina=$random;   f6 ~- e" d. ^
       
    2 {0 i7 A2 _7 ^    always #(10*dely) inb=$random; 5 d- {. I6 w: C2 v7 x  X
       
    / Q' y+ {$ ]- v& n/ o8 X    initial
    ! F$ `! r+ i/ z' U: ?  _0 W        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);2 D1 C; M0 K# Q1 m
    endmodule; W' E* Y5 b" N- h- x
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。, r1 m# d$ p# l4 x

      O# T; _) |9 z# P' P( `[ 本帖最后由 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 发表 + N" Y5 X9 J' B& v
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。8 r6 r! n" b1 A* f$ m
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
    : ?( I( @5 ?9 W' u7 a: u2 j* B
    ; t  y8 |7 r4 s' T- f" |7 f  e4 l
    ; S' `1 ^8 O- L$ |其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,' W& r) m: O$ f* u( c6 u% V
    9 x3 J: O3 u# i9 N% c/ `6 V
    导致最高进位出现问题。9 ?1 u+ O* W/ N) ~
    & h7 n7 |- A% `
    此属推断,待验证。。。* |4 ~' v, R8 |7 W, I; d
    5 u& r4 T' ^3 i# _/ q1 ?1 ^
    可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    ) |2 x1 o) W. N' E- ]0 c4 ^1 _* j8 r* J9 K3 S# a4 H: a/ Y
    再{thirdco,thirds}={second[2:0],seconds};# A( H( F6 O; i( q) i) U

    $ F8 S4 F; T$ k0 I2 Q& R不过我这边现在没装这个工具软件。。。
    0 g. z8 d; V3 u3 _5 _5 i: }

    $ x% ^! ?4 u0 u5 L. R# d; c( S! ~5 ]+ R
    6 v; k$ v! V1 q9 p2 d[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    / D% i9 ^  G; i) |. [  G3 o6 Z而且程序段可以作以下简化:
    & K/ K4 B  f7 y  v
    6 P8 o4 j6 e; f5 s; ]- Q8 J+ M# x2 M$ A
    reg [8:0]ins;
    0 Q! \7 D2 @' f6 m1 m
    0 t2 L1 S) y" s- h2 X; A( I. Calways @(posedge clk)  6 X9 b4 Q( D6 I2 x% l- r
      begin0 Z  }2 e  t6 Q* _% {# O  C! {) @
           tempa<=ina;
    # S, b) a, {6 {  z       tempb<=inb;6 h6 n/ L. S* h. M
           tempci<=cin;
    / ^6 n+ Y/ G' f; g6 A   end               $ T" R! T2 g  I: N+ t7 a
    always @(posedge clk)  8 T( x) ^" h9 d2 W* k
    begin ) L* x3 i% `4 I, @
           ins=tempa+tempb+tempc;      
    / o+ F( I0 h' G2 J       {cout,sum}={ins};7 C' Z% S. b) M9 a4 S
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表
    " u5 ]* V1 L- w回去试了一下,确实如此。
    - _5 d( K  T, d! A而且程序段可以作以下简化:
    2 l3 r& B" T6 _, o3 F+ F9 D6 y
    ( C9 y, r9 F& J4 R4 E2 C/ i  x2 x, N' L
    reg [8:0]ins;
    * Q6 \& T) n( g; P9 U9 {3 H. p( L( C( J! L; j& K9 n0 T; H
    always @(posedge clk)  - }& p  u' H7 `- o% m: @* Z
      begin
    3 {8 L6 X, K" J; Z       tempa

    ; Y% U4 _5 B8 h. T% Y虽然没错
    3 d# `5 a& |. \, I! n8 c$ o这样的代码综合出来比流水线效率低
    . U! {2 T7 ^  V# U& A综合出来用的器件也多哈
    2 U" q$ S( H! w- F. V- C0 m呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 4 d( d+ A3 e8 K' Q1 K, e  P; J/ Q7 O
    据猜测,程序可能有问题。
    5 R: e1 F5 [+ L1 t9 H{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
    5 i* i; V2 x8 f: l( [& y- Q# V- \
    % r+ U3 H6 s: z5 x9 A- Y9 v/ N
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,) r  U& m9 P) d/ b- k+ r; @3 y+ J
    # Q) W( F! Q) K) M# a* f
    导致最高进位出现问题 ...
    " W5 G3 H; ^' S- x7 x; e7 w
    这个问题我也注意到了
    7 N1 ~- T" u0 s* ^. U但问题在于为何第一也是这样的效果为何就有进位变化" l) l8 P; k. }# c1 ~& I( L4 ~
    而只有后面的两个有错误?. j- \1 U' K3 g
    ' `- l) D3 R( J. _- J
    不知道是否与verilog语言本事有关系?7 v0 L) R/ F- u- s9 K5 t
    5 a+ v7 s8 |0 y* [6 Q7 e
    我自己试了试
    # j$ o  b/ |' {% i% u- `) K如何在加之前先把2位的值赋值给一个3位的值3 b9 @& P0 d6 }7 b, Q" M2 Z
    这样就能保证赋值间的位数一样
    # V, u( {, G+ Q这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表 + u7 c2 y* ^6 _6 O; j4 Q4 u; H
    $ G% m2 m' d5 Q$ @
    这个问题我也注意到了& \! F% n. [7 x+ B) D. N
    但问题在于为何第一也是这样的效果为何就有进位变化
    # A) F- j! u: ?% @而只有后面的两个有错误?  ?1 ]% P1 h3 T( ]% y' U9 l

    1 k8 h" |: D* o( }# c6 _" `7 u不知道是否与verilog语言本事有关系?
    0 }  k3 ~) Y1 _0 v7 p4 @$ y8 N, C
    我自己试了试/ c: q0 X* l$ ~' ?
    如何在加之前先把2位的值赋值给一个3位的值2 _8 D1 h0 I& V" X
    这样 ...
    8 R5 t4 m( Z  c& a+ t' Y

    : J0 O( m  W5 \* s3 C% B* Q2 s: z2 `1 H7 t$ @' h6 _# C

    . Q. s0 @  c) T9 s也可以说是verilog本身的原因吧,& H( B, H$ L5 a9 i
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    1 N3 g* d& ]5 l并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的," H5 ]+ z' p$ a0 n' V9 V
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    6 J+ V/ `9 {  z本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    ) C) Q- p2 j3 k2 }一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表 ) k4 s) T9 i/ A" C0 _- T# m$ `

    # n  |4 g* g2 q* R$ E+ E3 m0 u  p虽然没错; `7 v' O7 j9 J6 h' Z  a
    这样的代码综合出来比流水线效率低
    - `. q' P- C9 a4 |7 O; P/ z* d综合出来用的器件也多哈
    + I4 [3 {9 Y. j- l2 A1 ^呵呵

    ; G# C5 e6 S1 f  p# m" `% Y5 S9 V( t7 L- A9 U" {5 M
    # ?0 Z$ B" K( C" A
    呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表 ) d1 z5 A8 i4 ?5 O! Y' E

    & @6 }- ]  [( W' o& S4 @* y2 c8 z* @

      q/ K' y* K$ J' }呵呵,这个我倒没考虑过

    , w+ C: E/ L+ r; H* f
    5 Y. n" Q7 h* F% d9 w* h你可以参看一些教程里面的综合结果实例对比6 s8 k, i6 y8 b! h
    . o; g0 S( b; ]5 D
    代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-1 19:41 , Processed in 0.078125 second(s), 27 queries , Gzip On.

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

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

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