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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器
    ( y8 C) M2 t$ t& g, U( k8 i# f: K) ^从书上抄的一个例子:5 t4 p* e4 x$ _$ z+ f% u2 a8 Y5 ?! N
    module pipeline(cout,sum,ina,inb,cin,clk);+ ^: [5 a; e3 C$ p1 Z1 Q
       
    6 u0 g: p7 e9 o+ n    output [7:0] sum;
    9 s$ R# w% M/ ?7 }    output cout;
    * ?( ^; W) E: f; x    input [7:0] ina;& {/ ], ]+ l6 }- X; j2 X
        input [7:0] inb;
    $ I3 c: C1 s0 f( g0 t  w    input cin,clk;5 @# L8 @! W3 D2 x8 n4 K
        reg [7:0] tempa,tempb,sum;! [1 g; q! G, N+ P
        reg tempci,firstco,secondco,thirdco,cout;
    5 x# B! c9 z& T, g$ x4 ]$ X    reg [1:0] firsts,thirda,thirdb;  A% w" b% C9 c9 H, R9 S+ S6 J
        reg [3:0] seconda;$ J7 k0 p& ?. l
        reg [3:0] secondb;: f* t; Y2 u7 W, @
        reg [3:0] seconds;- }/ _$ G1 a  G5 N% {8 m
        reg [5:0] firsta,firstb,thirds;7 z1 H7 S! D, l' }
        ' l# {$ g2 C: @& z' K1 ]
        always @(posedge clk)  
    : V9 N% N, @5 s        begin
    . I+ ]: H" ~6 R: i0 n            tempa=ina;
    / {6 o5 L* [& A, P# P+ T$ @4 v0 g4 g1 Q; L            tempb=inb;& E9 h! w' J, v1 P' ?
                tempci=cin;
    & a) U  L7 e8 q' Y3 C# C! \; s        end               
    ' W) X, u- r1 [" u% o   
      Y3 Y8 @. _+ T" z    always @(posedge clk)  & C6 I' Q9 y) W' g  y1 ^
            begin
    % y/ ]7 O2 o/ X1 y            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    6 d4 O: }7 U' K! I            firsta=tempa[7:2];
    % M  }. P, f. k2 x0 H  N            firstb=tempb[7:2];! t' s& ?0 I: t8 H
            end      & l1 j& ?/ X9 F
       
    , }0 h$ G, m( R1 I& T! N. `- F    always @(posedge clk)  4 f: O" W% r3 _
            begin
    4 [1 O) d& A9 N% {) t( j8 m1 D            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};: v; L$ [6 V, o) A8 J
                seconda=firsta[5:2];4 ~4 g6 m, L0 \! J0 j
                secondb=firstb[5:2];
    : z, ~: h+ D2 H4 A# _0 U7 Z1 T        end
    # E/ B$ U7 u0 E4 L4 C9 b  I   
    $ |) p& N) [# M/ s    always @(posedge clk)  
    3 t& p+ j, j; o! w$ W        begin
    1 ]; X2 c& F3 t            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};4 W8 b. Q0 f3 {
                thirda=seconda[3:2];  n6 }( |% m, H7 b- ]9 g
                thirdb=secondb[3:2];% W  @0 N" G- S
            end
    3 T- p1 H, ]# U( I   
    ( D: N7 [- I2 `, |    always @(posedge clk)  : _1 ]7 d& [5 A+ k3 n8 n! n- b
            begin # J. Z; \/ n* F; M- K$ b
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
    & S7 }1 }' b' m2 i        end
    . \$ ^0 d4 Y6 ~9 {1 P2 H# ~5 s   
    1 n  y- H8 K/ @$ q. o$ R) H5 bendmodule
    + R: x0 J7 j0 H7 a自己写了一个激励文件:
    ! }3 M0 O# H) M( \% n`timescale 10ns / 1ns& g* `9 a% E* Q8 W- Q" m
    module pipeline_tb;( s! l. X% s3 L% q( x1 ~* s+ h
       
    # B% \5 F/ V% d" R: R: W   
    ; N1 y- q( {( L7 w' r( m$ V' x9 K4 \    //Internal signals declarations:: L" E% ~$ m4 f$ J% h% Q( c, n
        wire cout;
    0 a: M3 R- E" c    wire [7:0]sum;0 l- ?) L: s; D6 c8 G
        reg [7:0]ina;3 E5 o8 Y+ Z/ \
        reg [7:0]inb;
    $ `3 o3 Z* U! X) J    reg cin;) _# U% x# S2 e5 m$ u9 h: x' o
        reg clk;
    / T4 q) m8 D& e' o2 A    parameter dely=10;% c$ G+ q) |' I- m
        ! }- ^) h. M7 G( {
        2 U/ X5 c: W5 O; g$ k
        // Unit Under Test port map! n+ L2 ~: x: E3 m; T8 i
        pipeline UUT (
    8 e1 g' P+ x; y4 @8 R' _        .cout(cout),
    0 B" [; R+ J. C' |  k        .sum(sum),
    & g9 U4 y8 p+ K0 I3 E) [        .ina(ina),
    " V4 z3 m5 g) t        .inb(inb),
    1 A- k, o/ D; o7 S1 p. o* C$ I# S        .cin(cin),
    & [3 {* Z8 S5 ~6 X, s' ?& x; F        .clk(clk));     
    ! w, `  j7 _& u! q5 o0 a: Q    ' [! z) J! i9 K- q5 B
        always #(dely/2)clk=~clk;   
    3 O) b9 u  U9 p   
    2 j3 j" ^" T  Z7 ]+ N    initial
    ) m+ O! U! O. l! Y5 f        begin 8 T0 {* A5 w4 T) ?4 h  O; `$ u2 ?
                clk=0;/ H! s9 Z) R' C
                cin=0;
    9 |, a+ }; G) h2 v' Z0 r            ina=8'b0;
    * F4 F+ k: N! l# u1 j            inb=8'b0;5 N* O. w$ _: y' }
                #(dely*1000)    $finish;( W) F7 B" C& m" d
            end    + R, n5 n% `/ A/ q2 M  b+ @' t
       
    # N0 y+ E) n6 P9 g7 A    always #(10*dely) cin=$random;
    & }0 g9 G2 [2 `3 ?8 x- P   
    % B2 W+ M, v" ?8 T9 Q    always #(10*dely) ina=$random; 1 f' a0 r( B( k+ g+ a9 l. U  R
        4 Y6 \2 [7 }: E& t( g
        always #(10*dely) inb=$random;
    " j% b, I1 y9 t   
    ; |& B% [3 C1 j& i* Q7 D) q    initial
    # h4 }) l; ~5 n        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
    * n3 D. i3 ?$ O, V/ cendmodule
    % p6 z8 V: U% J6 X但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    5 n% |  S- e( o* w! S1 E: n% F9 K6 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 发表 5 h& I  F) d! k( ?) [' k
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。
    ! l8 D- s" w# {/ x9 b{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB9 o( K& K# J0 B# }: d

    ' p( n+ q/ V6 X4 Z  |' l  p- [: y: v- j8 `
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,5 L5 ?+ I: K' o4 u" K% L# P
    . t: o( }& s2 }1 u2 K
    导致最高进位出现问题。
    : h5 h: M( |9 Z" X7 Q! Q  P& `8 U% ^1 a
    此属推断,待验证。。。) u5 [  z9 v% {, G( R

    8 `9 ^  q. Z6 y: }可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;3 R* K4 D2 k3 v( a) O  z
    # d2 V+ G5 J! r6 j  y
    再{thirdco,thirds}={second[2:0],seconds};
    8 d$ L6 {( F1 K# C" m
    * H8 O# P9 @2 f* X! |0 A6 |不过我这边现在没装这个工具软件。。。* Y+ H! u' V4 e. W2 C

    : }# {# k; ~) r. G+ r
    ; d1 w! m8 d* d) {- s2 ]8 l; P[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    3 e  J4 d9 }* j9 N而且程序段可以作以下简化:) m& s! H3 e  x9 O& d4 ]! ]. N

    ) H) f" O9 Y$ m4 ]9 u/ ~# u; X  b7 ?2 f) d
    reg [8:0]ins;
    ) `& ?( @( {& G
    . I" X& v8 G9 ^" Nalways @(posedge clk)  
    ) K( i& X2 i. r7 N6 Y6 I6 \- P  begin
    ' e- a7 C1 u7 ~       tempa<=ina;; v3 H6 N) Q. J* ^  T" w& ^
           tempb<=inb;! ~- G8 Z) Y2 S# S) J3 q. Z
           tempci<=cin;' q0 z1 c, h# X- W  S
       end               
    : u" D4 U# X3 f4 ` always @(posedge clk)  
    1 h# g) i) e6 E* T begin # D; k2 ~6 c( H, K5 ^
           ins=tempa+tempb+tempc;      2 G. q6 w, C$ G+ A: r+ d* z
           {cout,sum}={ins};
    5 L1 k0 b/ X: J" a end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 + c; P' v* |( d; _8 b3 t( X
    回去试了一下,确实如此。3 j7 P# R) O4 a& D) C. Z0 V) ]
    而且程序段可以作以下简化:
    ) P5 w  o9 z0 q' i
    & I9 n$ o% L- f: r& g& Z* W8 H, x# V  l
    reg [8:0]ins;
    1 t' S. h8 p" ~: o$ s" q1 _8 u/ v
    7 N7 U2 s' z' y8 s! J5 P+ N) ?always @(posedge clk)  
    " m9 J! t* |& a/ S8 h8 @' Y  begin
    / R/ R/ v2 T* H2 e! T% s, v0 c( _       tempa
    & p7 s9 t8 O3 S5 E7 p3 b% d7 w" S
    虽然没错
    8 m* c3 }! d1 d. m这样的代码综合出来比流水线效率低
    2 J) X9 Q, E, E) @; |+ d" \0 ^综合出来用的器件也多哈4 a" M5 E/ s# |6 _& G
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 7 o# ?/ n' B3 T9 _" ]( |; I
    据猜测,程序可能有问题。; c; Y  j/ ]) N9 D  w
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB4 G; S1 ]$ }# }. ?$ u: O' P
    # Z" d& b7 v' R$ {; B: V. Y' I
    % O2 E  O7 b! s! P" k7 Q, t
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    3 H" \5 t# B2 ]% M
    ! `/ C3 T% N2 p0 ?3 t导致最高进位出现问题 ...
    . x& m7 n5 I( t2 l+ C* X+ H
    这个问题我也注意到了
    + i. T2 B- U) N3 y$ d2 n9 p但问题在于为何第一也是这样的效果为何就有进位变化
    % `8 o# w" O" s& X8 Z而只有后面的两个有错误?9 O  }' t" i; }8 ]" t+ z5 F

    0 t% X& z$ P, W4 m3 d不知道是否与verilog语言本事有关系?, x+ \. j; `( M+ @& P

    2 g/ l0 H& j4 R+ _2 n8 e% f我自己试了试
    ( e/ Z& K( [9 s9 j9 B如何在加之前先把2位的值赋值给一个3位的值) Y( l* b7 {& K
    这样就能保证赋值间的位数一样
    " d! J& d5 c  a/ S: h/ B这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表 6 Y5 }& a" F( i- f

    5 p; W7 |7 G. w! q/ I这个问题我也注意到了! w4 t& k+ C& ~! z* S) c
    但问题在于为何第一也是这样的效果为何就有进位变化7 P% N# p" @  Z9 o$ P% j9 R
    而只有后面的两个有错误?
    - N/ u; Y7 B3 V9 i: o5 l/ T
    1 H  x! V8 A$ j" ~/ @+ Z不知道是否与verilog语言本事有关系?5 X* U7 x$ \3 n% Z) a( x3 V$ z/ U

    6 y. C! v) T4 M2 f" L  O$ Y我自己试了试
    # x. |1 j2 d( l7 N# A) H: @  |如何在加之前先把2位的值赋值给一个3位的值
    ( n7 J7 o8 j+ L' Z9 V- J这样 ...

    & ]# s% c3 ?4 X, N, J2 X  v0 J0 }  I0 C7 }: S9 k
    $ L" O& h2 y0 C/ J( d

    2 ~5 k& D" k: B# V* o+ b# z# W2 X- l2 C9 W也可以说是verilog本身的原因吧,
    ; p7 s9 f/ d, d* P8 R6 k因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}# B/ ?( I3 z7 `
    并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
    - s& i! f5 z$ ]- E/ m* y8 B' ^这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    & J, t  \9 U9 a2 c: t0 {本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    & A3 i& P: ~) j0 F  z& ^一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    + n5 C; C7 Z  T& l: w
    # K, }( H1 T1 O' m! f  g+ {( e5 L! `/ K虽然没错% z# ~8 G8 ?1 H, S
    这样的代码综合出来比流水线效率低
    & T% m  \& X$ u4 A/ m8 W) f) v" Q综合出来用的器件也多哈5 s: s" m7 \1 R& G% L9 |
    呵呵

    * \8 u2 f* {7 ], b  X. U/ B) ]
    + F& h4 L5 a' o, h& P' @
    % X- l3 I, K. f: g- i) R9 J呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    4 @( q5 m$ U3 t* n( t0 v- L% @: ~- ^4 R+ {3 I2 M: G
    " |: s+ F1 Q4 n$ I% p# x

    8 ^# c2 P( @. p% z6 s8 X8 U呵呵,这个我倒没考虑过

    ! A' s# U( ^5 F+ w' w* Q
    9 Y5 }. ~  v: F/ a1 V: {你可以参看一些教程里面的综合结果实例对比
    $ U1 u9 |$ e2 Q
    - A% \* [& M" A  J- z! H* I代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-22 04:22 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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