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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器! S7 F, }/ C9 y. c: g( U% _& K' k. A
    从书上抄的一个例子:5 D7 @+ J) _& d  s: A( x0 A7 U
    module pipeline(cout,sum,ina,inb,cin,clk);% G8 |* Z% ^9 J1 n
        - Q( G4 g* A' r# \, K2 b0 h3 o& O
        output [7:0] sum;* L0 E$ X1 ]$ _4 j/ y' H3 Z* l7 A
        output cout;
    4 R! d; q: [; q) [    input [7:0] ina;$ P4 o1 J/ Q1 P8 l* H
        input [7:0] inb;
    ( }. o: N/ D! u3 j1 `- w    input cin,clk;
    - a. T( M$ [4 {0 ~; T    reg [7:0] tempa,tempb,sum;. |2 s& i% K: r4 f- R" ^
        reg tempci,firstco,secondco,thirdco,cout;
      w9 ~+ x9 x- A( g1 \1 m    reg [1:0] firsts,thirda,thirdb;
    9 ^: S+ w% }! C& ?! }    reg [3:0] seconda;2 H8 j" m6 Y6 u  o- u, d' d$ \9 w
        reg [3:0] secondb;/ O" _8 V# s' Q: C) T& D$ S
        reg [3:0] seconds;
    9 N5 J: q' k- I    reg [5:0] firsta,firstb,thirds;
    / ^7 N# E- G% v   
    ; i$ a7 ]& t/ l4 }9 @  A6 S* n    always @(posedge clk)  5 j6 K' b8 e( v2 y: l1 n
            begin8 |& I$ t' }0 ]0 M* Y
                tempa=ina;
    ! A) K  V7 W5 X: ?( h1 u# _' z' `: F3 _            tempb=inb;
    8 r! M2 v. q- [5 b9 ^" Z            tempci=cin;
    2 ~% W5 u$ J8 ?  b        end               + O. d* L1 ~9 G$ O; T0 c
        % _; B) Y* k# f
        always @(posedge clk)  
    ; u8 j* y9 x* ?& d        begin
    ' H  K2 Z( v/ Y( Q+ y            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;, r& b  m" C3 j3 Q! L. s
                firsta=tempa[7:2];
    : R" _8 G% y1 v% {            firstb=tempb[7:2];- G) b, f4 V, e7 f
            end      
    ' w( D4 E- A5 H" a3 q! S1 r- C   
    ; j' D! a$ x7 G! V* z2 U    always @(posedge clk)  3 x! Y- g6 M7 d4 h! @& @6 ]0 \  _
            begin; r# j1 ?" ?" Q# e. W6 V$ E. J
                {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};9 i: P/ n* |: F6 F( c; j& F
                seconda=firsta[5:2];$ X; t- D! g+ V0 c
                secondb=firstb[5:2];
    & a4 F% W! G3 \        end! L: f: Q0 O: F$ O. H
        ! c2 P! `& p1 u0 c% L& u% ^
        always @(posedge clk)  
    & a+ {7 f1 o( U7 Q/ w        begin 5 u6 N/ ~' m0 r
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};. F8 y2 o1 h! v( `7 q0 |9 B. w
                thirda=seconda[3:2];4 o) D8 Q) [. D  n2 w
                thirdb=secondb[3:2];
    ) O9 I8 o3 N- ^" k0 t+ p3 S( J1 z        end# w  c6 C4 ]. _
       
    " I+ X" J4 t5 T2 [0 v% b# t    always @(posedge clk)  
    2 P) b  W. g6 A/ C8 P! S. P        begin : x/ J% ^4 j( Z5 |
                {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};' D- y0 O5 p8 Z5 |8 _
            end
    , ]3 n! C7 ^/ s   
    5 c: f( C4 Q% a7 w" |  fendmodule
    ( c7 u9 `+ }* R" N% m自己写了一个激励文件:
    9 e7 B( a' e9 v; }6 K' e`timescale 10ns / 1ns7 v9 a" g, ^$ c( q$ x7 U$ n
    module pipeline_tb;; u- e% N+ ]- W7 t4 Z
       
    5 O' O- @/ b* D    : B2 Z6 Z9 T! {1 h; |) m
        //Internal signals declarations:7 y: m6 ]0 R5 l+ g
        wire cout;, e! E. g& P! k' o3 q' R( c' N
        wire [7:0]sum;
    % H1 o; }5 ?' O    reg [7:0]ina;
    ) [; A& R, s6 x/ K( l    reg [7:0]inb;
    6 H' d( R" U4 b+ S# e0 x+ h    reg cin;
    ! R" O5 I" w8 a    reg clk;+ X; j8 F6 B$ y9 m% S
        parameter dely=10;( K# k8 W1 o* `9 _, D; z
       
    ' Z* ]( S: ]; M& c" Y# R    3 t! G* d' N! R" M# G+ C$ R
        // Unit Under Test port map
    $ R  q$ v% n- Z" g    pipeline UUT (
      M. B* J5 P/ t7 n7 y        .cout(cout),) L5 W; d# i) \- E& M5 G; D$ f
            .sum(sum),1 f6 v  a1 ?- m8 V' I
            .ina(ina),, f7 `# I1 O( }- s0 c& o- P! c
            .inb(inb),
    + _, T0 r% s  [2 t        .cin(cin),5 h' I2 ]- _1 r9 b2 L
            .clk(clk));     
    & d( c& k8 \3 ]3 a! w" D/ @2 @8 l    : W: Z+ q: u8 q3 Q9 I2 A
        always #(dely/2)clk=~clk;    8 \& w, z% e6 Q$ S) Q) l
        * H4 @) }' J" A( i( d9 e
        initial
    ; ]% t+ F' \9 K! |        begin 8 Z1 J# \' l2 e+ c7 S9 V
                clk=0;5 x/ m$ d6 C8 ~( Q; q
                cin=0;' n2 R* Z& ?. @* o- y# `2 r& v
                ina=8'b0;/ K( z+ M2 M- f9 @
                inb=8'b0;
    ) k5 Q) M  J5 R            #(dely*1000)    $finish;& _/ P( q8 b& I7 u4 X
            end    3 k- B  ]) F( N. q( {
        + l  x; _0 M4 p! R: q) E
        always #(10*dely) cin=$random;
    8 \4 a5 o; p- L0 |  b9 J& Y    6 l2 ~. x  Q) B' W$ ^# g' d7 k
        always #(10*dely) ina=$random;
    ' N2 I8 H, g7 g; A% t0 w4 L   
    1 P6 t, r# i/ {% `! y8 t    always #(10*dely) inb=$random;
    # U! q7 x. [/ o    4 A) }% M9 P2 o$ m
        initial* O7 v  |7 O) \8 U: k* n6 o4 X" h
            $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);0 r) P  b( z! [, @* y' J4 r
    endmodule7 q) B: I" s2 f' \8 P2 y9 z
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。' [: i* X3 V: e3 G0 S; Y
    2 p9 z- i4 B2 e" E/ w" x) d
    [ 本帖最后由 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 发表
    $ V4 i* k/ {. \/ ~就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。
    & J- {" o1 A" U+ i* Z' n; d{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
    9 _# p9 ~* [  g& ]$ a4 y6 T- U$ L1 q4 e5 f5 g; B  |7 r3 M; P; v  c$ L+ r

    9 g; |& ~4 D4 |# K5 I( x其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    $ O; c- D; k. y+ ~$ p) X" G- p0 X% R5 {
    7 a( V6 m$ Q9 ^& r) O8 E导致最高进位出现问题。
    % E6 ]3 o) T- G0 A' q' R
    . k5 o4 u9 C5 P8 ~2 M此属推断,待验证。。。8 H! B( d' \6 O* Y1 {4 Z' I6 j) n

    % t/ N5 P+ v# I7 L- p  K可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    1 R# u( }8 ?8 }! t- |3 s# o
    0 {( N1 \* b9 Z6 S再{thirdco,thirds}={second[2:0],seconds};
    ! M) y0 z' I* _/ f) Y' U
    2 a. c, }; J2 B! n9 R不过我这边现在没装这个工具软件。。。
    $ j6 C$ ^+ W) y4 X2 w) k; A& g

    5 w5 `: v' o2 J5 g5 O* E# b4 L! |8 S; b) f, P: e0 k
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    * Q2 s  Y5 v, b' P0 d! H/ s( v而且程序段可以作以下简化:8 K2 S# F  H  b; P1 W
    3 C0 a  }- h. B4 R2 E1 o8 @& c6 ]
    / ~  H/ O/ `, O- `' t
    reg [8:0]ins;
    7 h5 O* c4 M  ?8 |/ a8 q5 |  M1 c3 _0 g3 T2 r
    always @(posedge clk)  6 r1 X+ l. z# x8 ^
      begin
    , h% S6 i1 f) X/ X9 W, V# |* \       tempa<=ina;
    3 r6 W, g6 z2 f       tempb<=inb;! y) @) N) A' O+ [* H
           tempci<=cin;
    ! f+ w6 O+ R! P; \1 z% z8 c$ A! N   end               8 \5 q) F+ _9 n! `4 M
    always @(posedge clk)  ' I+ o% @" o* X  N9 a7 c" f
    begin
      c0 P( Z  ]9 P& M- b( T. ?' t       ins=tempa+tempb+tempc;      
    & U$ g6 a! c/ Y' n, r% B       {cout,sum}={ins};. T7 X3 L* f6 x! R
    end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 4 q8 I, H& e& J2 D1 L' s4 f
    回去试了一下,确实如此。/ s4 a; H* ?3 a; X5 P8 q9 [9 P0 f7 I
    而且程序段可以作以下简化:! U+ b+ l9 t2 @. {2 M

    8 j9 `7 ^2 _/ k; D& g: K- h# Q' a* x2 @, L5 {
    reg [8:0]ins;
    % Y+ X- U0 y) u/ Q! i) ]
      A  \4 r8 w! o) B, ?always @(posedge clk)  % H$ |  \7 g9 C; {# N) m# m5 Y
      begin
    ( Y0 E) X" j. {7 ?% U, p       tempa
    $ c& I' K* J0 A6 @& G4 F- E
    虽然没错
    7 s# J% g# n5 e这样的代码综合出来比流水线效率低
    - [6 [$ z9 g9 G6 q% ?综合出来用的器件也多哈
    3 |4 q% c, e$ f% Y3 {" n; f呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表
    ' l/ d' P! D. D" G据猜测,程序可能有问题。* x( S5 ~! J" \" ^
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB/ x, [, d) u9 r+ L$ F
    ( j9 }  j8 y% a- z8 a2 _! N* @0 \/ {
    : q5 t5 |3 C1 S6 v; j4 n
    其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,1 F, {+ p& Z" k! ?0 z5 W
      n& N9 ]9 H' L# ^, K& L' f
    导致最高进位出现问题 ...

    6 g; A* h$ \* G% ]9 U. E  m% y* H这个问题我也注意到了; ^, X* V: Y! c& v7 q: T
    但问题在于为何第一也是这样的效果为何就有进位变化" F$ |" W% R. L0 A7 u+ l0 Q( W
    而只有后面的两个有错误?" Y2 f0 s0 I; ]' E* j

    * V; g* J( i' X0 g8 ^9 L: b不知道是否与verilog语言本事有关系?
    . m( }8 |8 J' L: l7 [' T, ?8 L1 h0 `/ M' @
    我自己试了试
    $ ^1 q* r/ I" y: ^  E如何在加之前先把2位的值赋值给一个3位的值, ]# d# S$ Q2 |# J9 t1 {
    这样就能保证赋值间的位数一样; Q; m9 }) r( Y" u, C# R4 a. L  I
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
    " g' r! S& @4 J6 Q* Q5 O5 V/ {" J4 n' [. J  g/ g
    这个问题我也注意到了
    : T4 @0 [7 N7 k+ \, E0 X1 P但问题在于为何第一也是这样的效果为何就有进位变化. k7 Z% A$ ^6 K+ ]# |, y+ b) Z
    而只有后面的两个有错误?
    + ~: F2 A& m; Y  N; B$ Y/ U/ N4 y% M6 N( h/ y
    不知道是否与verilog语言本事有关系?; N9 k% K0 [; u$ [+ `% N
    ; i% ^& U; b$ @! n- T
    我自己试了试
    4 k4 z3 t7 q* T; T6 U# O- a  B+ I如何在加之前先把2位的值赋值给一个3位的值
    $ ^8 a1 X9 \' s9 J  _. B. B& @这样 ...

    ) V3 O6 \/ k1 C: X
    # d& Q2 j9 x  S+ _4 E
    / P. }- |- L# h( q% w4 P
    5 E8 ^: _* ?$ Z% U也可以说是verilog本身的原因吧,
    % q6 a# K0 x: ^6 B, h3 i' i因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}7 G3 B" g: n# T- j( A/ \
    并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,4 n! T) E( ~; U4 @
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。: C% a. G3 X7 l( j: f1 i5 Y
    本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    * Z+ _1 |! t8 X2 `, d一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    7 L. g& {6 e/ n$ F1 t4 d5 r: d" P( a8 k8 C( @3 c. C! G
    虽然没错# _: A  v9 e- H( p
    这样的代码综合出来比流水线效率低
    ) C& w3 d; p. L4 {7 g综合出来用的器件也多哈' J  s5 a& m+ O, w2 d3 E! \
    呵呵

    8 l0 O. g4 O! Z8 C3 m( A1 w
    / X$ g" G# X- e4 L
    5 v' B3 Z: R9 |0 J7 d" v呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表 $ }0 t; j+ j( c! {2 i9 D& M. T  n
    ! p/ y* K" g. b. c( A) h1 l1 R
    5 C# E  \5 O$ K' W% _# E; E% Z
    ( Q; R1 c( }: K
    呵呵,这个我倒没考虑过

    % l- l# K8 Z7 R$ P+ P8 d* D- J
    3 \/ x" G1 ~0 u5 B3 p* x9 }) n你可以参看一些教程里面的综合结果实例对比  W3 ^! r8 l( t( {" m$ ?
    $ X* f, U, z6 X% F. x) L
    代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-1 04:18 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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