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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器; g4 W9 H3 G* D# u- A: L
    从书上抄的一个例子:( Z8 e% ~6 J( K: T& w
    module pipeline(cout,sum,ina,inb,cin,clk);" W. Q' _! r! i1 H  }- K2 H
       
    ( U* |5 d7 t* `; G8 e    output [7:0] sum;
    ; [/ Z$ ]; H/ [( ], n    output cout;
    % j. d$ A- b+ T  h' l9 x    input [7:0] ina;
    ( t9 X  l9 A- u2 _    input [7:0] inb;( @. V$ W( r+ O& ]* _
        input cin,clk;
    ' L# l& H4 q2 ~0 v# Z2 c' b& M    reg [7:0] tempa,tempb,sum;( a. J2 s" \; A) {# Y: {4 B
        reg tempci,firstco,secondco,thirdco,cout;5 J2 k' a# u, K
        reg [1:0] firsts,thirda,thirdb;
    8 t; h0 R% p  {8 d8 Y, M    reg [3:0] seconda;3 B9 i6 Y! u- ^6 o$ h
        reg [3:0] secondb;* \2 a' Z( [4 F1 ~/ g" V
        reg [3:0] seconds;
    - z% W3 r" W! t! W$ P    reg [5:0] firsta,firstb,thirds;
    2 S0 |4 v! k$ ?& T  v/ Z( F    0 C0 F/ r9 u0 A! b- I$ h3 X0 ]
        always @(posedge clk)  
    3 G/ `3 k6 p: _- v$ {" {        begin: L2 i+ q) U, ]; }2 J/ V" S
                tempa=ina;" L! g- M! @" I; Q8 b7 E$ f4 ?
                tempb=inb;
    & p& M# b% L5 J- O6 K. B) N            tempci=cin;
    ; e0 D2 u! G8 f, X; L: C1 ?: D  Z* O        end               
    0 i+ b. C6 D8 {% y; O5 {    8 |$ s) v8 ]' E
        always @(posedge clk)  " L% z) j) i' @5 C! Q6 W- c
            begin
    - v: t- y  {4 k6 J            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    9 q/ {4 w$ q. b% }            firsta=tempa[7:2];( v6 [' r8 G4 f! J: y6 [
                firstb=tempb[7:2];
    7 ^& b2 C( k# E. Q        end      
    % R+ V; c* c* Z5 f   
    " [9 ^: m) R! I    always @(posedge clk)  ' {& Q0 m+ g! O4 e4 k9 d' @1 e# g
            begin
    # Q8 L' b3 |9 |, g7 v# b            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
    * s9 F7 r8 X3 a            seconda=firsta[5:2];! u! I  {0 ]( U+ D1 A0 A4 ~* z" p
                secondb=firstb[5:2];
    7 C& p  d1 Y6 ]; F9 _0 v" v  Y        end: h6 _+ R) B9 m2 v
       
    ) S7 c4 ~+ ]) l    always @(posedge clk)  
      ~% b# S! |) _9 ~$ t- V        begin 9 w. a$ {: L7 ~% h
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};6 Q1 }; A0 c" r* d  }
                thirda=seconda[3:2];
    9 x: S  e, X- q/ V$ F1 ~            thirdb=secondb[3:2];
    & U# |/ S1 V+ a2 T+ ]3 C        end/ }; @& n0 K# a3 }6 v) c# o
       
    3 c% Z5 u0 |, x5 e. I    always @(posedge clk)  
    . `- u; ]; Y3 n3 o1 K' f1 c' p        begin
    " I9 @4 e! G% m( [            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};+ f, _2 V9 K" N; e6 i( h
            end
    8 R/ O/ _- o( d+ A* S   
    6 @! m  A- ^$ m7 m( G' Cendmodule$ g7 |( o% k+ k6 s# k+ x5 _
    自己写了一个激励文件:/ X6 b) r# L8 g0 b. `
    `timescale 10ns / 1ns
    : {# a7 m0 F1 O7 Z( h0 lmodule pipeline_tb;1 u0 V; \1 K5 t8 H5 [
        4 M4 d' `# Z& z- b, u: N9 y; E/ A
       
    & @) @. ~, f/ A* F. I) R# p    //Internal signals declarations:! t& R. I6 S4 d5 w( p3 I
        wire cout;; g! R  f  w3 U1 O& m4 |
        wire [7:0]sum;
    6 g: [- w! F' |9 p$ v7 v" s    reg [7:0]ina;/ _6 r0 L% v) W; x3 Y
        reg [7:0]inb;
    / D/ T, |) G& p9 V$ o- O- K  S    reg cin;
    % J9 K8 b9 r+ ?. Q( x( ]    reg clk;
    2 W. f  B  _- f) x+ \7 m% x    parameter dely=10;
      S& n) r* X* q; X: t6 n/ E, i' _    " O: ~/ P8 W% J" J
       
    ; U7 l; I$ e! s    // Unit Under Test port map
    / S+ w& }) t. X    pipeline UUT (2 z% l2 G, z* R# n9 L8 u  a# _8 H
            .cout(cout),
    9 w8 u% ?$ i$ V0 l' w        .sum(sum),- h" R# `9 ?! B& W' g, O
            .ina(ina),6 g; p% p$ r! U. ~( S
            .inb(inb),0 ^/ E) i  ?0 U1 R# V) }, Z8 |4 {
            .cin(cin),
    9 R" z/ h9 R$ f. ?        .clk(clk));     
    - a4 g( v- ~, w1 @" q    ! T! s( `5 s+ G# b
        always #(dely/2)clk=~clk;    5 Y" J* O3 }  Q' G
       
    ' B$ m! V/ D0 [& y$ t7 X0 v    initial - T( E2 i7 [- |- r$ v& i
            begin
    : k0 [5 T  X7 p) `/ f% k9 a2 [1 T            clk=0;
    7 L; Z; M' ^* E! x            cin=0;
    4 ~* _) i) ?9 ?7 F/ X0 m            ina=8'b0;
    & k% h7 ^: R9 \' X4 O0 K            inb=8'b0;- ^$ B: q" f7 T6 M; l! y
                #(dely*1000)    $finish;+ Y! }1 |0 t& \4 u) ]' z5 S
            end      P- j5 T0 Q1 J; y" Z) w6 `
        4 \7 {2 m4 `7 Z" r# i: F
        always #(10*dely) cin=$random;
    0 u- s4 y% L. J0 J9 u  v    & @4 E; _; O6 a& Y3 F
        always #(10*dely) ina=$random;
    ( s% U% [% y, G. F, a# x* Y   
    7 I: ?, Z7 q1 w; y    always #(10*dely) inb=$random; " F1 l6 u& R6 `8 Q- N/ J( y. e
       
    ! ]+ h$ Z0 D( v- `0 A4 [9 ^    initial3 Y, Q- o' j" L5 |' n+ t& T# {
            $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
    / ~7 |4 i, F+ ^endmodule# T( {" \2 W7 p1 e$ J! E& l0 y0 d
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。7 u0 b: P) T5 \: @+ ?' Q7 _
    7 w0 D  o$ @' a: y( R3 d" Q# ]
    [ 本帖最后由 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 发表 6 u+ x1 M' ^! V, l# ^9 h
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。
    0 A- `* ]$ f9 F: }1 H+ t9 p3 g{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
      D4 r9 F! j3 I2 M! k0 B& E; B8 A. u" ^
    & C2 w0 C& S$ F5 k5 ?( p
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,1 o) @& F& e! a+ a

      n8 o8 A  r) t, s0 e2 H! R导致最高进位出现问题。% e+ s* d- j# A, A/ j

    , R: l7 Q& `9 N# w: E8 ~$ C8 V' x此属推断,待验证。。。
    - g7 Z  Z! V; B8 N/ V- X5 {9 d& N2 w5 q' A" a, J
    可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;9 q1 N9 H9 v' J$ |# X

    . G5 Z3 T/ K+ O3 P! Y再{thirdco,thirds}={second[2:0],seconds};
    , Z: L3 R2 M# L( b$ g ' }) d# p% C" t% \  p# S
    不过我这边现在没装这个工具软件。。。
    / O# j1 a3 a, B/ @

    % D; _# G; I$ Z1 w& q  |4 e: l7 v+ b
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    4 ]' A& f+ Z+ k& z9 o6 ?而且程序段可以作以下简化:
    5 h% h  H% Z. G; Q: l8 F. Y- s: E* d5 U  a+ S) L% X7 j3 _4 U

    1 }& |' H/ i* j, C; h9 ?reg [8:0]ins;
    ; y* P5 V% M( h; j
    6 U0 J3 h; k  I9 Calways @(posedge clk)  
    & X0 [6 i" U  G1 p9 H* K  begin
    9 Y3 Z. F) D5 L0 Y       tempa<=ina;
    ( X7 X$ Y/ s3 A5 t9 b9 z  x- @       tempb<=inb;2 D% r/ s( w! Y2 v0 j% B/ E. @/ ~
           tempci<=cin;
    / A7 i) ^9 N# y* Y5 J4 l% n* R: R   end               
      I+ s) \4 L3 }/ J1 K always @(posedge clk)  
    / d+ P1 p8 w- B begin . l5 C/ v$ R' d- x
           ins=tempa+tempb+tempc;      6 J% v0 x$ O5 r5 J
           {cout,sum}={ins};
    ' q5 K$ Z' r" y9 K$ S9 V. q end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 0 J6 L3 R* {  K! D- R8 f$ T( q7 C
    回去试了一下,确实如此。( }. q, S4 x# Q) V* r! ~+ {/ ^- w
    而且程序段可以作以下简化:' v# ^: q; @# Z$ Y" C

      G! i  T- }/ Y/ l- }, S5 Y( E% I3 ]* m& h4 P, Y
    reg [8:0]ins;
    ( Q$ m6 ?4 z( R6 |
    ! {% F) S3 O: g4 b& x$ C% Aalways @(posedge clk)    d$ ~2 j( P7 l5 b. k' L
      begin
    9 f, m' I* j" d7 t       tempa
    - ~  a7 z7 }! {8 m& |) m
    虽然没错% s7 J4 \* }& K8 n0 O  v) x
    这样的代码综合出来比流水线效率低
    % z( z* D: L6 S5 c综合出来用的器件也多哈6 f* U5 o6 k4 y; Q) E9 ]
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 ; F( D9 C# d) Z& K
    据猜测,程序可能有问题。: N6 b+ V! t# r5 ]- U& W2 M- ~
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB0 D* z! g# v. {+ K7 C2 _

    6 f  K8 T  k, l! s5 Z% p9 E& L; j5 W2 j2 m
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    * W/ z* m5 U" C' r+ u8 O2 x5 D8 ^9 c( P5 T( X
    导致最高进位出现问题 ...
      u- n& Y5 G# P! R
    这个问题我也注意到了7 @3 R, C4 z; n, \% m
    但问题在于为何第一也是这样的效果为何就有进位变化7 u/ d$ R  c' h
    而只有后面的两个有错误?
    6 O* Q7 e- C6 ~# r% h& `  g$ Z6 I5 V9 ~% v
    不知道是否与verilog语言本事有关系?3 X; Y4 Z  ], P( I( L/ Q
    3 H* V" t- Z* @7 h. o* U
    我自己试了试$ h% Y3 t) m5 T1 l3 E
    如何在加之前先把2位的值赋值给一个3位的值1 v4 h6 P7 a7 g6 J" ^; J: A6 d" A
    这样就能保证赋值间的位数一样0 j7 X3 y+ G4 _, P0 S; \7 R0 Y9 v
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
      K6 U* d. a5 D1 K$ ?. T- {6 y% t; S- ?3 @# l
    这个问题我也注意到了
    6 D9 V% b( n6 N* `; p: p但问题在于为何第一也是这样的效果为何就有进位变化
      s' ~  |4 }4 f; i' S- ~而只有后面的两个有错误?
    7 Y3 G4 X/ F. t
    ! i( z5 K( V0 J不知道是否与verilog语言本事有关系?
    * v9 C( b" G) C' J  Z% U
    6 V, j/ Z* {3 B& b/ ^) ^# @) P我自己试了试8 F4 k. X* D3 |) @
    如何在加之前先把2位的值赋值给一个3位的值
    * P# g! d  u/ j这样 ...

    " P- @9 X; t4 Q. K7 ~; J
    . @5 m" E- z# R  n2 U2 t* l/ ]3 g# r
    4 [& v) w) U4 M: B
    也可以说是verilog本身的原因吧,6 F( j) @& h& Y4 }
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    1 r1 M# m. C. i7 B# J4 T并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,; r- g& w7 T( Y6 M! r
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    ( u: G9 Y  P; u# ^) s: c本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。) k( i# h% F/ x( l& U
    一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表 7 C0 N' I5 o$ x" B( Z

    * B% e% j' Z$ I虽然没错- w6 L9 B2 p4 I7 I: h+ W
    这样的代码综合出来比流水线效率低7 U! s. `' k7 e9 l% l
    综合出来用的器件也多哈
    + z# X7 K( [" `5 g' |  ^7 L呵呵
    # |( J0 x/ H" g0 z5 j' K

    ; T+ \: M) h6 E$ y" `8 u- S# ~
    / l% g. `& C  H( d6 a呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表 3 W% h" Q" P: Z& n  W: Z2 C, g

    ' l' }, |2 x1 V) d
    1 A! B+ |7 R  u+ t9 m4 B6 t
    9 e0 c* g+ ~: w( I0 P呵呵,这个我倒没考虑过
    * p% ?1 `, G. ?8 X1 s4 b4 Z
    % ]% c9 ~. c. d% x8 E  ^9 O
    你可以参看一些教程里面的综合结果实例对比
    3 V  o4 R0 |7 U: A$ Y1 z. Q! W8 k% F' |* M" K. `  m
    代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-5-28 19:20 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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