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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器
    + E; H& B: k# a从书上抄的一个例子:2 W7 V! j7 X$ V9 J% ^
    module pipeline(cout,sum,ina,inb,cin,clk);9 S5 G% D' _8 X8 E3 F) m  r5 Z, `
       
    $ z9 w( T- P: r" j( k) R6 p    output [7:0] sum;) _! @# z: N4 x8 F+ e% w) ?
        output cout;
    + v  q1 q- F& y    input [7:0] ina;; m! `7 N' g  W  `( e- R! X/ [
        input [7:0] inb;# b$ z" x% @* c
        input cin,clk;9 p/ {1 o" P, L0 l/ ?/ V
        reg [7:0] tempa,tempb,sum;
    ' a% h7 m3 h! `: O    reg tempci,firstco,secondco,thirdco,cout;
    : [& S5 p/ ?1 V) {% S    reg [1:0] firsts,thirda,thirdb;
    8 b. ^) U9 U$ ?4 h& ]    reg [3:0] seconda;' }0 v& q  J2 }
        reg [3:0] secondb;9 E4 g% {/ [  x
        reg [3:0] seconds;0 M9 ?8 p7 w3 Y9 U
        reg [5:0] firsta,firstb,thirds;3 A. t) `' W+ Y$ f; r' E
       
    ; u- X& k4 A3 e( G% [7 ?9 m    always @(posedge clk)  $ y$ w( ]: L# S% k
            begin
    & @! ]4 q9 u+ [9 b+ c, Z+ c            tempa=ina;; \7 Y& w! `5 J2 A$ q' p& H  W) N4 O
                tempb=inb;# f# ], A7 I/ d  L+ c  a
                tempci=cin;9 W8 X, P. H" P! }' K
            end               & n/ D* i- Y/ h. E/ y5 L6 g; P0 s
       
      {2 ]6 n1 k2 R3 z- K    always @(posedge clk)  6 [% M$ H3 D' k% P( ^9 g# ~
            begin 1 A+ \. b) Y/ i7 }; g6 e9 A
                {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    ) ?! U- J, `$ V& t) ?3 U+ U# J) _            firsta=tempa[7:2];9 x% m& ]- i( P/ T) B6 n+ P
                firstb=tempb[7:2];
    9 ?6 |+ M% Q4 }2 j  z9 P        end      ' [/ h1 M8 _7 i/ g6 N0 L3 ?
       
    * o+ j2 b/ }! O) @    always @(posedge clk)  . \/ T6 R: q' o7 R7 Q5 ~* s$ O; }
            begin
    5 n4 M0 S, V0 W" `) D; u! b            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};  X! g: F7 ]: T
                seconda=firsta[5:2];: }9 |: J" G6 e# S& c% g
                secondb=firstb[5:2];, k4 D0 X6 o2 i5 v% B4 y
            end, C* r( l, A& B- \
        ; m* H! Y. P3 p) j7 @
        always @(posedge clk)  ' C8 k" z# n( Y
            begin
    " R! ?6 j) X- x# K! M" |0 V3 y4 z7 N5 k            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
    ( T' ^4 ^) x* }% U( @            thirda=seconda[3:2];
    3 r  K: v' ?+ |2 h4 l) X* P            thirdb=secondb[3:2];
    4 n  p& W5 h" }* i$ P& q        end+ J3 n4 a3 o9 N
       
    ) \3 s9 Y6 S' V+ I7 L    always @(posedge clk)  8 P/ k& ?) ]( V. [6 L% k8 C
            begin 7 _3 ?9 d" R: v
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};) @% f5 j. L9 f$ q6 @
            end+ h; T. }5 H# H/ f: }! _+ I# D
        + V4 ]! p. q3 N# N, T" F
    endmodule0 Q1 z# Z4 f: Q1 I1 Q1 \
    自己写了一个激励文件:5 e$ b- w/ o3 a3 ~8 s. `: R. G
    `timescale 10ns / 1ns# j) K" d7 m* ?1 V% ~
    module pipeline_tb;
    : M5 I4 v) S1 e" ]    / b% l! R: a# f' d% d
       
    5 T* o$ I3 y) v6 b  Y+ ~    //Internal signals declarations:
    # ?; |( g9 L; L. R! s& Z. t    wire cout;
    : h+ t5 H  r5 p, }2 ?) d    wire [7:0]sum;
    4 y4 x: t& z# d( l    reg [7:0]ina;1 ~. r+ `& D" T+ w
        reg [7:0]inb;# J6 p; H# W) e) C
        reg cin;0 b8 V) d9 S! j! }/ {
        reg clk;
    2 A* _0 j: H; ?, H    parameter dely=10;
      z9 w' M- ?1 m3 j2 B   
    2 ]0 W% y' N" G4 [   
    . Q+ U$ m' U: t( G    // Unit Under Test port map6 O# c% t8 ?+ B1 v; R. X
        pipeline UUT (* y, M* S: H5 z3 Z, |9 }3 F( E
            .cout(cout),
    - u% j9 ^, t3 }5 c& k9 D        .sum(sum),8 h- t, m) ]. p% _% @# q3 H
            .ina(ina),5 L# J4 O6 s! c
            .inb(inb),
    ) U' W  f5 R( W& p7 Y        .cin(cin),
    ! J  ~6 P1 H# \9 V        .clk(clk));     
    , D0 w( A6 F( l: m1 e    1 y! N- U% X$ {' Y& j+ P
        always #(dely/2)clk=~clk;   
    % S# d! B$ \. E/ V0 R: Z    - ^! e) j  e5 R/ m' M2 _3 M
        initial . z  E- k. P: _; T% A
            begin
    2 l9 ]6 e3 L0 F* y6 o4 S            clk=0;) b* a! m& O% c3 |, P# J9 g
                cin=0;) I% R0 F' v; j% Z( e6 D! _
                ina=8'b0;( Q# Y1 `3 D6 m+ Q# _: G- w
                inb=8'b0;
    8 u. U' s; [7 @' P8 A9 {            #(dely*1000)    $finish;+ z# [6 s; p$ d, p; b& R/ t& K8 K
            end   
    2 J/ F! o' R% i# i( p9 P  `1 D' D   
    # J) \* s. a# l1 e* p9 Z    always #(10*dely) cin=$random;: e, K" A/ W3 V( p
       
    9 y, J% l9 k/ B) Z2 x2 Q' I. ]    always #(10*dely) ina=$random; . B: X- `! r: R. j. t
       
    % S+ M4 }7 ]8 \0 u    always #(10*dely) inb=$random; 1 Q, Q* Z" E) }
        " h( b2 ~6 i2 j2 Q9 k, d! w; T
        initial
    $ i$ D8 O5 v" Q2 U1 t        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
    ' H, N1 ]0 ?  v( i' I  ^- E% Aendmodule+ p( Z& d. a7 Z) |
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。; U9 n! P0 k" V
    6 O$ o! _) p3 G) C4 V( a: b2 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 发表
    - P( t9 T) _: b$ O1 U就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。  ?8 k$ X  }- N) }! z
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB8 \8 V6 D% H. D; |

    . r: i' O" B" p0 [( V2 Z6 r$ u; I8 X
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,7 ^% [4 l  H' u$ O0 u2 h# `% ?: a
    $ {, w; O  F5 o2 g- W, |3 l  ], H
    导致最高进位出现问题。
    / D* d% j) \" ^8 Z/ r8 M* Y/ {* e0 C$ e, O, q# A7 d
    此属推断,待验证。。。
    9 o3 N0 o% _' d, e
    , [" K% e. R* R! f% X' R可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;# T/ l# Z( z, A% e1 B  p

    ) }- Z# ~9 e* s: _4 \, K再{thirdco,thirds}={second[2:0],seconds};
    : n  J1 p! q2 \0 C3 `% k! [ . ~" R! K! l8 Y, a- c
    不过我这边现在没装这个工具软件。。。
    0 M% [- D( v# C1 d

    7 |' b% @8 t1 D& L" Y
    # r' K* Z! G* W3 t4 l2 }  d[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    0 V, D  [2 i& Z; p1 q% y而且程序段可以作以下简化:
    . n' N1 e! g4 i4 k1 o: P+ H; ?/ y0 ?0 W% n
    ; B: \' |/ ]4 N( \4 r
    reg [8:0]ins;
    0 b' g7 M' s0 Y; t4 p
    ! V: N% M/ E% _7 Y: b9 ^# ~always @(posedge clk)  ! E. L" N% J5 p. q  m. r
      begin
    ) {) E. t. f1 c. |6 x" F  X' W: ]0 e       tempa<=ina;
    / A' E& _) K9 ]% E1 Q( l       tempb<=inb;
    - [% w, X" p( V9 T7 Q% q4 l+ Z8 o       tempci<=cin;
    ) f' E2 \8 ^9 h1 L) k' p& \! G4 q  g   end               " G, W( T$ v. e+ n- R9 s: y8 {" a
    always @(posedge clk)  + m/ t6 j  }( _& l
    begin
    3 C; T3 o% Q) X- K       ins=tempa+tempb+tempc;      
    / x1 u4 n/ Y6 Y3 e, E       {cout,sum}={ins};
    2 O0 n1 i" i! z0 o5 X: W end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 ' ^* j2 X; b$ T" K
    回去试了一下,确实如此。
    $ l/ i* N0 O' Z% F9 B% R8 H5 a而且程序段可以作以下简化:# w9 b0 I6 O( l3 \# X: ~: i

    ( _2 K, A5 ^) g  A9 ~
      q' w, s5 M% ?5 zreg [8:0]ins;
    : _1 \9 O- F5 ~( C* S- l/ ]" p9 R/ u; V! P: `! R
    always @(posedge clk)  & a8 m6 J9 M) @3 \6 r% b9 o% O
      begin
    $ ~  o% {! h, ]( p( H       tempa
    / Q2 F6 U4 z% l
    虽然没错1 \" T) `# E: x4 i9 w# y: I
    这样的代码综合出来比流水线效率低
    # W8 k5 S' y. w3 N9 H综合出来用的器件也多哈
    ) y  P% I+ j0 w% c( b呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表
    % b1 \' q, h8 V2 @' T1 K0 N9 k据猜测,程序可能有问题。
    " a4 w* [, I0 Q+ E1 D{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB' T$ D% ^- s; y, w0 p" t, W
    9 k" G0 ~5 N8 O: c! [

    + u5 C/ w0 D/ g, E: X其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    3 ^# |1 Y, U+ I1 P- a2 u( Z/ a
    导致最高进位出现问题 ...

    2 f& u, R% D6 ]这个问题我也注意到了
    & z* ~$ Y: ]6 [2 o但问题在于为何第一也是这样的效果为何就有进位变化
    " T! h3 J+ ]. U' ]. W而只有后面的两个有错误?7 _% H1 ~" L9 u5 B5 B$ a" j

    ; C' S0 ^" H7 r# H& m不知道是否与verilog语言本事有关系?
    " w$ I  G- [' b( \! t0 A
    - |' P$ E0 ~# ~5 j, O. _- b& C我自己试了试
      \: G; V  n" O# I) }# @+ A& N如何在加之前先把2位的值赋值给一个3位的值
    7 D1 N4 _+ W* b( X* P4 J6 Y这样就能保证赋值间的位数一样
    1 s0 ?/ E" ?; d+ O- |* V/ H4 l6 n这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表 ' w( ?$ [+ C+ n

    3 e7 t9 j/ ~4 T" n1 s. |0 F这个问题我也注意到了
    " Q# J* y. n9 Q1 a/ u  |但问题在于为何第一也是这样的效果为何就有进位变化8 k5 s% W( ^$ a: M* _
    而只有后面的两个有错误?2 g& Q. v$ }+ T8 ?* p8 P
    7 F' Y6 S* @9 t3 e3 X( ?1 Q
    不知道是否与verilog语言本事有关系?- f6 d" Y3 o5 Y' o% l

    $ j  ^5 I0 G* r# R我自己试了试9 |& p* H9 T! a8 n
    如何在加之前先把2位的值赋值给一个3位的值
    ' W7 U% I9 e6 r* r3 [这样 ...
    4 H8 d. a( ?5 v

    " ]4 X) ?! }% m0 S, ~" ?/ d- C* T8 _3 E. Q0 b# C  j2 [" _
    2 x5 d& P# g( `/ f. f: }% h
    也可以说是verilog本身的原因吧,
    $ e: ^! `: x2 I9 }; @5 w* B0 j因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    ; A3 k# I: |; _$ I6 ^并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
    ) ?! \9 w7 @$ }) [! C9 O7 [这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    / M1 @/ n, v* w) L% D! N; j本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。/ |1 d7 o( l8 w* G4 F6 b
    一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    - E) L7 e2 K1 I4 O' ~- B1 E5 [8 Y5 @8 r5 C9 g/ R
    虽然没错9 z5 a0 k5 A; R- m
    这样的代码综合出来比流水线效率低" H/ B1 m0 U! c% I  r5 t9 M$ r6 ?
    综合出来用的器件也多哈& e! q  {1 j% f
    呵呵
    $ L9 `1 |% v' D; U  d

    ( C: W9 Z0 g& y" M4 N: Y( Z) h; `0 ]* i) O" e, y
    呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    , P! t* N& F: R6 d
    ' u; h+ I+ T- A1 u+ N+ w, ^" @5 }4 L" e4 Z' o
    ( n. ]/ q1 i( K# P& i, D
    呵呵,这个我倒没考虑过
    % V8 \1 I/ ^6 V6 J
    3 u5 X/ b0 c1 }2 _+ V0 E7 |! Z! q9 S
    你可以参看一些教程里面的综合结果实例对比
    , X! c! G7 ?7 x3 C
    ( w' B! W# {9 S代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-4 07:39 , Processed in 0.093750 second(s), 27 queries , Gzip On.

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

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

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