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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器4 L; w3 W4 a% ?" h  ?
    从书上抄的一个例子:4 i& A1 n8 m# [/ M
    module pipeline(cout,sum,ina,inb,cin,clk);
    6 m! e% v0 T3 J- n   
    ( z9 t- B& H6 w3 n: p    output [7:0] sum;+ _% N6 ], \1 n0 u" z
        output cout;
    3 a7 G1 T2 `+ C8 d" f$ u    input [7:0] ina;/ m$ n3 p5 H: s- ^; J: I
        input [7:0] inb;
    , J" e0 _/ g# D    input cin,clk;
    8 |9 ]0 E! H$ ?9 z; O  D    reg [7:0] tempa,tempb,sum;" i+ x; p) v2 O  |+ D- X* ^2 L( x9 `
        reg tempci,firstco,secondco,thirdco,cout;$ D! \* w5 L% |' D3 ]" O" ]% B; ]
        reg [1:0] firsts,thirda,thirdb;
    6 C8 m# F* @( n    reg [3:0] seconda;) a! J4 M7 }' D8 L2 x2 p
        reg [3:0] secondb;
    7 e( Y" J) i3 d, X* b( K    reg [3:0] seconds;1 S- K$ P4 h2 _2 p
        reg [5:0] firsta,firstb,thirds;
    6 Y( s; c( P' U* i: g* v    7 {* l8 W5 F6 w% j. z% W) B; k
        always @(posedge clk)  
    1 D, }% }/ W4 P) u6 e        begin
    , d+ ]! U0 n( f            tempa=ina;
    3 `, W8 E" @) I: O5 T, O            tempb=inb;( b/ D: h8 R; J5 h' z, U. k
                tempci=cin;& i& v% U0 B7 I/ D
            end               4 W5 z( N2 Z9 t6 A
       
    & w, V  n/ g+ o1 @4 E& I7 `% }    always @(posedge clk)  0 _9 _$ \! v# e* G. O8 z7 F
            begin
    # Y1 C; f6 T! E" q$ H. D" g            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    8 u, l0 d" @/ }* r' h# o+ y            firsta=tempa[7:2];
    3 G/ J/ C  ^$ K  L4 g1 m            firstb=tempb[7:2];
    7 {. a  i2 I* I1 \' X: }' p        end      
    ( W. ^9 N% m0 ~6 r* q* V& s   
    & l' w6 i, @) l4 }1 u1 Z    always @(posedge clk)  
    7 Z6 T, ?9 D2 Q9 |% \+ Q; s: e2 y, T        begin9 n* o+ n8 L+ ~/ R+ u0 V5 s
                {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};  W. ]# E' m/ }
                seconda=firsta[5:2];
    / z& P$ N1 x& Q+ B, H, `' E            secondb=firstb[5:2];& V' Q9 z6 s/ D7 M4 D/ _4 T
            end
    - Z6 S4 D7 \, ^2 ^. J   
    $ j/ X7 ], a  i, h/ p    always @(posedge clk)  
    1 q. s! n& {, @  N; ~        begin . s) o3 p3 C1 g
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
    8 L% t6 q8 j4 }/ F' C  k            thirda=seconda[3:2];" T+ g. C6 H- q5 p; E1 Y1 u
                thirdb=secondb[3:2];
    ( n6 b; [+ `0 ]$ l- Q# Z        end
    : V- t1 C% }$ ?( I; i    - L% p7 a: \* b& ^
        always @(posedge clk)  ! N& w( }' H& p" X9 H* \
            begin 5 q6 T- `" Z1 A1 i
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};! D- m+ e( @+ M  S$ {! _2 I
            end
    9 Z# v8 x$ W# @   
    6 `$ b. @- {' a: N! x, Yendmodule
    " G3 k% S" U  ?, c" v, r, j自己写了一个激励文件:6 k5 {2 C, \2 P! g
    `timescale 10ns / 1ns
    6 J1 H8 V0 I) {% j( Emodule pipeline_tb;8 X4 R- S$ D# n; J! t3 n. B
        0 H- R+ L, `# c- Z6 H/ R! X( ^
       
    + f/ E4 [; g; p0 m+ l, N/ i9 S- L3 Z* C    //Internal signals declarations:8 s& z, B/ K  N5 ~- |4 V# W0 ~; r+ G
        wire cout;
      I2 D7 q, j  W% s' O! F    wire [7:0]sum;
    3 ?3 P4 `( e# M* f: P+ T4 H    reg [7:0]ina;
    & u5 V/ T3 S% }& y7 m: [    reg [7:0]inb;, f' E* u; V4 u6 ]1 ~3 A3 f7 ]( P; p
        reg cin;
    - E! N1 V& }1 A! m( S0 ~" C8 h    reg clk;
    ; E* `+ \9 ~) \, _! \2 K% L- E    parameter dely=10;6 R" H4 l- X& p: ]) C
        : D  s+ r( p) k, H! X3 Z) k) C
       
    ! [! {9 Q% D2 d* u3 E; ]    // Unit Under Test port map
    6 I" y6 G6 o: X" ?" `/ ~    pipeline UUT (
    + K: I7 U9 |4 ]! _9 K        .cout(cout),
    6 t7 I2 z( X- R1 m0 B        .sum(sum),. }8 H: D! x5 U% V6 B4 |
            .ina(ina),( C; c% U) [+ p' V6 S
            .inb(inb),5 W8 C" e5 P* p5 H0 J" V" ^% A
            .cin(cin),
    8 _' t& b; M- Y/ C: n        .clk(clk));     
    9 O2 N; X- g9 i/ d5 i- q* \* Y% Y   
    # _& G. ]) v  ^- q* N8 a1 P    always #(dely/2)clk=~clk;   
    8 M! K) [$ F+ R6 H4 e    8 g' P/ b( W8 c  b# z% H. t
        initial
    . _" I/ x: s& {' u: Y+ J$ r0 V        begin
    ! g: m1 E0 g  f3 A/ g8 ?6 O            clk=0;, _8 Z/ s. y- K& p; y( [' R7 S
                cin=0;
    9 c5 F8 L' R# i. @/ _            ina=8'b0;" G  |$ J# R4 _' }3 f4 b# l
                inb=8'b0;
    ; T5 j# a9 a6 r. R3 S- P2 r4 R            #(dely*1000)    $finish;
    % ]. }4 F4 h1 q        end    / O0 _7 Z$ ^. x0 c
        5 y7 V8 [4 c' G0 l5 H1 a6 @
        always #(10*dely) cin=$random;
    ' z. k8 f4 g! e( b    7 Y# L/ p7 ?% L: q' M
        always #(10*dely) ina=$random;
    : N3 k6 t7 E0 u% @( W1 k* i" \    / k' O9 c- i2 h3 N( y4 c
        always #(10*dely) inb=$random; 1 B5 [5 w* {3 [$ o) x4 l2 a
       
    4 `# Q) T, z: c4 r( l8 L    initial5 g5 D, ]; r. p7 S5 n
            $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
    + |5 z/ g# ], ^! h& R7 z6 X/ s4 |endmodule' Y% w% `* C0 e/ w- d" o0 ]/ M
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。' j! S4 m! e) S
    # o) S3 O3 r" c, ]5 w6 c% X
    [ 本帖最后由 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 发表
    9 H& J% v0 I* B: y' Z就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。: g# i1 M% w" v. |% P
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB) ]$ y2 [9 x5 ^2 ^- m0 @- ~2 x0 o

    1 i' g" N  m. v2 G% J8 F" k( x/ c/ D0 o6 j
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,( N) i7 B" Y1 @1 i

    3 R( r3 \% r4 `% V  d; L% R: f导致最高进位出现问题。% b; \" |$ ^; s/ C& R

    1 a, A4 S1 s0 H$ `) K此属推断,待验证。。。
    ; i" v" r. Q) a, M
    $ G( {% A& }. H1 c2 B# @可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;2 _2 E1 l/ h: B# a0 L6 L, q0 _

    & |  e: S& l* B再{thirdco,thirds}={second[2:0],seconds};" A6 ?7 f7 F3 I" C; ~
    7 {- b8 E6 M: t. w. E: E( T# P
    不过我这边现在没装这个工具软件。。。
    8 x4 H% o5 E1 O9 |, E
    ( I% z7 a. c& v' D& X; `) s6 S
    % l0 Q  K- \/ ~
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。) j/ p( V1 T: O: {. K% G
    而且程序段可以作以下简化:
    ; C$ B$ U% _9 U6 l  s1 A8 _! h
    ! {. t/ R2 d6 x- H# ~: |9 j0 u' s8 P9 o: }- ?0 j/ [
    reg [8:0]ins;
    ) q8 m. k6 ]" O1 Q% P( S5 B
    5 |( K4 @! s4 _' y2 r. talways @(posedge clk)  * @( H! w# S) q% m
      begin3 M$ Y' t* x2 U
           tempa<=ina;
    8 U& v- W9 k- W, e. \4 V       tempb<=inb;! F& }. q9 i5 V) q" @! m+ [4 ]
           tempci<=cin;
    4 x$ A( t5 U* ~; t2 Q' X   end               ) {$ r2 W  m% c: r2 V6 F% w
    always @(posedge clk)  9 [* q' w0 q/ M: h+ l
    begin
    4 H+ E% D2 E* c1 n1 n5 v& ?       ins=tempa+tempb+tempc;      
    3 f# ~7 X- u; Y       {cout,sum}={ins};
    . O3 Y$ X% P- w8 _) t! z end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表
    3 _) f1 ~# _$ E( o. X回去试了一下,确实如此。: [0 S: M; D7 |8 S2 j
    而且程序段可以作以下简化:
    & {$ u. j9 i% Q3 R/ D
    ' f$ a8 N; W2 t. [2 L5 \% M( k' K; F; h
    reg [8:0]ins;" K5 _4 ^- l( B2 N
    $ U0 R2 E4 |! m* h% g8 r
    always @(posedge clk)  
    + Z/ ?  R) g" q$ B. D+ B  begin
    0 q' v5 @% i. @9 r       tempa

    . ~5 I  A6 Z: Q8 ?" s虽然没错
    9 L* G2 O$ Y) k: N这样的代码综合出来比流水线效率低9 G& c4 g; B& m1 a2 m
    综合出来用的器件也多哈
    . H& w  E; c5 q呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表
    . [6 ^' m) S1 t) H1 ]! V# _1 M据猜测,程序可能有问题。" j! k" S  e" b( L
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
    4 \# r$ G, B- l' W* A' l5 z0 u6 |" ], _8 E* d

    ' K3 f; f( ?( f# ^: t. `其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
      U8 Z2 N6 n4 J2 v0 L
    3 x* h  [7 u2 O6 a导致最高进位出现问题 ...

    & _6 E9 m+ \( R2 _0 P这个问题我也注意到了5 V' ?* O6 q* l- R" Q2 Y% e* }1 I
    但问题在于为何第一也是这样的效果为何就有进位变化" e5 H: |/ S4 `
    而只有后面的两个有错误?
    # i( S5 Z1 ]3 J/ k
    2 x$ y( [! Z, l4 Z) ~! b0 D不知道是否与verilog语言本事有关系?
    % p7 I; R/ _( i; b( W
      h8 g+ I! I8 f1 b9 L( W我自己试了试: \0 ~9 v' `& ^( ], p( y/ k
    如何在加之前先把2位的值赋值给一个3位的值" g9 o. Z1 \+ d  ?# [) J1 G! w
    这样就能保证赋值间的位数一样$ l5 t; n; e; i  {  v( u' j
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
    ' V# J( H, ]' K/ f$ Q$ b/ _( Z6 }8 b* Y. s- ^' a) F
    这个问题我也注意到了
    ( e- r, r# r$ Z. g) H9 A但问题在于为何第一也是这样的效果为何就有进位变化8 H$ t5 ^9 o/ z3 L
    而只有后面的两个有错误?; }0 k; A3 B/ G& `8 m9 u$ }% s; e- m

    0 k3 B0 y2 _/ U4 e不知道是否与verilog语言本事有关系?+ n* d* s) t" t: K; s/ u) n" K

    + A6 E8 J8 [( }我自己试了试  L/ f, {0 b- s# ?) }, F
    如何在加之前先把2位的值赋值给一个3位的值/ j; [2 {; e3 J4 T2 n9 V$ ?* v$ y
    这样 ...
    1 M" l; L! Y# X# k9 H7 r  w6 \

    & J8 [% c  I, X0 s: J
    ' |: E' S- ~" h% h( s
      U7 S/ D& E& J也可以说是verilog本身的原因吧,! s* j: T# |9 W3 m4 E
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    9 _$ `% M9 {% [" v并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
    % p3 T) w3 ?6 ]' _( R  {0 d这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    ; V& s$ {* Q+ U6 U本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    % U! P7 x6 F+ z3 F, h) m一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    8 Y# ]- N7 y* M7 R$ k/ A# {. y
    0 i( w2 q+ j+ f虽然没错
      S' U! C% ^5 r这样的代码综合出来比流水线效率低+ I* _2 p/ R2 X# c0 G  U4 `4 m2 n
    综合出来用的器件也多哈
    $ O: e. Z" }/ F* _呵呵
    6 T/ k  J% i  q9 w6 N0 _
    4 c( v. e. U# ]3 h

    # r. @: s, f* D% g: q( r  `  @呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表 ) H. E6 K/ S- V* f9 ?' _8 z3 o
    0 q6 x1 S' F1 r8 E

    7 g& d+ m7 @5 o1 H' x
    : N- g+ r! D3 K, H6 I呵呵,这个我倒没考虑过
    : i3 U- y6 w2 |7 q- [% N- [

    8 K/ ?! g- G9 j. U1 @& Y你可以参看一些教程里面的综合结果实例对比5 ?6 b4 P/ m( p

    - C  j$ l0 ~( F! H; l3 ?代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-31 18:51 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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