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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器+ t# ~' x* W4 y/ D9 p4 a
    从书上抄的一个例子:1 Y1 Z+ A! E1 e0 h1 M1 |
    module pipeline(cout,sum,ina,inb,cin,clk);: @8 a8 t  W5 l9 p
        ; t7 G" s8 r3 {# p" K! _# Q) P
        output [7:0] sum;* G5 o( x% i6 u- J7 r9 t7 g5 R: n
        output cout;' [+ J" y' H7 L6 H2 g5 @3 @' V
        input [7:0] ina;" W  N$ d& h  ]
        input [7:0] inb;) k3 Q3 v' W6 \2 d% {5 F5 k
        input cin,clk;$ g  B3 e2 X. v/ e% _
        reg [7:0] tempa,tempb,sum;7 w+ I3 A0 z! n- x: p* _, X. C- R
        reg tempci,firstco,secondco,thirdco,cout;9 _4 E5 Q2 |9 S8 T
        reg [1:0] firsts,thirda,thirdb;9 k, Z; o/ m" F/ ^6 e/ g: L9 m" Z
        reg [3:0] seconda;$ L& ~/ m7 z. u- X) U3 q* M. R3 f& }# _
        reg [3:0] secondb;
    4 P) y# q: `. v    reg [3:0] seconds;
    ) Y( K( w! E& c; G9 `% ~* Z    reg [5:0] firsta,firstb,thirds;
    3 H6 g1 p7 t/ N! t) r% r) ~" B4 ]7 \8 B    & A) j9 U) K; Z/ n: ^0 \) }. m
        always @(posedge clk)  + Q+ {8 }& h" [& \
            begin
    : w6 ~  W/ I: j            tempa=ina;
    ' I& B- j# x) T3 u" p3 k$ g9 B            tempb=inb;
    / r" \" D; M9 ~/ F4 f            tempci=cin;
    ' a" ~$ G% ?2 r. n9 k; l        end               
    ( g* ~2 ?+ `0 P. U1 g5 ^      T  E* v- c& e# J6 C" j
        always @(posedge clk)  ) K% f( B$ U  y: Y& t+ \/ C3 h. {
            begin
    ' V& V7 T6 k* Q* n9 c            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    1 k4 D6 C/ c- g7 f5 p) `            firsta=tempa[7:2];
    6 ^% V& ^1 G; F  }, e+ I. S            firstb=tempb[7:2];
    : [# L! B; E3 S, k! [        end      ( j1 q- G( E% B! [2 ~
        ) t& O9 ~+ Z  A  ^6 G5 ]
        always @(posedge clk)  & k& R1 k) e( m
            begin
    9 D2 X3 P0 j. |* D7 O            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
    % F; a8 x8 U5 }! W7 e7 d8 v            seconda=firsta[5:2];6 R* d; H1 J: q' f" t! B( r: @
                secondb=firstb[5:2];
    . y7 B# K3 a$ k1 n8 a; X7 C$ U- r. o$ w        end
    - e/ `, f6 ?! |" Z3 U+ v$ n   
    ; Y, r" `7 Z1 F    always @(posedge clk)  
    8 t* c& z& w1 J0 a  p3 ?; ~        begin ' j* ?' _& g, D4 w1 _
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};# @2 ?! W9 o  p3 o$ o
                thirda=seconda[3:2];
    * }, {8 H2 ^% [! T            thirdb=secondb[3:2];) g  K/ R& B5 h) v0 q
            end
    % D5 J' f# Z% s8 ^/ s- _$ ^) z    % e1 u7 P. T# E  k7 ]
        always @(posedge clk)  / a3 Y7 k0 q4 I# X7 e; F7 P5 v
            begin 2 k# ~& h7 z: }& j% D
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
    & M' g7 g4 b  ^) t0 s! M+ L- ?' {+ E        end$ O: i# w+ b9 J0 i! ^7 \
       
    6 f9 R) S. ?, F; v7 q/ cendmodule1 o# f2 M) _1 z& k1 y: b! w& j
    自己写了一个激励文件:2 e. b* R5 E4 d# G. V+ q) @
    `timescale 10ns / 1ns
    9 b, Y3 h2 V) y1 e8 lmodule pipeline_tb;9 o3 Z8 K+ |/ p+ F6 w2 ^. u
          j% J" h1 |! ]* L2 v5 A4 D$ f
       
    , U$ I9 d% g% K0 |+ s: [    //Internal signals declarations:( q+ t3 H% \7 w+ C  Z+ n
        wire cout;& p) ~- C& n  S
        wire [7:0]sum;
    + K- n6 V0 b: [4 _+ |    reg [7:0]ina;
    * D* q& g2 m- b1 s4 X# r    reg [7:0]inb;6 y4 b% ]5 ^' W' O4 |$ w/ D5 v
        reg cin;
    # X9 b7 x5 H! v, \% N1 O    reg clk;
      J7 @9 i; d9 d6 W- T% u2 N    parameter dely=10;
    * v) f& k+ L: L! y3 Q/ D& v   
    * q) M/ w2 K5 {! l0 _    : c7 {# l5 N+ V2 [
        // Unit Under Test port map; L  ?2 d4 O) b- n& z# L
        pipeline UUT (
    ) J- }7 a3 k$ B  S( F7 }( Q6 I& a        .cout(cout),
    8 D5 Y5 @6 d: N* q7 f1 O: f, C        .sum(sum),0 o2 l$ g6 B' ?5 d3 H
            .ina(ina),
    1 z4 ?0 [& r2 ?; e  k" l7 E+ {8 X        .inb(inb),
    : P. i1 G, S. t6 j, n" Z        .cin(cin),
    3 {1 C/ ]% }% b9 m9 A9 O+ g        .clk(clk));     ! w7 P! }7 {1 W& T, O4 P& @
       
    : U# K2 r$ R" f. Z    always #(dely/2)clk=~clk;   
    2 Z" L  T7 Y% D' ?3 U; T% F! V% I    1 [# X' `5 b7 c. m) K
        initial
    2 ?' O5 N! Y! ]0 C  p        begin
    9 Z" ]* D7 _1 q6 c9 s            clk=0;: y0 R( ^0 r. \1 {: u% k
                cin=0;
    . z$ D- O+ ~: h2 _            ina=8'b0;, |5 ~. L' B9 U6 U
                inb=8'b0;4 R% Z8 P6 d4 v; [8 U
                #(dely*1000)    $finish;2 {0 E1 ]/ D. B" n; d
            end    4 X2 }# w* N, [3 X
       
      ^: b. T0 H- @4 u6 o  w    always #(10*dely) cin=$random;5 @# [8 ]% h/ r
       
    . m% x: U! _$ \) h4 r$ ]* J5 E    always #(10*dely) ina=$random; * h9 S/ V1 D% ?3 w$ I
       
    1 e* N0 a" {& w! L! Z$ `7 \    always #(10*dely) inb=$random;
    6 Y7 h% W: T3 B9 s" i4 B" Z   
    ; `4 q. {4 e6 S8 v8 s7 t  p    initial
    ; O' f" j0 L3 U* H. z        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);( [+ [  ?$ @3 Z3 L  L5 I
    endmodule& U1 n2 e, ~9 ~$ h& _
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。3 Q8 R9 F2 `/ y& d4 Y& A
    ; ~  N, e! H) i8 ^. U* q2 B
    [ 本帖最后由 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 发表
    6 F0 F3 }; O% R' b就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。# x% _$ a* b+ x. E/ y, {
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
    : k. G8 [, q- Z9 ]+ B( e
    2 T; u, i4 H# c9 g7 X- E8 H4 W% H1 f3 C0 h: h& \4 x) w# B  Q
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,7 e4 `6 A, s3 W( ]

    6 e) R3 y6 K6 l  Q) ~0 D4 J. \导致最高进位出现问题。) o$ d) Y5 j4 X5 s" H& k4 ]  V; f

    2 W0 P3 W6 `+ j. |2 e. L此属推断,待验证。。。
    ; Q/ j4 J7 p, Q9 c) r; L
    , [* K, Q3 o" A可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
      {) N, |- g1 k! @0 m. O' p2 [; I! _7 w4 @9 d2 @9 h
    再{thirdco,thirds}={second[2:0],seconds};
    ! j7 E7 N* p& K7 v2 Y + R3 q: w% @& U2 E
    不过我这边现在没装这个工具软件。。。, a# g" L- |) b5 s# d- y

    + r6 l( T% ]1 ]% J& |: x; z) ^$ X+ X' q* l$ z
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    , ]" M( C/ f% O$ p/ Y而且程序段可以作以下简化:
    : k& H2 P6 X4 b& i7 i" N
    5 g5 Y: P6 c# _5 B' C- x3 r2 H* A7 T" V7 d3 Z: g
    reg [8:0]ins;# J: j3 N+ ~* b, x! O  m$ \0 p
    1 y" U4 r$ {. J2 B5 W
    always @(posedge clk)  6 V# X2 r! Z2 n
      begin
    8 p" q; C4 o* r) X3 Z7 X( p       tempa<=ina;1 s$ M3 h( z7 A
           tempb<=inb;2 ?0 e/ j. C( b9 w6 x! |- L
           tempci<=cin;
    1 U% E0 X) Q; P% U4 {# \+ x! u   end               
    % X+ X3 x  {7 o: _5 b, N7 V7 l always @(posedge clk)  + T# B: ]' _: ]0 s( W* t/ d
    begin 4 H; ?% t2 t) q
           ins=tempa+tempb+tempc;      $ {5 _7 X( Y) j
           {cout,sum}={ins};. o3 G4 e) Y5 u4 v8 S
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 2 f/ }. C3 Q; n$ `  s6 c4 E
    回去试了一下,确实如此。
    % f( R3 u7 H+ F而且程序段可以作以下简化:
    & B) J% \) w, l, L* w9 T
    : z: ?0 ~) c3 F% S7 _+ X& S7 R' _; P" `7 y) l- c% o
    reg [8:0]ins;( B& l" D+ [+ d0 O. q
    # h3 v) r: h# ]* h  b" `: z
    always @(posedge clk)  
    0 M2 q. e/ w/ Q, |0 g" d. S8 A  begin+ X/ j$ K* Q0 c% Y3 q5 t2 f( z
           tempa

    : {7 ~4 K# W% h虽然没错
    $ K+ l1 J9 S6 l5 D' E这样的代码综合出来比流水线效率低2 Q$ T. ^0 N# ]( i+ Q
    综合出来用的器件也多哈
    8 U' B1 Q* N. R0 L/ k+ K呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 , M- P8 W2 A: s; S
    据猜测,程序可能有问题。7 S0 [) Z% P+ i' }. s! I# `
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
    ' k( ?; T' g5 V, {) d. P( K: P+ t  F
    3 _0 ]0 W  y2 J5 z8 H8 |
    6 E# \) o/ k5 {& i4 ?4 w$ o其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,2 G" ?* F- R9 M/ O' L8 ~

    ( J3 x. ~' T0 w+ r& j% D导致最高进位出现问题 ...

    , i# v" C( C; [$ _/ O这个问题我也注意到了" [8 U7 P; ?) j. `
    但问题在于为何第一也是这样的效果为何就有进位变化0 G( ]' {2 X) [' m+ B! V) W
    而只有后面的两个有错误?1 u. [; j5 K3 i$ F" P( r) m

    " x* J; z& G3 Q9 N0 z$ {% q不知道是否与verilog语言本事有关系?3 z0 ]. X2 i! _" h

    1 y2 p' g$ n* n, X* o2 B4 x我自己试了试
      m1 Q8 ?) `; ^4 m& `如何在加之前先把2位的值赋值给一个3位的值! u5 s- J+ O% u. |9 R; I. r
    这样就能保证赋值间的位数一样0 n; Q+ c* X8 @
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表 2 R, w# Q# Q* }  C
    1 c% k& L& ?2 V( K0 I1 s  o
    这个问题我也注意到了. z: T$ N  k# u2 A3 F; z
    但问题在于为何第一也是这样的效果为何就有进位变化4 \* V8 x2 x% P+ A5 a
    而只有后面的两个有错误?
    ) Z7 k' t3 I$ X6 H( D: E$ M4 Y5 \
    7 N5 G/ M" `* A; _+ P# n不知道是否与verilog语言本事有关系?
    + D! o/ L# h. }9 j/ B, |/ D
    $ z# r0 J" l  R$ f1 G+ q+ n我自己试了试
    7 T! a; R2 g. w% O5 n4 n如何在加之前先把2位的值赋值给一个3位的值' {% n, ]. P7 ?' t/ i, d5 Z0 \
    这样 ...
    ! f$ {  Z9 W* C' z; s: k! }
      \5 W- b$ I3 C. ~

    . N9 v# ^. r0 g! n+ {3 \
    % ]6 H9 P6 O, F也可以说是verilog本身的原因吧,$ d# u% @  `! L% J/ r
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}& |& m1 `  b% n6 v% }
    并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
    4 j$ H* h! C# N: r( Q4 S这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。# [) Z1 `+ C: C$ S. L7 G# b
    本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    : }3 y8 i1 E) h9 z3 [; B  ]# X' E一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    2 p+ `  Y  @( K. N# O
    ; [. z8 L+ g8 {: \虽然没错. ]9 c- T9 W1 _9 J0 }
    这样的代码综合出来比流水线效率低
    $ y, i: ~: H9 u( _综合出来用的器件也多哈* n5 S1 U/ }: ?+ U; Z* r: u2 H
    呵呵

    ( q/ t5 M- h( C# [
    7 \+ `* s3 D* R# Z6 j+ |
    - n) h  ?* j. j呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    5 @$ N3 n; ~8 l3 A3 ?  u- ~
    0 T0 q5 Y4 t, K6 R1 i' h0 S# m2 F9 \+ x6 r+ d9 C

    8 S" A" G% x' [( Z呵呵,这个我倒没考虑过

    8 J, D- k8 b- c; t$ K4 e) L6 V$ E6 Y" s( h; @! j+ m
    你可以参看一些教程里面的综合结果实例对比" U: O& l+ \. u; E) E: m. N8 r
    ; _9 N+ i' W) l4 D8 Z+ w
    代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-18 23:53 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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