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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器) ~% {, l  ?! a. _0 R
    从书上抄的一个例子:
    : o, u: [# k+ @) N' W" l! Z' n0 \module pipeline(cout,sum,ina,inb,cin,clk);0 S3 [& {9 d# i6 L' T' T
        , p3 @! N" `) z
        output [7:0] sum;- @2 b# e) O& g8 X1 W" G7 Y2 s
        output cout;% X2 w& e! N5 S2 z/ O
        input [7:0] ina;
    - M; p6 p; \8 P, P9 j    input [7:0] inb;
    8 K2 R  K/ M" f" K* i6 A9 R1 j% A: M    input cin,clk;/ ~! U: ~5 w: ]
        reg [7:0] tempa,tempb,sum;
    + d% C; V3 p! E. f& z    reg tempci,firstco,secondco,thirdco,cout;8 z" t2 \# J' H" F
        reg [1:0] firsts,thirda,thirdb;  D! J3 a( Q% k4 P5 x" n
        reg [3:0] seconda;% P0 ~( o7 j) R( `1 b
        reg [3:0] secondb;, [- R1 T, q. _& p% e7 Q* \
        reg [3:0] seconds;
    & ^, e1 G) z8 ^    reg [5:0] firsta,firstb,thirds;
    9 e4 {- B6 X( R9 n$ {  ]5 Q, U. e   
    5 h# G9 P$ Q- {" b) \& T( w  Z    always @(posedge clk)  1 j" d, U+ n9 w& `
            begin+ i: R: N1 A4 M$ J) |/ q
                tempa=ina;
    ( j" V- v( M: O, s  |3 R5 n            tempb=inb;
    ! ~6 I/ m  I" F, ?            tempci=cin;, a/ e8 z- J( O& N
            end               ( q% t& Z* i9 j8 [- f& y3 @
       
    $ Y# Y2 \, J! R    always @(posedge clk)  
    ) d, U( Q# m& I        begin
    . t4 s0 c* N2 u2 T/ Y  N            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    0 E  Z5 T! P; j( O2 t. b) p            firsta=tempa[7:2];3 a1 D4 H8 A9 E* @; ^8 _( |6 H/ t
                firstb=tempb[7:2];- l# @: e; {( ]/ _
            end      
    2 ?3 b/ A9 A! e2 a! _' O( _   
    + G& F& w- X1 ^5 A; t    always @(posedge clk)  $ ^2 C: z' z& x7 N7 u1 @
            begin3 @* s* L5 u) M$ @/ A/ b8 M
                {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};% {  ^1 Q) s- N- n
                seconda=firsta[5:2];
    $ C# n9 t2 U4 H1 H1 U& E            secondb=firstb[5:2];6 f8 a4 A, C4 g! k; B
            end
    # ]! q1 ^$ Q! U; |/ s) v    # I, |- o. n7 m4 O9 k# |
        always @(posedge clk)  
    $ G, C6 [9 d/ C& c% ?: |        begin 3 I9 g$ C, D$ E8 E* ~
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};1 b( X$ i9 w) C& G- v9 {
                thirda=seconda[3:2];, `0 T# H, K: T- D
                thirdb=secondb[3:2];
    " e) H1 j7 X5 \* w; N$ T/ P) G        end
    " d) X4 m/ g" D6 I    # a- ]) n5 {5 H. o0 E2 N
        always @(posedge clk)  , i  g- G3 X( ]- N4 l* X8 {) H, ^
            begin 0 W; S, x0 z/ D) l  }
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
    9 D# `' r4 ?- @; D3 J        end
    ( l' n9 |' F; C  H6 k, n    & Z# f1 [- h7 B. o1 k3 T, [* R. y
    endmodule
    1 ^3 O6 Q7 E' A/ x& I自己写了一个激励文件:0 Y* c' S* ^# ^
    `timescale 10ns / 1ns% s/ g; I  Z% a8 d
    module pipeline_tb;/ G4 j# h1 x# [' k; I! k+ Y6 X
       
    4 Q- S: g7 }1 B, k7 r1 g/ i   
    . A. I! B* ^# W% M3 J; }    //Internal signals declarations:
    . ~7 Q! X7 i: s  {) S    wire cout;
    0 }) {# Y3 F! t% W. u- j- r    wire [7:0]sum;
    ( c7 t; f/ k8 X& R: [    reg [7:0]ina;" G7 u2 l" R* U- w
        reg [7:0]inb;
    8 a" u: i0 L2 Y; b2 l3 n0 }3 e    reg cin;
    ( A( v: t4 U( [% e* J! v    reg clk;
    0 m6 b7 o/ f- ?# D    parameter dely=10;
      n/ y  f* k0 F   
    7 d4 W- g* n) Y" M- y  B' R   
    & r/ ?" p# }+ |; E8 G: d    // Unit Under Test port map
    - K& u0 c  _3 |! b% [3 l    pipeline UUT (4 t6 y$ V4 G' m( G% L
            .cout(cout),
    0 A% f/ Q2 Y0 D0 m: c        .sum(sum),
    # L4 P! ?& w4 V2 v5 R% {6 N$ g3 `        .ina(ina),, d+ J& ]* u$ n' T+ r0 C3 o+ u
            .inb(inb),
    ) u/ i* f, l/ C        .cin(cin),
    9 s4 M8 z. u4 l2 B; Y        .clk(clk));     " }6 f' M0 ~, n! `: H# z  p; c
        ! Y5 c( y6 l" k8 Q3 ]9 Z" d4 t6 y2 q
        always #(dely/2)clk=~clk;   
    / h* A0 F- z' M' I" B" K- y$ {   
    $ r, q2 o3 ?. X+ g$ ~8 r    initial
    4 v, S6 e; F( a' A. C        begin % [& w/ D$ ^5 p( T% n# a) Q  `
                clk=0;
    7 P* }6 ^, {  w4 ]. [. A7 r: G            cin=0;
    % \& `& p" ^: ^8 o# b            ina=8'b0;1 ^$ c( J: w( ]4 l6 s# H8 `9 m0 I8 A
                inb=8'b0;
    ( w; ]9 S  D! M9 |# _            #(dely*1000)    $finish;  k" O2 {: G8 `9 \
            end    4 y) A( y5 \$ P6 h# B8 F' @
       
    . w. e' ^4 Z, C5 H$ G4 w    always #(10*dely) cin=$random;
    9 }7 k1 Y" g+ ?  B! u/ d* s6 M* u   
    : t$ M7 [2 b2 ^: o4 _8 K    always #(10*dely) ina=$random;
    ; }9 l% R, f$ m    # g. Q, ^( A' X# i/ T
        always #(10*dely) inb=$random;
    ; q% t5 G" R2 O5 ]   
    0 R6 A$ U  l; L% r; G8 C    initial8 y7 H$ Y  b" c! U( C' G
            $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
    & s# q6 ?/ c' T; oendmodule
    3 X) c& X  t6 |9 Z6 d5 \+ X但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。; b' t, a; \9 g, r  {

    ' j, ?* E4 A" @  g0 W[ 本帖最后由 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 发表   l. q; g* o* T0 q+ T; T0 m: d9 w# }
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。- K- Z1 d( z! w
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
    3 h" l" N+ \8 J0 w$ s' |7 p' d
    - L- a4 A) E+ l- C  F- v
    + y1 C5 d# I9 O6 `% t其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,: U! X, B& Y  s5 v0 ~

    8 |8 R- |: V/ p2 w; ?5 `1 B导致最高进位出现问题。8 N" a0 \) I5 @( Z2 }

    / D( a/ D4 ?& k8 y此属推断,待验证。。。; X% ~4 o3 O$ m& T9 T; v* Z

    0 e9 m% G( u6 a可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    6 ]0 {3 x$ j: u& L, i4 ?4 I6 T' J/ y8 M4 L  v
    再{thirdco,thirds}={second[2:0],seconds};" z0 @1 ]% |; U' C. _9 R

    ' C9 E$ F) p; S; r% v$ V; n. Y( A# {1 N不过我这边现在没装这个工具软件。。。
    - {% Z- ~% m! e& X, {2 G' N+ O
    6 {1 p0 n# d" y  b1 s" d0 H2 C+ J
    : }- T" q6 t- F  J0 ^
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    * Y6 Q5 b! z/ o. ^+ s4 e% f+ k+ y而且程序段可以作以下简化:
    & S, F" G. N8 ~+ @7 E) h
    9 \. ~+ h( ?" C* m8 ^2 T7 ^* h
    0 l, X; r- v8 o9 y2 Y' b$ _$ S" lreg [8:0]ins;8 f) x; Z0 |4 e1 \/ }8 U9 K# _

    4 {  q/ I  ]6 S: D, falways @(posedge clk)  6 T) c+ N9 R5 E5 _' Y- x
      begin, D9 K9 N# t3 B; m0 `/ K
           tempa<=ina;
    ' u; M8 m! I: [$ P! q# s       tempb<=inb;
    # {2 Z9 N( l0 R. g       tempci<=cin;
    1 n6 o/ d0 `+ [& [% @   end               # ~( e! W+ R% E8 b
    always @(posedge clk)  
    ; d6 F6 i! P: n( B4 Q  [/ o! `7 _ begin
    - M* x% F% f- x/ H& H       ins=tempa+tempb+tempc;      ' P% g0 |0 m( U( i; J# Y# i
           {cout,sum}={ins};# D4 V7 q$ Y$ l- X( P6 o4 n
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表
    $ Y+ m6 _9 Q# Z6 f* k- g6 x' n回去试了一下,确实如此。
    ' R- c+ I7 A/ q3 U而且程序段可以作以下简化:% ]( m: x2 a$ }8 m

    2 x* E% ]- Y) H& r9 g1 }+ e) x& h7 r, x
    reg [8:0]ins;
    ( B( @2 ^6 n. k- Y# U$ W0 r: s  F
    2 L) S1 M: \2 M  {& ?always @(posedge clk)    ]$ J4 m3 E9 D% ^7 M
      begin1 P/ e7 m% J$ R
           tempa

    0 H% W) |" W, P& z! i虽然没错
    % W0 D. N: n' X; F3 r3 e1 L这样的代码综合出来比流水线效率低
    % g- H2 }: g0 B9 w8 U综合出来用的器件也多哈, K( U  L" B+ f# n
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 ) A; Z: @% }# w, _% S  L8 Z$ a; G6 w
    据猜测,程序可能有问题。9 @8 J0 X4 M# |* D
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
    . X8 e& F6 I4 C& j7 Y2 M& i) Q" H' T$ C- P  O# _
    0 T! Q) X8 E, f6 d) R$ U' B6 v& T. c+ W; A
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    - t6 m( b1 E6 n' z, z3 y
    : K/ g% z0 W: b6 z0 G3 p导致最高进位出现问题 ...
    / n" d" f9 x6 K. ^8 e, I
    这个问题我也注意到了
    9 \2 F& \5 E, n/ _3 F7 h! j但问题在于为何第一也是这样的效果为何就有进位变化
    # }( C9 V! V) X- i% m7 r而只有后面的两个有错误?. x$ `! ?3 t$ h( C% q
    * Y; h# D% G5 j" Y$ r" d
    不知道是否与verilog语言本事有关系?7 K, C4 r& c. J2 Z1 {

    3 Q) c, F+ \$ ~! ?+ N0 W我自己试了试" [* F6 y7 Q& p, Z  Q& h
    如何在加之前先把2位的值赋值给一个3位的值/ X/ [. z2 m3 C( Y* l
    这样就能保证赋值间的位数一样# ]9 m4 E% y4 @" `
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
    : e# S) N4 f$ m7 s6 _3 W" H
    " F- x9 B8 }# A' ]这个问题我也注意到了# y# L5 j( R( `/ @$ G: V5 c/ x8 J. |, {
    但问题在于为何第一也是这样的效果为何就有进位变化
    , ]& M6 I5 ]9 l/ y' I  `- E* e而只有后面的两个有错误?
    ! p5 U4 q% ~6 K2 B& v
    4 i' E( \1 H( |0 R不知道是否与verilog语言本事有关系?
    + S9 @8 E: i& t! K1 W; A& \6 n
    / ?. z! E+ {9 j" x7 O我自己试了试4 E- q8 w" a- G6 L
    如何在加之前先把2位的值赋值给一个3位的值# E0 A0 k7 k8 ^8 G8 \4 q  n8 G" k
    这样 ...
    ) Z; v% b3 ~0 S. n- A% c

    . e5 Y! i$ x: J" H1 M0 Z$ I: q: L/ ^4 W! v$ i
    7 h  H1 ?7 s# Q* E8 U
    也可以说是verilog本身的原因吧,8 H# R7 N( B6 s  J: s4 k: M
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}+ T, F; M; ~% X) @4 d* B
    并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的," j: y5 k1 E, s$ N7 R6 H4 w
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    + R, O0 m( \5 Y0 Q本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    # P5 U5 F; m  U7 }一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表 : N- B1 v$ J* C- k2 o5 z( v

    " Z; C+ s$ U  E* ^7 y虽然没错. ~8 L* L7 s& [; u0 E7 D
    这样的代码综合出来比流水线效率低
    ( N3 k1 j, _: ^* e3 {3 E综合出来用的器件也多哈- }! O" t8 P8 r' d. [! R( u: v
    呵呵

    " i2 l2 [! E+ e& C  ^  x4 v" E; W$ r5 C' T
    / l7 l( j8 y) @& T
    呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    4 o# Y' o6 }/ @+ }+ E
    2 w* Q$ O$ T6 G% R! l
    $ s1 I% O! w/ P! A- [
    7 ~- M. d5 h  T+ k$ m( ^5 Y& M呵呵,这个我倒没考虑过

    " y. y% v% O* p
    ) d: G5 ]- d$ n+ ]你可以参看一些教程里面的综合结果实例对比$ X1 t  x- A. p9 `( Y% ?, B

      y. G+ d7 U$ |/ K% {2 Q代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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