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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器
    . v& X6 @. W6 T' ^$ y# N从书上抄的一个例子:
    9 s9 {5 k3 T1 Y0 O- Nmodule pipeline(cout,sum,ina,inb,cin,clk);& y& n3 O( u; A. r
        : G+ C' K1 d7 G* T
        output [7:0] sum;
    8 V. Q2 o/ }' x8 e6 q" W, c    output cout;
    , P7 i3 t/ C) A0 X) W2 p    input [7:0] ina;- x: H- g) W3 O. C8 l
        input [7:0] inb;
    $ H! h& D* \+ R    input cin,clk;
    ( p5 |8 g. K! J2 k  z- T  q9 G    reg [7:0] tempa,tempb,sum;
    ! w/ q. m, e* J8 c    reg tempci,firstco,secondco,thirdco,cout;* [7 p( J2 i" ^  ?! J  v
        reg [1:0] firsts,thirda,thirdb;
    : y# ]9 H1 n6 _3 Y    reg [3:0] seconda;
    9 {# A! u& n7 g2 ^    reg [3:0] secondb;
    * {& ^1 f+ t3 t# L$ |    reg [3:0] seconds;, U" N. [4 o+ _$ h' K$ s: \
        reg [5:0] firsta,firstb,thirds;
    4 E4 r. i& W1 d) q+ C# }6 z    1 o- I; t& {' H: Y! _" @2 V, Y
        always @(posedge clk)  
      w( u, V; p* H) l        begin% V) c, f) y) L0 |6 K% x2 m
                tempa=ina;" u% Q% ]3 w* E6 S* Z
                tempb=inb;! p. D4 b5 x, ?
                tempci=cin;( B3 h  j, I9 ~0 U: I
            end               
    4 n6 }2 p( K- P& I    & D1 J9 C! w& y! i9 U  Q
        always @(posedge clk)  1 \, s( l& v0 R# ?
            begin
    / ]* W3 _# @3 N; y2 v" g            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;6 M: ^5 O( ^- d$ W" Y) h
                firsta=tempa[7:2];
    + {* s" U3 L% \( Y, I% N            firstb=tempb[7:2];
    0 z9 V) Z7 Q9 F$ X        end      : y5 U3 ~4 |0 u7 m; q
        ) F; W; d7 H' B
        always @(posedge clk)  5 U) |# X, J( A: m
            begin
    , Y* K* w6 S& M) M4 B4 J            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
    5 W1 _& b+ z; o. V9 j7 O0 i, w) P+ w            seconda=firsta[5:2];
    ' @' L( h3 u. \" h. q8 E            secondb=firstb[5:2];
    $ Z" C+ q; ]; C% N$ [7 z5 l        end9 x; m/ O' b7 g! y  c, W6 C
       
    5 `- k& I) D: L- l3 J    always @(posedge clk)  8 D  Y$ T! T8 E2 ]3 ~6 G
            begin
      c& M0 y9 [$ s0 |" j            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};$ M+ |4 v. x$ T6 H( j
                thirda=seconda[3:2];
    ( I$ V5 X4 M& n; Y6 \. @4 J            thirdb=secondb[3:2];8 G7 [' L; O9 _/ _; i
            end) z, b9 l8 Q) G, }7 l, i5 X
       
    2 n% O3 J+ B% F) V* a    always @(posedge clk)  9 ?' I" d# ^/ X
            begin . n3 B$ e( I: ~" o9 j' ?: e# F
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
    ( [) o1 }$ }! c3 t( y- F        end) t$ X) }+ Z; K
       
    ; v* c5 Q# \/ T0 F" ]; _1 Oendmodule
    ' j# d% d! _/ \. W) W9 o自己写了一个激励文件:0 w% d0 V$ F" U$ T0 F2 G4 M
    `timescale 10ns / 1ns
    3 `- @. x( J  Omodule pipeline_tb;  Q. n. y- R4 W5 }, h! p
        5 c( r8 d6 `- d/ y5 @
        , o) y: t, j, W1 L  W
        //Internal signals declarations:
      Y6 J; n; X5 |& \; z    wire cout;
    4 c/ _1 q/ Y3 R' F- m8 d2 r    wire [7:0]sum;
    - d3 _, A( |# V0 D  r+ @    reg [7:0]ina;! b" F, P8 r1 B* f2 K. B
        reg [7:0]inb;
      h4 t  J; E# u    reg cin;
    % x* ]) A2 ?% J% R& E    reg clk;! A7 Q$ L$ [6 C* @1 q# @" C' L5 e0 I
        parameter dely=10;
    ; |. |/ G1 p& Y$ Q& m+ s5 b' n% y    0 t( ^# W* l8 }5 b: n# S+ I
       
    # f+ t2 n) o( d    // Unit Under Test port map. @5 ?9 Z% [' Q8 |/ T6 n# p
        pipeline UUT (6 j5 v3 y! c- x. w
            .cout(cout),
    , U3 ~% ~/ Q( U" W0 M        .sum(sum),# W) f! F! {. m
            .ina(ina),9 [7 `$ T  H! q$ W2 m2 s/ @
            .inb(inb),$ \) X+ w  Y3 ^# x. A
            .cin(cin),- i; x0 V( F4 i/ L1 s) H7 I
            .clk(clk));     
    * Y6 i' L# Q2 S% `# _/ V. F   
    ! v: f  z5 I4 }  e5 q    always #(dely/2)clk=~clk;   
    3 J. w& i  O. C" s0 l9 e    ' P% u- U) R  D$ a1 Q
        initial + T+ E' ^  K5 J9 G' D4 H, g7 w* u
            begin ) l$ y- ^/ k2 Q9 D! Q% d
                clk=0;
    2 |8 G# X& v' T. l. t2 z            cin=0;
    : ^; G8 _8 Q. \- L5 O# g% O: b9 z            ina=8'b0;
      z. Q; t5 M; B            inb=8'b0;0 G% }3 T0 l6 \) M
                #(dely*1000)    $finish;$ M. W- ~1 r$ u5 z
            end    ' o- R0 b' T! w& q
       
    * U" {3 Q% U( y+ n    always #(10*dely) cin=$random;. Y* w8 R3 ?: R( c: ?: Z
        & V3 }# K/ F! L/ @: d, N: Q- G  v
        always #(10*dely) ina=$random; ' P1 j7 Z- a$ w" ^
       
    3 {; s3 h  x+ S, w    always #(10*dely) inb=$random; . i4 Q  p4 {8 T) N# P, ~+ |9 E
        & u9 m: @. v  `5 d+ R  B# q
        initial
    3 a3 E  x+ A; H8 q        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
    4 A0 K# o1 E' @% Xendmodule5 E; I/ l# B0 x; h4 K- e: |2 w
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。& h  V$ a9 C* e) I# }  l7 i1 L
    : }- }2 u5 i$ ?
    [ 本帖最后由 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 发表
    ) ]( Q* |+ y( v就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。% y( h4 y, |3 ]* }6 a5 |
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB5 i4 l7 p2 Y& w; R

    5 q; h: ?2 c3 ^& j+ V# ]8 e0 Q' W' t  r8 Q6 P" _" ^! g
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    $ C" B; p1 E. R4 D3 o2 ~) R
    3 E4 ]$ Y  s( e5 ?5 Q$ F! r导致最高进位出现问题。
    - u; m/ r1 }, [. X
    * Z2 j7 _% J3 k" z$ z3 `+ [此属推断,待验证。。。' k* l$ K  q3 U* P' z& b

    7 G9 a7 i9 H) x- G4 z可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;" B! x9 W2 X4 t/ ~1 [; v9 x+ w
    / g" f; s8 r, ~* d& K# T
    再{thirdco,thirds}={second[2:0],seconds};
    6 z; `3 @, z0 P& |3 A% m/ n2 G & I. s+ T8 }$ Y: t6 w0 O- L* B
    不过我这边现在没装这个工具软件。。。$ P4 i+ t( X' G1 O* p9 T
    ( M- }& n" s# C1 X+ Z
    2 v2 O8 ^0 m0 u  k/ t5 D
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。! G) i) v& f% Y' p% U) g& k0 S
    而且程序段可以作以下简化:/ R9 g6 q, _4 V! I5 q8 V/ N1 ?$ P
    % ?( D& ?2 I" c; e" b0 F

    8 z' D+ S$ x7 Xreg [8:0]ins;1 C8 r5 o7 v% g7 U
    4 Z6 E8 w+ z/ C6 i; S7 [' p
    always @(posedge clk)  ) ^6 k$ r) }. I; [  j
      begin* j+ x8 H4 U" e" g# ?
           tempa<=ina;; J3 c( c! Y- s* I
           tempb<=inb;
    + X) T0 s; v% K$ ]/ I% J2 j       tempci<=cin;
    ) q; r) x: ?3 s/ C, t# x; a1 ?) q+ d   end               1 k' e. u( d; T# w7 T
    always @(posedge clk)  
    # q9 a: R6 |9 |* \( A  R begin ) j* C4 t! i9 C/ |
           ins=tempa+tempb+tempc;      
    ' q  {+ x* Y% Q  J       {cout,sum}={ins};  v/ u5 v) W# c( }
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表
    " T( p2 N) }8 [1 g) u# M6 d  u回去试了一下,确实如此。
    5 ~( M; l% I+ C" T# V, B* d  M4 Z而且程序段可以作以下简化:2 A: k7 i  O/ ~2 y2 e$ ?1 k" X" U
    # [+ Y/ `. k" m1 D8 Q

    ; ~& u( D/ g& s: ], w9 @reg [8:0]ins;
    % B" t  `% c. v6 Z1 \8 T3 |! ~1 o
    : S% g3 ]8 ]8 o  k" lalways @(posedge clk)  , C! q! e# u! h5 f" _: m8 @
      begin" o+ `# e0 I- U$ C6 ]+ h
           tempa

    $ Z! ^/ k$ X; `+ r. F* F虽然没错
    ( o7 o7 B/ ]" w9 m3 u这样的代码综合出来比流水线效率低$ c/ ^6 h' u% C  Y6 N; \
    综合出来用的器件也多哈0 @2 ]/ Y, S* d5 D% ?- ~  ]
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 7 j) e8 O4 o& s+ D0 P7 a
    据猜测,程序可能有问题。1 {( {1 M6 G6 F0 T
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
    - x' b+ A) W+ s2 K0 W1 P5 I. d6 D& C0 S* t' s$ K
    , c  s  E* v+ ~! x/ z9 p% p9 k
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    3 w6 e% c5 P3 g6 F. T  a3 m9 C4 m' m% u& g
    导致最高进位出现问题 ...

    + b! d* ^; f. w. `% _这个问题我也注意到了
    . i) y' r  ]' ^* A7 @2 A6 q3 r但问题在于为何第一也是这样的效果为何就有进位变化
    1 b+ B: x: Y4 }. f, }而只有后面的两个有错误?
    4 X7 k/ e' s5 q" }2 h$ Z3 h9 z0 ?, B$ H! C# I3 \1 e
    不知道是否与verilog语言本事有关系?! k3 w0 z5 H6 R7 o; Q3 F6 l% ~

    ) ]" y2 T! ?( p: [2 e, i4 U我自己试了试$ G# e' r0 J+ x( V  m
    如何在加之前先把2位的值赋值给一个3位的值
    : d) T. h& E" S. q* f& |6 `这样就能保证赋值间的位数一样
    9 ?  ^# Q2 V' o$ ^; H! H这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
    - n  t( a3 a+ `# A; I2 a
    7 F: F- o  g/ t+ [' {) w7 V这个问题我也注意到了0 j( }% |3 V  t) H: n7 _3 |9 w: _
    但问题在于为何第一也是这样的效果为何就有进位变化
    7 n8 q( Y0 H/ u/ C+ t# M而只有后面的两个有错误?+ y- a* L" @3 `% H# `1 L
    1 M" K, [- u; @* `* B7 Q
    不知道是否与verilog语言本事有关系?. B/ c1 `* m6 @" {# m
    ( }4 }9 J( ^  S5 @$ q% ^8 Q
    我自己试了试. @" r7 I1 }- X; B7 ?; u
    如何在加之前先把2位的值赋值给一个3位的值- @* y8 O0 E$ H% S
    这样 ...

    9 I; l4 r" K$ S* G0 E. E3 m7 x% \/ ?

    * e1 Y, l0 a; K, O
    6 u4 ?. J6 }* V. Q4 d3 o也可以说是verilog本身的原因吧,, i& c- m5 {* E- j; k* E) l
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    , A5 o+ p" U1 V- q3 H- u9 Y+ g9 i并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,% [* x+ @& _2 r' A' H( G) ~
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。  ?$ Y" l. B# k# [4 H
    本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    + M% a0 H. J4 n* N7 U" G一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表 3 S0 ^. ?6 j5 L  W: D; D

    / z  k/ `9 o6 b# J虽然没错% s& B! P$ }( P" u
    这样的代码综合出来比流水线效率低
    ; k( h8 N' t4 O! p4 R' K. B( _4 j综合出来用的器件也多哈
    6 f+ ]: }4 ]& h* W: s; h呵呵

    : D( W5 m: y1 k1 o. s; Y& l1 U: i( ^1 M6 B, Z9 m, c6 x+ K
    1 M: B5 g& r4 q9 S) x! S+ i
    呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表 9 W* V% M6 s( j! e
    " e- B$ j/ P7 O6 z! d7 a; h, @

    1 A& Y' O5 |& z3 p! @! a3 t3 b) n5 J1 I; O1 i4 n# f
    呵呵,这个我倒没考虑过
    ' C' n, D! f1 W. F

    7 i8 L8 @9 H1 F$ X你可以参看一些教程里面的综合结果实例对比
    * S% B0 \5 S* |' T
    + |8 T) S1 ~, H' F+ I8 Z代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-3 12:09 , Processed in 0.093750 second(s), 27 queries , Gzip On.

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

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

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