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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器7 T; ^3 r. I; `) m
    从书上抄的一个例子:
    # n, O; \* J4 j3 u7 L; Fmodule pipeline(cout,sum,ina,inb,cin,clk);
    * v, k  G5 L8 `- H7 i% p3 P  {- p   
    ; ]$ ~* \+ c% N2 }) B    output [7:0] sum;1 E$ t) K' I: o8 H8 t- P$ x
        output cout;
    0 s- \0 i7 N. Z' Z    input [7:0] ina;
    6 e1 S* I' W: B. s0 t    input [7:0] inb;
    1 L; j$ v8 l$ V    input cin,clk;; N7 R1 e7 k' C+ v3 ^; t+ O
        reg [7:0] tempa,tempb,sum;
      Y7 r2 {! h1 M) ]' X    reg tempci,firstco,secondco,thirdco,cout;
    - U6 p* `! K9 Y0 N+ M' ~& o! P    reg [1:0] firsts,thirda,thirdb;3 b. s2 x; i/ u. K- i- S9 c
        reg [3:0] seconda;
    ) @. U; d9 J7 [6 {- G, e9 I1 s: U    reg [3:0] secondb;% \% w9 r4 F# h) M
        reg [3:0] seconds;
    ! ]& d2 g5 O& X    reg [5:0] firsta,firstb,thirds;
    8 ^2 j. r3 s% y& `+ c% M/ T0 `   
      m: r! c. M- `" ]+ Y+ s7 J  a- Z1 x. v    always @(posedge clk)  / n% K! d% L# Z! \! N$ T# b3 v* d( |
            begin
    3 h6 I) ^' \) t& {, U1 R            tempa=ina;
    . @* J" q  t2 H% @            tempb=inb;
    # y" h: Q% K" {# J8 x            tempci=cin;
    ! ~6 }; j- I; o        end               
    7 k8 A( d0 T0 B7 }0 y% F    . ^3 L* r0 Z3 }8 Q5 ]2 l
        always @(posedge clk)  
    " z* g$ t2 H2 |8 B  G        begin
    0 m6 Q: d1 j) x2 U% j' T2 y2 T6 Z            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;+ [4 r7 [  @" c" S' G$ U
                firsta=tempa[7:2];; v+ }6 \+ D0 U% f
                firstb=tempb[7:2];( h6 U' |' g' u; {) w; v
            end      
    5 F# R4 a, m3 D2 k   
    0 [/ r6 s' J5 O9 V% [9 X8 I& I    always @(posedge clk)  
    $ k3 @' j8 a' W- ?! X' D        begin* m% J4 d3 }4 M/ V9 k4 c6 e
                {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};( b& F1 Z; R" p! b1 ^
                seconda=firsta[5:2];
    * E- h. M% G! H3 Z0 e: y            secondb=firstb[5:2];
    / d- K" x! @2 \: a# ^        end
    ' Q+ H. I9 Q! ?4 d) U   
    " f( u  `6 l4 O! M) l0 D    always @(posedge clk)  
    % `/ F; r4 A6 [        begin
    / U% ^4 R4 B6 _9 ]' H            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};; T& N. h5 y$ f; s
                thirda=seconda[3:2];6 a, w3 s& G  x! j. i8 K
                thirdb=secondb[3:2];
    3 h# T, S" x" n0 u' T- r) E        end
    % ~' e2 E0 |0 C3 Q1 b7 o$ q# W0 N$ R8 B    / C! a( n1 Y! r1 V
        always @(posedge clk)  . Q% S9 _8 @4 t# _# T& z# @
            begin ; E. I. s7 [: k3 k+ w9 r( v1 b
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};# N; }5 \6 N  y/ L  P8 `! ^
            end
    4 M4 G$ p. w( h. _   
      t# L6 `  j! V% W0 l" ~5 q  @endmodule! W/ [2 W: {" \9 P7 k7 B: X0 `0 ?$ Q
    自己写了一个激励文件:6 R' |4 K; A8 j
    `timescale 10ns / 1ns/ |" n6 p5 t; a9 L( D7 ^. L& i0 i
    module pipeline_tb;9 F6 l, o1 k( e
        6 l( O5 l! w4 q: f
       
    6 c6 t! d, Z- R8 E* T; w; l    //Internal signals declarations:
    3 Y) X- G% j( I5 x# n3 o    wire cout;- `7 H8 U1 D: A! k. X9 c* @
        wire [7:0]sum;
    6 R4 \/ m& {& q% G$ f7 u- ^/ ^2 U* f    reg [7:0]ina;
    1 h- x. y5 }- m( O    reg [7:0]inb;
    # D5 j& |* L; }, Y$ k    reg cin;3 @+ o) Z. }" z8 L# Q' R& y9 U) I" d
        reg clk;
    0 a1 t# ]1 ?3 R8 r, w8 i    parameter dely=10;
    : ?) X% k2 p+ y- G* I7 m, g& Z- {8 o   
    ; @$ L  a) }7 s9 L) T" \  @0 Y    . P: Q$ Z- n" ]% y  ^0 Z
        // Unit Under Test port map; X/ W8 H% Z& R  `
        pipeline UUT (
    0 S2 O$ V2 ]4 h  j        .cout(cout),+ ?$ b4 [# a- S( ]
            .sum(sum),
    $ h( Z! e$ D; k8 M        .ina(ina),- G& y5 {1 S9 _% t$ V( H
            .inb(inb),& q# z4 U: h; a1 T% L" Z
            .cin(cin),
    0 X/ W1 u' W1 h8 L; ]7 y        .clk(clk));     
    0 G% H8 C* Y* i1 p6 }1 h   
    2 h2 x7 `, R  e$ h. L0 [$ k    always #(dely/2)clk=~clk;    % n  M  B( O/ J! s1 d9 `
       
    7 Y! W/ j# n: z, d/ }    initial 3 ?9 X' q* E! K8 A3 U# ?) l
            begin ; M& Z" s: [3 A9 `8 Y" E
                clk=0;
    0 R! H' h/ G! M+ J' n$ G/ \            cin=0;- U) ?8 v' d2 X5 C/ u, S
                ina=8'b0;
    8 g/ S* R# n4 c$ H1 y            inb=8'b0;
    & u' v# T9 |  o5 `            #(dely*1000)    $finish;
    * b5 ^$ N2 t2 s" c4 o2 L, I: I        end   
    : \, A: \( x, A    8 g6 P5 C) h" u# D
        always #(10*dely) cin=$random;
    7 E8 q% @: |1 j! t    7 L! c2 s7 x  }$ q) P
        always #(10*dely) ina=$random;
    3 j8 @4 c2 `7 U$ |2 K1 ?1 D1 N- R   
    + N( i5 |5 [. R  d' O( M% L    always #(10*dely) inb=$random;
    % i0 {' _. i" d3 `# s4 ]  L/ O- b    & g. x, W1 Z* z
        initial
      m' l; ~$ }" F1 o        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);: k- r. w" h  T+ d0 q, v
    endmodule
    % ^: `' L. h( g' s但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    , r: t1 e$ ~2 d/ [/ m/ e0 q4 k
    [ 本帖最后由 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 发表
    3 y4 N1 E5 \4 x: ^% C就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。
    6 v' a( B& c# D; b5 k$ g' K2 k{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB' h3 P/ V+ M* R8 w

    3 c2 g* g& t/ @7 S+ P  R) N# L1 {1 T3 D5 D7 {- U3 C4 `
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,: f4 D& p& }0 Q) t

    " W' a/ ^4 a- h. f导致最高进位出现问题。
    - B) [9 G+ n  f/ X4 @1 e, G) W/ u4 G& g$ ~: d$ Y; U
    此属推断,待验证。。。
    4 k( _  k/ @2 ?& }( ^! [) \' J8 o1 a8 e" Z
    可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    & t  T: {7 A; t0 a, Z3 t0 }: m4 {2 y3 w  y9 ]$ u; m" r
    再{thirdco,thirds}={second[2:0],seconds};
    - u( F0 f  i# ?7 W) S+ c 5 a# |0 ^% a  O( I' _7 e) I3 e  d5 M
    不过我这边现在没装这个工具软件。。。$ F: s! p* p; X8 c3 f! e

    8 _. b8 c  L' L6 t6 v! T6 e, }5 _4 ^% [* C, l0 `, L! G. v
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。2 w/ R/ K7 r; i" {
    而且程序段可以作以下简化:9 H7 ~2 a: x. e% n) c1 ^: {
    3 x4 |" w7 w8 p: t& X/ k! u* |

    # }& E: N7 i  M: {9 q6 f; ?0 Kreg [8:0]ins;9 v( m) I/ H9 t4 ?! v
    5 l& P8 e/ X5 D  K# G& g
    always @(posedge clk)  
    5 @! F: K. o9 S2 G/ B1 o& c+ z* P  begin
    + ?$ _$ D, z1 e       tempa<=ina;
    , [* {8 S5 ~" v% p+ J: |: `+ @       tempb<=inb;
    ! f' K1 M5 k. C7 w       tempci<=cin;
    5 `' Q- L/ C' g9 `1 N2 q/ @& R   end               
    2 ?4 I5 {- R% N% ?* ? always @(posedge clk)  
    $ P. w& \( K, K+ k3 @, \& ~! N begin ) u1 f% h7 f. G/ v- x4 H
           ins=tempa+tempb+tempc;      ' w" f' ]6 S( ^( `
           {cout,sum}={ins};8 J0 d5 n5 p& w4 x
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表
    7 y: p* {1 v+ M3 v  P* ^回去试了一下,确实如此。3 i: s) |; P: ^  B0 f
    而且程序段可以作以下简化:) ]+ p9 j3 {6 N. L3 b
    ) O# V' U# P0 r. o

    5 G3 F; e* v! n3 @reg [8:0]ins;) z2 f0 O1 {+ W

    2 @1 R) \+ q- J5 `  ^/ q1 ?always @(posedge clk)  / |$ {. k* O- l( s7 T7 {
      begin
      [6 ]1 B& Z) x2 c% v       tempa

      b5 O$ x0 h. b7 U# n& F. Q0 A虽然没错( c$ c* v8 s+ m5 c% J
    这样的代码综合出来比流水线效率低
    ; X8 d3 b# C  k综合出来用的器件也多哈8 A0 \4 }7 A  x7 E* a/ D3 z
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表
    3 }' ~: U, ?. W8 m* M据猜测,程序可能有问题。- w8 L4 k3 t  h9 m& y+ r1 r  N
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB2 C" H$ ?( [0 e% o. W
    1 i  w8 ^- V1 G, S

    % p, @; ]# i6 B3 f其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    . k/ R7 w6 B+ _. P9 \! Q- U5 Q$ H
    导致最高进位出现问题 ...

    ( ]0 V4 [0 c* ?$ U: Z这个问题我也注意到了
    3 e% V, B) A+ ]! S/ Q7 q  c# o, v但问题在于为何第一也是这样的效果为何就有进位变化
    & I( W+ _  `/ I+ W8 Y而只有后面的两个有错误?
    ' [% D4 r7 U  }+ _" E  q' N4 p) W6 b, U: Y
    不知道是否与verilog语言本事有关系?
    : F! z7 V4 a/ B) m' y$ E* K# a/ O3 G' x7 M* q) g8 L* c2 Q1 A. ]0 A
    我自己试了试' h4 e( Z9 h( {, n
    如何在加之前先把2位的值赋值给一个3位的值* v2 U" @$ N6 a; l% Q
    这样就能保证赋值间的位数一样0 ~. h& W3 L# Z
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表 5 W1 R8 T% L' l: K: [
    5 o1 Q% P" _, ^; @" G( _
    这个问题我也注意到了
      Q0 m1 k) l2 J  p" @/ w但问题在于为何第一也是这样的效果为何就有进位变化
    . O$ e2 P2 a6 {7 J  ]) y而只有后面的两个有错误?
    ! j( ]9 H5 C$ j5 _: X7 H! _8 Y$ R: f) j0 x# W% j
    不知道是否与verilog语言本事有关系?- E( d/ A; s5 G6 E" K: i- j
    0 Q. f9 O) q: \* `7 _9 K
    我自己试了试6 ~2 c2 l- J, h# p6 P$ {
    如何在加之前先把2位的值赋值给一个3位的值" Y5 A; i6 O: N! w9 U0 A
    这样 ...
    ; M# h8 S* A( j

    . m" {; K. n4 f) f. o4 f$ F' a6 I4 \* }
    # ~3 h1 z; v- z0 r5 C" L! Q# d+ j+ p+ A5 ~! u6 G/ q6 N" P
    也可以说是verilog本身的原因吧,
    - T3 Y1 ]5 ?  j# |因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    6 {7 w& j: L9 W9 n' F并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,) o! s1 e% l/ G+ j: m3 j: J
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    ! K. ]5 A+ z2 _' ?4 o- f本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。! o  _! e4 Y/ M) z
    一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    ; A5 C/ ~; z& L5 ]1 I
    0 n3 Y" Z  S4 s8 J6 r虽然没错
    1 H3 A0 A' Z9 Y; T这样的代码综合出来比流水线效率低: ]7 f( v% b, [8 f
    综合出来用的器件也多哈# W/ ^; H( F8 i; L7 w  }" Q% b2 C
    呵呵

    , t# F7 E3 |8 M1 g+ k) o7 Z2 j: F9 m% {( n  `

    , T2 A$ f# @) v. Y  s9 i  C- ~7 \6 j呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    * m# N& d  C( |8 P; P1 Q1 ^0 J- E+ b9 ~

    % O5 h6 H$ u$ ]' f, G/ u) `; E% m$ s
    / M! Q, R2 j" Y1 M$ U3 Q- L' N呵呵,这个我倒没考虑过
    / B, O) a8 m7 c1 G. H8 F

    5 k, M1 s+ Q4 F% ?1 o) D你可以参看一些教程里面的综合结果实例对比
    : W" Q, r0 o- |. T( A6 z! l
    / b" `! h3 A" H6 k代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-5-31 04:14 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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