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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    是一个关于流水线方式实现的8位全加器/ Y- R: B, R) I2 f
    从书上抄的一个例子:( l9 o+ \+ s! M0 D
    module pipeline(cout,sum,ina,inb,cin,clk);
    1 w& ?3 L- [' h/ e   
    , O; G  t0 D. _+ _; @- {, U    output [7:0] sum;: T1 m% ~9 p  M, a. v( j5 _# J
        output cout;
    1 r1 q; l6 S! K4 _' t5 s6 T! l    input [7:0] ina;; H' X, d& T+ {) N2 b( b; g
        input [7:0] inb;
    3 P& c/ a. a' q9 y8 W' R# v+ ~    input cin,clk;
    . ^# X  ], x( Y  i    reg [7:0] tempa,tempb,sum;
    ( W. x1 z( _: j! ^! t! z( A    reg tempci,firstco,secondco,thirdco,cout;
    1 {0 |# @. T9 g. Q2 o8 r% i    reg [1:0] firsts,thirda,thirdb;* O# n8 }1 L6 M
        reg [3:0] seconda;) ?/ E5 Y9 C9 O( B% ~: G, R
        reg [3:0] secondb;
    # y0 U# y+ k1 Z1 i    reg [3:0] seconds;
    ' n) F# m2 Y! E/ ~8 r7 C    reg [5:0] firsta,firstb,thirds;+ U/ z* B1 [. H, L
        & @& O' F2 L+ J2 J5 w% G3 I# O1 W
        always @(posedge clk)  
      i7 d; H/ [7 T: ^: _5 F7 i        begin! r0 S& _) g: B! ]& m+ k: U" ?, I
                tempa=ina;- q8 B/ P% s( a6 o; I  e
                tempb=inb;
    - P9 W9 u9 D) t8 \            tempci=cin;) p( h9 g7 N3 L1 n+ q+ b
            end               ; ?6 p2 w; O( I) d( z
       
    - r' ], o0 N; F) |. D1 c7 x    always @(posedge clk)  / {% k' x: e, a- s- ?
            begin
    . R& M' J3 X8 V: B9 Y            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
    5 o, M* R; u) \; k            firsta=tempa[7:2];
    9 Q! O% W/ W2 w  c# J- {            firstb=tempb[7:2];; G3 q! v7 J& ?8 S4 Q- f' ]  |
            end      6 G* I, U2 {$ F& u" y
        , u0 P2 ]2 C  f+ \! J% ?* @5 E
        always @(posedge clk)  9 ^/ @% s9 _* W4 ?5 N
            begin
    5 n$ H2 ]9 u) U' ^8 v4 z            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};2 [# |4 R- c0 \1 l  H7 S- a% h
                seconda=firsta[5:2];' Z, o6 B* W! R; b& t
                secondb=firstb[5:2];! e0 i3 r. `! y+ |/ P
            end
      O+ C9 R: C0 }6 D9 ]- c: B5 F, B   
    5 P4 }7 z( K( y& b$ |5 k    always @(posedge clk)  
    ( A# P* P  Y- F! R7 f% n        begin 4 C) P* I1 O: {
                {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
    8 I6 i" L1 g) U1 p0 A* i            thirda=seconda[3:2];
    0 b/ M5 Q* V, q# W4 I& |            thirdb=secondb[3:2];' g6 p: n; h/ H* H" V
            end. Q. X7 p; P  Q+ T6 ]5 b% N$ t
       
    ( s2 `7 r& m: Z% ?1 a- v& |    always @(posedge clk)  $ I% A+ q" g5 d5 j% h! x4 J3 s, J
            begin
    - \. W$ F, v6 l- w5 _1 E            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};. D: `0 y. Y( A- O) X
            end
    - O5 T- C+ e* m. C4 z. D    3 v% [, w+ h  u6 ]- m
    endmodule) H; ]% S2 S' V
    自己写了一个激励文件:/ _- c: \$ A$ l; K  i
    `timescale 10ns / 1ns
    * ?: c7 J3 q" R  u, G, R; N/ Hmodule pipeline_tb;' m5 S" i* B2 l) z- U
       
    9 _" i4 S% I" y, c1 |   
    . R7 F! E4 S) m2 B8 z7 ~    //Internal signals declarations:2 S  F4 U0 Z! O" o/ B+ K
        wire cout;& p3 G0 b9 P: k
        wire [7:0]sum;+ ]6 ?* B+ ]! W+ X" r& M$ F
        reg [7:0]ina;
    ' P+ h9 S3 i8 @# ^0 i7 Y9 V- g    reg [7:0]inb;
    6 w  W- f7 F7 t+ V3 E% `    reg cin;! t3 j  {) ^8 t" X4 p$ u2 n
        reg clk;: c: L* w: p4 A- W* v0 U: X3 |
        parameter dely=10;
    ( n# n0 k: _( E' |- o    5 \7 z8 c: H4 M$ J4 t
        8 D; o9 n8 o  h1 z( }* ^1 g
        // Unit Under Test port map+ t& P, c; I* ~9 S% ]
        pipeline UUT (
    & @- G+ K9 W6 Y" j        .cout(cout),
    ' A! _! [# x' |6 Q. C        .sum(sum),
    & \) P. l2 _5 Q! p6 d; |$ J        .ina(ina),  m& Y  H: i6 T$ c. n. z
            .inb(inb),
    ) C( c5 p# L" G6 F        .cin(cin),; B- \! z9 {- q& x: W
            .clk(clk));     
      b+ a% n  {3 U* ~! y' p, O7 Y   
    . k8 s9 R# r8 A& `    always #(dely/2)clk=~clk;    * Y3 G' k% b# R/ N+ @" O
        ( v' C9 R2 s+ w
        initial
    4 x: x8 T9 t+ {9 o        begin
    8 R; f$ i2 A/ }" `2 e            clk=0;. B* V. ^4 X+ J% F* P$ V
                cin=0;7 H4 g" k1 v8 O: Q% U) l
                ina=8'b0;
    ( u* A- y$ H% p% _; ^            inb=8'b0;4 R+ ^$ T8 G- N+ F+ T4 K
                #(dely*1000)    $finish;
    , F/ x) w/ O" K/ a3 @: t        end    * o9 [6 a) G& h5 d3 g+ U
        ( l, b1 t3 z9 K2 ^+ V% l! Q& @
        always #(10*dely) cin=$random;
    8 ~7 ~6 h/ }2 ^, N% B4 S   
    : }. \9 y: e7 z; R' s    always #(10*dely) ina=$random;
    2 ?5 {& I+ T9 G6 m    5 c2 C( |7 s( _5 p/ ]* d
        always #(10*dely) inb=$random;
    & J" F5 k: K' C7 G    : y* `+ d4 m" H$ L# Q
        initial
    1 [4 \  a5 O7 {, w: A        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);$ C: x  r) Z* |3 b  _2 N- ^
    endmodule$ Z$ `( X% q  o4 {9 h7 B5 e
    但是仿真出来的波形明显不对啊

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

    Snap1.jpg

    该用户从未签到

    2#
    发表于 2007-11-22 13:28 | 只看该作者
    就是中间那组数据有一位算错了。估计是连续进位的问题。; q1 D: W: i% b3 b4 r& M

    $ X5 z9 O: \# l/ g2 R[ 本帖最后由 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 发表 % j0 j: h: M, o& U4 T
    就是中间那组数据有一位算错了。估计是连续进位的问题。
    问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

    该用户从未签到

    4#
    发表于 2007-11-23 12:28 | 只看该作者
    据猜测,程序可能有问题。
    4 ]3 g: a: R/ M: z, b7 o3 r{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
    7 P2 {! g0 B6 U  d# B4 J5 [" y
    & Y$ W8 G' W* X
    ) I: D0 A: t4 Q7 r3 D- }其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    * n: [4 w# E5 O: Q6 P+ G" s5 B, g& ]6 E# V& Y
    导致最高进位出现问题。6 Q; n7 j9 ^! N

    5 C: y0 z, V! x- I% @/ x; N4 k此属推断,待验证。。。
    # P4 y+ \5 Y# s5 I- a# s/ q: Y5 ]( \- c
    / Z1 o7 {, d4 a! w可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
    , T2 G9 K' \: B) v5 {2 r% O+ ?8 E1 u+ ~6 q0 U( ^- w" M
    再{thirdco,thirds}={second[2:0],seconds};" @' H+ K7 p/ p" Y. u

    . n) p! B* j1 B不过我这边现在没装这个工具软件。。。/ h+ Y$ m; ~9 C) I
    2 Y. p: j2 [0 o, Z2 `
    / \2 }( R2 y+ y/ K( ?! A# j7 Z
    [ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

    该用户从未签到

    5#
    发表于 2007-11-24 11:54 | 只看该作者
    回去试了一下,确实如此。
    0 k; E$ T* t  Z$ z0 j% T. S而且程序段可以作以下简化:. q0 ]+ b5 `! |% Q$ H* ]
    / M* V) K% d8 ^7 ]! ^
    7 Q$ r1 D3 B. s8 N2 u# ^
    reg [8:0]ins;
    9 t/ {4 d- n1 a3 W8 p8 m
    4 E2 b5 i3 j6 p  f, jalways @(posedge clk)  1 Z, x( w7 _  s7 h) I
      begin8 h5 v# T/ z7 _/ D4 `5 [8 ~
           tempa<=ina;
    2 g9 v3 S  r+ f; P& H       tempb<=inb;
    4 i9 {. Z" e2 L" O( l       tempci<=cin;
    3 S' d& S7 w2 W   end               ' Q, C) x) H5 t, F
    always @(posedge clk)  7 W/ A2 j7 b$ C+ Z) I
    begin
    ; U! q1 N8 \4 e( \+ G; Q. d" T       ins=tempa+tempb+tempc;      8 J2 w2 \% U. H) ?9 L% h0 o
           {cout,sum}={ins};
    + y6 F# o5 a/ W- E, a end
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2007-11-24 21:22 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 11:54 发表 " C; }" |7 P0 i$ T% a* ]% a' @
    回去试了一下,确实如此。: J9 S0 D2 P6 n
    而且程序段可以作以下简化:4 `5 |% N! f5 T7 V/ A

    ! Q+ C& W* R" E) @0 C! a2 p) L
    8 e5 H0 J1 B2 areg [8:0]ins;
    ) L" p! E) O* E9 j; o
    ! K8 T! t5 h8 ]7 c/ v. O/ @always @(posedge clk)  
    - B. }" v0 N1 x) M- l  begin' x& K) @% A+ H% s$ J
           tempa
    . Y5 c) c5 W3 R, i8 c7 Y" U
    虽然没错
    # @8 d' S8 N9 J& J% n2 x这样的代码综合出来比流水线效率低* q3 v  K2 u* c! k! V; `
    综合出来用的器件也多哈
    9 U' i" {! D. t- o呵呵
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2007-11-24 21:25 | 只看该作者
    原帖由 langhuamin 于 2007-11-23 12:28 发表
    0 J4 Q, `" X0 J" o3 h3 G- B据猜测,程序可能有问题。9 ~0 ?5 E' N! z4 }2 d8 y
    {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB
    ) S# N2 N/ U! N& d1 x% t
    9 W6 K/ x9 t: W6 t7 C. p
    : Y  u/ ^/ g: S" P其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
    ; j% Q; G7 X# L1 w- c
    3 G3 M. N1 M1 v3 _导致最高进位出现问题 ...

    2 @' N( x3 J' B- [& H这个问题我也注意到了+ z1 G  U6 u2 V& m3 Y& X
    但问题在于为何第一也是这样的效果为何就有进位变化% i# x% b7 }/ `+ U
    而只有后面的两个有错误?
    - C( ]9 V3 S' l- f& F/ l
    : r& v1 h8 o& S4 ?8 Y不知道是否与verilog语言本事有关系?
    3 r# {4 t8 n0 j% l* t3 f
    % G. }8 ]% q1 g- D0 V* n, `我自己试了试
    1 w/ M9 Q. b7 E& A; p$ D. Z  ~如何在加之前先把2位的值赋值给一个3位的值
    * p3 n# J3 ~5 {! q. }这样就能保证赋值间的位数一样( {  e; n  G: Q8 [7 l. ?8 ]$ Q" F
    这样进位的值就不会丢失了

    该用户从未签到

    8#
    发表于 2007-11-24 22:05 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:25 发表
    / R7 R2 p# [6 I- v1 W$ R
    3 X3 m: ~1 @5 \) P# ~( X# }这个问题我也注意到了0 B+ ?+ m0 ]$ g' O8 o
    但问题在于为何第一也是这样的效果为何就有进位变化* E. l% t  b$ P: b9 S. _" ~
    而只有后面的两个有错误?* ^* }- x& g/ k0 `- M
    ! \4 b' D& `& O  n- `: C; g+ Y
    不知道是否与verilog语言本事有关系?9 N' k- b/ `$ T7 F, v1 e% \( y

    6 o7 S0 V& b9 z我自己试了试/ \9 I  K0 T: ?# d
    如何在加之前先把2位的值赋值给一个3位的值
    ; }, a0 t1 M, A+ ~. W这样 ...
    ) B; n/ s/ K  ^6 O/ K

    * J. Q* a2 c4 [  F! F1 B0 z3 N; x& x7 ~# K; E5 w) h" \8 k
    5 g: A6 r9 ?' W  T
    也可以说是verilog本身的原因吧,; V& g3 Q5 {! Y' E- V
    因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}. \' `9 I8 m& `0 O" S
    并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,2 D0 O$ J2 Z5 `  m: V
    这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
    : ]$ [8 k4 r# q. u: l# Q  D8 C本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。
    + `& G' d3 u/ @* G8 U一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

    该用户从未签到

    9#
    发表于 2007-11-24 22:09 | 只看该作者
    原帖由 mengzhuhao 于 2007-11-24 21:22 发表
    1 ?! p% h# ]. X% [* q
    - h7 v5 {, M$ W: c$ b  D% o( {虽然没错4 [; w" q. d  t2 g$ ]: n
    这样的代码综合出来比流水线效率低# ~; n9 O. p/ }/ d) U: N, R3 _' u0 |
    综合出来用的器件也多哈% F8 s) X: U) x& {5 ^( l
    呵呵

    * |: _6 W* d  {  |8 B
    ' J% r: ~4 N( D: k* P0 ]
    2 W9 d" C0 a$ R3 Y呵呵,这个我倒没考虑过
  • TA的每日心情
    擦汗
    2020-1-14 15:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2007-11-25 21:52 | 只看该作者
    原帖由 langhuamin 于 2007-11-24 22:09 发表
    , r5 L. I: w' W. S6 {, }. w" A
    9 B7 G5 G6 z9 U$ t0 G0 t- j4 Z/ g, _: F% h+ s' e# X
    ( T( x: ^7 {# C) \
    呵呵,这个我倒没考虑过

    ! w, o; M& _8 q6 @  e2 Q# E
    $ x0 Q. Z2 L* X! N4 I" K) f你可以参看一些教程里面的综合结果实例对比
    ( @* j( X7 P& e# V- y! W
    ' L" Q& I. ~- H' [. W代码不同效率不一样 虽然结果相同

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-3-10 10:41 , Processed in 0.093750 second(s), 27 queries , Gzip On.

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

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

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