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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器
    0 [! m& q! o! L7 Q从书上抄的一个例子:
    7 v* R, c- w+ C% h) b% h* n' F6 Kmodule pipeline(cout,sum,ina,inb,cin,clk);
    / Z3 j3 B( j4 q2 j+ V      w$ ~2 s0 Y. f( l( B, r
        output [7:0] sum;: a. s! m8 {: [! S5 V& p* g
        output cout;) Q3 b" F4 q) G; F5 n5 h3 H
        input [7:0] ina;0 v9 S* X- B$ [" Y# |2 J
        input [7:0] inb;* E) r1 g& P2 @
        input cin,clk;
    8 T7 E, p( n+ B2 ?# w+ }3 _: f    reg [7:0] tempa,tempb,sum;/ E$ e, S. i+ L& Y4 ?
        reg tempci,firstco,secondco,thirdco,cout;
    3 Y2 `9 `2 J, o    reg [1:0] firsts,thirda,thirdb;
    ( u: |! |6 ?$ o- J5 ?) q" r    reg [3:0] seconda;
    : Z. ?0 R5 I) [9 k. V  o0 ^/ f  n    reg [3:0] secondb;& `$ p1 z, a% Z) O
        reg [3:0] seconds;
    ; {4 K( f# g% X. g3 Z7 ?    reg [5:0] firsta,firstb,thirds;, Z' x8 i/ w3 s2 W6 X, l. C; v' r
        / i! M5 Z. n# y+ w& r/ y. T. ^) a
        always @(posedge clk)  : _9 K7 O) k/ C& _6 p
            begin/ F% Z  T$ E; L% p! f1 {, s: a
                tempa=ina;0 h3 z. ^* f% R. g# X% N) b
                tempb=inb;  y6 C( l" a0 S+ P; j
                tempci=cin;
    1 K& r: T/ O1 c6 a* v- {        end               
    5 b$ D" e- Y& X& j' A1 u6 `    # w# ^- l& b. ^  i  d
        always @(posedge clk)  
    3 b! u$ c) [8 U9 z        begin
    , X3 h% d4 k$ f            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    ' T4 ]7 m' O& E" x! Z( k            firsta=tempa[7:2];5 @5 d# i- e8 l' E0 w
                firstb=tempb[7:2];
    ' n4 ^7 N6 S5 |9 n" d- J% @: `, {        end      1 R3 ~# K- c, U. z$ L" t
        3 j& L! U. ^/ w/ Q9 N% d5 }
        always @(posedge clk)  
    3 b% J+ a; ?. Y% [4 s1 ]        begin
    ; r  p% K8 q9 d            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};5 M: _- D& w& H* [3 M- b; H" R
                seconda=firsta[5:2];
    ' J4 F0 F' k# Y+ a9 O" ?            secondb=firstb[5:2];
    , ~. |# L6 a; L3 g3 y2 L$ j        end
    ) _2 j2 y' A) y' Y! D   
    , u, f) X. h0 ?- u* c$ ^, B    always @(posedge clk)  
    ' A; k& d! V3 _5 ]% J) h9 V; B        begin
    + ^4 k) p3 q; s4 E7 I            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
    " J' ~8 e9 a# ^) E* t; g) }) U            thirda=seconda[3:2];
    1 p8 ~, ^: f& F* P0 e            thirdb=secondb[3:2];! n$ U: p9 N0 r& L0 N
            end
    * t, h: O& ?4 r; Q  _    1 [5 z' L3 o0 A* E
        always @(posedge clk)  , W) C2 K7 Z. u& \) N! l3 u5 k
            begin
    8 F0 ]$ P5 u$ V& I5 C            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
    - Y  K1 N& `$ [: L0 W6 w" l- {! S/ W        end
    3 }  Y* H, u$ D  O. {   
    ( b' G3 x3 G/ n* m- u3 K. Fendmodule4 }$ o$ M" W, P
    自己写了一个激励文件:
    - x: C' k4 j. ?* r`timescale 10ns / 1ns5 r0 c" a- G9 A! h& ?. l9 w
    module pipeline_tb;
    ) m+ L: w" U% j& p   
    6 s$ {/ Z. J4 r: U( ~' g    8 d6 w; N+ c. O
        //Internal signals declarations:
    2 A. U9 K1 m* `  o, t* e$ G- c- {6 A    wire cout;
    9 ^9 w4 |: v' Z0 s; f- v3 Z    wire [7:0]sum;
    8 w4 h  z4 j  k; D# ]! p    reg [7:0]ina;( P5 B& c0 p9 {* `
        reg [7:0]inb;$ E8 A6 @) W# o8 D2 r/ i
        reg cin;2 H0 W" N! i7 @  n
        reg clk;6 p5 m6 I1 l: |8 P* q4 [  M
        parameter dely=10;# q+ G/ m' d. q+ k. Y
        : c2 X, p; u) C, N& W
       
    / d& |+ _9 b% ]% B' O    // Unit Under Test port map% X/ L$ o! W8 G# r8 b4 Y9 o
        pipeline UUT (. x2 k$ q/ x$ D
            .cout(cout),3 O' ~; d& ]( g4 Y1 e
            .sum(sum),
    $ d3 K6 d! H1 Y+ m' `( O/ Z& i        .ina(ina),: D  M  @0 f! E( H6 I
            .inb(inb),& u+ i! A& i  z: f2 [* E
            .cin(cin),
    5 Q/ s2 |/ d, |  D# i4 F, [        .clk(clk));     
    " ?2 W8 B) l, X8 r* n% `1 c8 @   
    2 W* m/ H4 ]/ n. D, @    always #(dely/2)clk=~clk;    5 L5 d( R5 Y6 _) b; w
        + y/ `! J1 m* G4 X5 A2 m: r" C& h- H
        initial 7 F( b- g( v5 c+ C
            begin 2 R1 c3 E" b  ^& w9 _' {3 d  \
                clk=0;
    4 V# P9 \! S' _! P# ]( a            cin=0;3 |& j2 w* f/ b) F" g
                ina=8'b0;
    7 ^+ d4 _& W' R+ l( w            inb=8'b0;
    / ?/ H" I6 @( G            #(dely*1000)    $finish;, \# V; A3 @' p* R% N2 ~+ k
            end    2 y, {& }+ S. K/ I) I' ~
       
    6 b: c& \; t4 ~5 y2 E" t    always #(10*dely) cin=$random;
    * r$ Z0 }1 O; a. E9 I5 j: y   
    ) C! p  J" G1 F$ b, c    always #(10*dely) ina=$random;
    ; w) r8 T$ {7 N/ V$ x+ t: O    " g9 H7 Z/ b* J9 x; x2 b4 p
        always #(10*dely) inb=$random; # D" X/ k# R# d1 t+ k
        : p! x7 S/ O. `/ ^' E2 D# t% B& N
        initial
    . l' u2 D9 Y/ }/ P$ E$ d" P        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);- Y5 {' Z% p# P! W- X$ v; h9 v
    endmodule# a8 L4 y6 Q, N9 ~
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。5 @2 ?: i$ e' T' s9 P
    2 G3 f: _$ k7 `; c
    [ 本帖最后由 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 发表 ) j6 S/ T+ \' A) {7 a) H! k
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。
    ( l/ O9 F% b% r0 ?. T- o( `{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
    ( d& d* p3 N* Q
    3 a: B( V# i) }8 v' W2 Q5 i2 A& m5 |2 p8 M8 a/ {: X7 S
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,: x0 D' L6 B& S$ |

    , n4 O1 e! J& X$ V- g导致最高进位出现问题。
    + a( k; q; \- V& _6 n6 q2 ^% G  v4 W6 S0 D
    此属推断,待验证。。。% q4 d$ F0 ?3 K' [1 y5 V& Q

    2 g% f$ x; t3 H' @7 Z可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    , Y5 P# ^+ i/ J1 w$ }; A  a5 x4 H
    再{thirdco,thirds}={second[2:0],seconds};
    ! e( ?0 H1 i- E9 r ' J0 o7 f8 P, K0 H
    不过我这边现在没装这个工具软件。。。
    6 o+ `& x; M9 u1 {- |

    " `; v' D/ H* ?5 G; u& E( d2 u9 ~* g2 R* T8 S
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    1 W8 ?! M/ ~+ R0 ~而且程序段可以作以下简化:( _  _3 H" ~% V

    / P: F3 e# G. k5 K& b& y* E5 z
    ; F" T1 I. S7 W6 j% ?6 h; rreg [8:0]ins;) ]' a3 \* F: O3 b! N  \

      Y" q5 z0 g- ^/ w% x( I" M/ w5 u/ ualways @(posedge clk)  
    1 ?, I5 V) h+ b8 }- N  begin
    ! Q0 g! V, l* G, U       tempa<=ina;
    # \" I0 |7 R4 h6 N  a5 O$ X       tempb<=inb;
    ; G; Y) a6 I1 f1 y; J       tempci<=cin;2 h/ w8 n: e- p( e( N4 ~
       end               
    % A8 P  D, h7 D  \0 t& k2 U- r always @(posedge clk)  
    % v5 y9 k% D* @/ d$ I) h# v begin
    , d  s; o  j6 v" L& J* J       ins=tempa+tempb+tempc;      # E" c+ z" J" H/ N! W
           {cout,sum}={ins};  u) x: a' b: E9 F/ N
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 6 t. G; _3 @+ a" n" S
    回去试了一下,确实如此。; e! D2 e; a5 r7 K' C8 `9 s
    而且程序段可以作以下简化:
    % P5 ]! ^& z% O& z
    ! N/ ]/ Y5 R7 u; }6 }3 [' [
    8 a* M( [4 ~: f$ _7 U& G, @reg [8:0]ins;
    . {/ w& x) {. U* e1 l1 K6 ?# c$ w% a7 P7 ]2 [
    always @(posedge clk)  . q3 ?" o: ^5 g: h
      begin
    % S2 I$ B2 B; M6 U3 w       tempa
    2 z# o' \. v3 O& l% p2 i; V/ W5 b) S
    虽然没错
    : W( A$ T# l! A7 W0 y这样的代码综合出来比流水线效率低! a, b3 w$ V- c: j5 O
    综合出来用的器件也多哈' H* X* X- x" @0 o. R5 ]  S
    呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表 % c( W* z! ]( A1 T3 c/ M( U: C
    据猜测,程序可能有问题。
    9 _2 k% _. y( d9 u9 A3 S* W7 q1 J' p{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB' s3 p) [) S" Q6 f

    ; i; x) @: J" U/ s0 E( _
    5 _) y' t* F7 R  n* j! V其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,: O+ j; Z3 _# K* S9 G* [  t
    . Q( V+ z. L' W! e$ i
    导致最高进位出现问题 ...

    ) q/ j/ g$ u, B4 E: M3 H% E这个问题我也注意到了: v. B# L4 e8 M: T1 O' K
    但问题在于为何第一也是这样的效果为何就有进位变化0 X5 `; p% H8 q; p/ r
    而只有后面的两个有错误?
    $ @( n4 H; a8 j. S' i
    6 ]9 U0 j; @7 k$ H不知道是否与verilog语言本事有关系?
    * L! ~+ C  `! f$ n* h) N6 {8 [" Q4 K4 j3 n$ u2 y
    我自己试了试8 w0 \2 X$ C/ c8 }+ B5 n' y: b
    如何在加之前先把2位的值赋值给一个3位的值
    3 w# D" v; p, r' G; }! R, S这样就能保证赋值间的位数一样
    7 L, V( k% N$ E1 o这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表   v5 q  E) b1 R; o3 W5 W* p2 c$ i

    ( U+ {: j7 X# \0 [: Q这个问题我也注意到了: A  z3 O" n) E$ D- _: a1 _
    但问题在于为何第一也是这样的效果为何就有进位变化" t7 C# V3 `: ~/ F* a! o9 R: C' }
    而只有后面的两个有错误?: u. q9 P4 G! r, v8 b
    & N! P$ o% ]& Y3 I: W$ h
    不知道是否与verilog语言本事有关系?
    & L6 I* |+ m. h3 v7 X5 ]( V; u( A  L! [) J
    我自己试了试; z/ ]- h9 N* k8 I6 x
    如何在加之前先把2位的值赋值给一个3位的值
    % @: o8 m, J5 T' o% p" r* I, \- n6 s这样 ...
    ' Z7 n/ a3 E! Z; W7 i7 k! b- j$ w

    ; |- p- w2 X" W* y. ?( m# H, K# A, b5 I8 k% _

    8 I8 R* m: K2 p. ~" s2 e也可以说是verilog本身的原因吧,
    ) L1 k3 G! m$ S0 L7 M因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
    ; @2 F: C4 w5 Z并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,$ r% T& A: O0 k- X0 f
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。6 y8 C0 x1 k& ~/ _
    本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。$ \0 x  _1 y8 O; w2 d) f
    一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    # k* ~2 P2 C' S; `2 T
    ; Z6 J7 b. y+ q虽然没错. `5 F( U/ Y! w; r4 Z# b
    这样的代码综合出来比流水线效率低
    3 A! F5 {: N# b8 p4 m- D综合出来用的器件也多哈( K# _* v9 s7 J; B2 U0 k
    呵呵

    * v2 C6 z4 e$ S: o2 Y# V" h& v* ^- i* H3 \$ K! R; |

    ' `, r2 }) N* b7 w3 L呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    - z# u* w" Q) B# O& c" q$ y3 Q
    % r8 T2 Q- x3 u5 Z" U
    : {$ Q; O# [% Y4 }, [% L  j2 a& @/ z6 @
    呵呵,这个我倒没考虑过
    4 l* g  ^2 _$ k9 a
    1 k# v% X) `' g0 X% Y; W
    你可以参看一些教程里面的综合结果实例对比
    # L! I1 f% `* f  Y- W& X7 x# y% f7 }9 V7 |. u) B: m* _
    代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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