找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 2383|回复: 10
打印 上一主题 下一主题

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

[复制链接]

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

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

EDA365欢迎您!

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

x
是一个关于流水线方式实现的8位全加器
: _' R& p/ I1 K, A, {8 d5 H从书上抄的一个例子:
" E( z# ^+ [7 B" R) `+ [module pipeline(cout,sum,ina,inb,cin,clk);1 G0 s  m* ~% b0 [& h, Y6 x
    5 E) M( k. T! ?* P2 p0 W
    output [7:0] sum;
. Y- b+ t9 o  B4 f: V    output cout;
! |4 T1 s* J* ~6 \9 g  {/ ^6 b    input [7:0] ina;0 q/ E. i0 @% \8 }5 F4 [  ]0 w
    input [7:0] inb;7 W) x. k! N& a( I, H$ b: `
    input cin,clk;/ T$ q  y/ r/ [  x
    reg [7:0] tempa,tempb,sum;& |0 \# O# I: F- X
    reg tempci,firstco,secondco,thirdco,cout;
/ ^, F$ b1 N& y) E( Y  B    reg [1:0] firsts,thirda,thirdb;
$ t* v; R) V- B    reg [3:0] seconda;
; {7 R& }; O3 _    reg [3:0] secondb;
. {  I7 V2 T) x1 _1 i5 c8 r    reg [3:0] seconds;  G! X$ w% a* @2 I7 q
    reg [5:0] firsta,firstb,thirds;  G# F; u9 ~/ Z% W5 m5 }/ V9 A
    5 x; S9 P' z7 t3 F% J
    always @(posedge clk)  
) w! `; S4 D" e* {! p0 V        begin
% O9 n) t' U) f- a. X            tempa=ina;0 J8 Q/ f$ Z. H- u# m2 [7 l/ L
            tempb=inb;
, A/ T! X  P7 E7 Z5 Q  c            tempci=cin;; Z" s# V' r( y( y! a. P
        end               . d0 u0 t( U+ F; P0 @6 U
   
* E) ^% Z" T. T" x3 f    always @(posedge clk)  
4 H) T  Y  m+ k5 W) `        begin
. n; c+ A. n- P. Z0 L            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
- I6 i3 Z+ `  L% E            firsta=tempa[7:2];5 a, q! s% I+ w) B
            firstb=tempb[7:2];+ F, ?% c3 o9 g0 {3 [
        end      ' ^6 W$ U: f# ^! ~: e
    ' j4 b) x+ ^- |* Y" K% X3 H! u/ v  A0 M
    always @(posedge clk)  . I. ~$ O8 A8 v% }4 [! e
        begin
" O. ^+ l1 R: Q            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};! U' J4 v1 r" I4 `9 S
            seconda=firsta[5:2];
/ q. U! M# e8 w! g6 w            secondb=firstb[5:2];
" p) C  z# @. E3 Y# n# G        end
) v% z5 w7 D2 z3 J    / D9 O$ |# ^+ ~' m5 \
    always @(posedge clk)  
' O& F% ~% c) H' p, C        begin 9 l4 m2 G# p6 E, A. m1 Q
            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
& n. z! Z  C: h& c            thirda=seconda[3:2];: ~" o( {2 H4 Z: V# O
            thirdb=secondb[3:2];1 `$ X/ Q- m( G* _4 z6 |8 q& h
        end
, g' {# s% r, \   
& ^( A5 o' t2 s) ~    always @(posedge clk)  
8 s8 r& |9 b4 o: g        begin 0 i5 z* z6 O/ @
            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
8 M2 \3 y- o# \8 t. z8 ^        end! R, d9 [8 P4 }; m
   
" m6 [7 y; M2 x9 Vendmodule2 K0 j4 h" v6 p5 C: Z( k) u8 N
自己写了一个激励文件:& d8 a8 B" d8 S6 h8 ^# }, n- _: e
`timescale 10ns / 1ns
9 E/ X2 o0 p+ Xmodule pipeline_tb;" L6 P. ^' a! _- h) V0 x/ ]4 H
   
1 t/ Y7 N& y3 g" p" g$ o9 T! ~   
; S# ?& ~1 B+ C/ ~2 U    //Internal signals declarations:8 L" }( c8 a$ T7 }. J1 t
    wire cout;/ K0 [0 D# W( W& M' M" E
    wire [7:0]sum;
- M! E' i. ^0 [    reg [7:0]ina;: M2 U1 Y, M: M" e" q% E
    reg [7:0]inb;
: [7 T* P+ M5 t9 U4 u* z    reg cin;% A' O+ y' u4 M
    reg clk;. S6 E' o0 O2 }& ?9 I3 x2 r. D
    parameter dely=10;  H6 J% Q* _, [& d: a
      X. y/ }" p" H, p
    0 {4 G+ C" O- N6 p& ?0 D( ?' Z
    // Unit Under Test port map2 }0 c- G$ \; E8 C8 U
    pipeline UUT (  U. o; M, w& ~0 b
        .cout(cout),
- a. O1 ]! ^# I! h2 H% t, Y; L. N        .sum(sum),& g) `9 d2 b7 x3 j
        .ina(ina),1 r# w" a( Y, {9 M
        .inb(inb),8 z& n2 V2 X1 M3 R3 z
        .cin(cin),  j1 ~3 {5 Z% R! j
        .clk(clk));     + r/ U1 W. O5 s6 g
    ! W. f, [3 x7 H3 L4 u# g- {
    always #(dely/2)clk=~clk;    " c) }. O/ n- q2 C8 N& w1 F0 U
   
1 S& y! B$ g, g/ W    initial
9 J, O; m4 L4 B3 B% {9 Z! P. v        begin
; T+ w. g5 r8 K( @# w            clk=0;
! X$ y7 J6 b3 D            cin=0;
$ ?1 B3 T2 o' C1 o0 }9 c, M            ina=8'b0;- s& Z2 c0 Z5 u; u. {! m- y
            inb=8'b0;; b/ q2 S9 y! n! g* d+ _# ]
            #(dely*1000)    $finish;7 w3 T) q' m; T5 j& g$ N* d
        end    / J; X4 o& r6 Z: @  i3 \
    + v: G5 Q  g- {0 D5 s( v
    always #(10*dely) cin=$random;
$ `# t/ g- O/ S6 K   
( [) X2 E; @& |; ~! V    always #(10*dely) ina=$random; ) Z0 G! L$ Q6 K4 k% U3 c. D
   
# i$ t3 r5 w, S# _    always #(10*dely) inb=$random; 1 U- f8 H  x! g$ _' O- r, Y
    0 ~6 T! I4 m. @/ Y$ |; c
    initial2 l8 Y" ~. H) h$ X
        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
" u3 L! ^: ^+ o1 Y# }8 Hendmodule! G4 k) ?# V  D
但是仿真出来的波形明显不对啊

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

Snap1.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
11#
发表于 2007-11-26 10:43 | 只看该作者
嗯好的,有机会会多去看看的.呵呵

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
10#
 楼主| 发表于 2007-11-25 21:52 | 只看该作者
原帖由 langhuamin 于 2007-11-24 22:09 发表 & E' l" W+ }  f. k4 ^

  O& B: h# ?1 u: ^2 Y5 @; }" Q: p: b  M, F

5 \. u( M. b, v: ^呵呵,这个我倒没考虑过
% |* b4 p+ _% s9 v' G2 ~
. D/ |3 v6 g, v8 W: X" H
你可以参看一些教程里面的综合结果实例对比
5 M- `* Z* p0 O. g% O( c
. u+ P/ l6 ]3 v6 V, }9 h# e- y代码不同效率不一样 虽然结果相同

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
9#
发表于 2007-11-24 22:09 | 只看该作者
原帖由 mengzhuhao 于 2007-11-24 21:22 发表 . s5 Z! B4 K6 b& S

! K. T0 c) Q& l0 P# Z虽然没错
* y' J2 Y6 G) X- K' b这样的代码综合出来比流水线效率低5 S9 x; V' f( \# N" f8 u
综合出来用的器件也多哈
8 A) b& ~- H' q0 a# s& f呵呵

7 i( ~3 u+ ^' t+ n4 g2 u& a. M# z% d0 F5 X

' U5 L: T2 t/ f0 @- [* F呵呵,这个我倒没考虑过

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
8#
发表于 2007-11-24 22:05 | 只看该作者
原帖由 mengzhuhao 于 2007-11-24 21:25 发表
- r4 Q7 }* L  ^0 a. X
8 E/ e  C- L+ k3 B3 t' R这个问题我也注意到了. S3 B1 `  k* o& x
但问题在于为何第一也是这样的效果为何就有进位变化
1 W' W9 o4 B0 K9 J$ K5 b. G# E而只有后面的两个有错误?' [/ \0 p9 W. d

0 o6 p' d8 h( y不知道是否与verilog语言本事有关系?/ f9 Z- E5 \, j* S; C9 c$ k3 X6 E

! x/ O8 v8 |. i) O& O6 S  w- D我自己试了试
5 N9 h6 O' b$ G1 X' a如何在加之前先把2位的值赋值给一个3位的值2 ^% K3 A. E3 ?+ G" h- S4 V: V
这样 ...

  }. m9 r& E1 I" K3 j, P2 l4 [, k3 n* P
+ _- Q. t6 X! y0 N# ]9 R+ r
: e+ G$ w7 _; Z# P+ p# b
也可以说是verilog本身的原因吧,$ W  T0 s! i/ |; W7 a
因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}* N3 ?: Z- T* y& u8 Z/ ]- K' y# K
并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,! |& o+ q9 O0 `) g" c
这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
: c5 v* _  F+ q# `本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。( c% i% B6 M- [
一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
7#
 楼主| 发表于 2007-11-24 21:25 | 只看该作者
原帖由 langhuamin 于 2007-11-23 12:28 发表 ( y" J- D! M7 l, ]8 s
据猜测,程序可能有问题。
& Z% F) I8 R4 @4 Z  F" S{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB! [6 s+ U" M# T( g0 r5 a

; |8 `( f6 U& _; {* T& H6 g2 B
  c$ Q1 x: _% ]( o其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
! P( F5 W+ p7 r/ A% c
) e! ^8 X  |0 j2 _导致最高进位出现问题 ...

7 h5 h* N2 J. d% s这个问题我也注意到了
! i8 K/ y' {8 @% }  G+ o, d  A; d# t但问题在于为何第一也是这样的效果为何就有进位变化
- ]' t, K7 }- r/ }" W7 Q- e" P而只有后面的两个有错误?, x0 \, Z4 M3 P& M! C  W
: L( k3 z$ N2 \4 K, N
不知道是否与verilog语言本事有关系?0 ^$ J4 _+ V' [

* V% B% U4 u% P+ Z我自己试了试
1 Z8 p  ^* |) j+ q7 w如何在加之前先把2位的值赋值给一个3位的值
9 }8 Z6 [; N6 Q* @4 @; P这样就能保证赋值间的位数一样# @. v* f3 X1 k0 x7 y) \
这样进位的值就不会丢失了

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
6#
 楼主| 发表于 2007-11-24 21:22 | 只看该作者
原帖由 langhuamin 于 2007-11-24 11:54 发表
* h! |4 a; @0 K# c  A* S& j0 q- U. Y回去试了一下,确实如此。
6 f6 v- B( ~/ ]而且程序段可以作以下简化:
% v9 G1 u& a' m) X" R' `4 i0 T1 M; k  n8 c& \3 T/ Q* D5 O
. n2 T! D8 @1 n$ X# [0 {* h( R
reg [8:0]ins;
! d" k, D9 k' S8 Q* B; [) B3 I0 l7 V; z
always @(posedge clk)  
- Q* p2 j. ?, x+ b- W8 l: A0 }4 J2 m  begin# D- _# i+ H. b; x5 ^
       tempa
4 N' T# ]3 }! A; {
虽然没错$ N$ y9 i0 c1 `4 U- _# D
这样的代码综合出来比流水线效率低& w" F* M  x1 [. T9 t
综合出来用的器件也多哈$ I2 t* U- {. e
呵呵

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
5#
发表于 2007-11-24 11:54 | 只看该作者
回去试了一下,确实如此。
4 s* o1 o) \9 ^2 g: R# ]而且程序段可以作以下简化:' }& J& K) N- s
2 L/ x$ u& i0 b" p
0 b. H& d2 W3 I. O7 l
reg [8:0]ins;
9 g9 l4 ~0 m: ~! J: Z( T* N. J- j( w$ b' C5 H$ C: h
always @(posedge clk)  
+ }8 _3 V: s+ c. g# Q  P  begin
, Q+ J9 B* V6 i2 W* K$ p8 e       tempa<=ina;7 r# y1 L& M1 W. Y; }
       tempb<=inb;
. w; q3 g  u" Q+ j5 }2 W       tempci<=cin;* O2 B: L1 r+ I) z2 |
   end               
& h0 Y4 ?$ Z& }9 N. E1 u' ?& D: h7 I always @(posedge clk)  - J4 P) t% l/ p. @  h& s
begin ' `1 ?; |: T3 m' B/ E' c8 L
       ins=tempa+tempb+tempc;      
" o# `. {# _- r) ~: g/ T8 D       {cout,sum}={ins};
% c; r( J  }) F: c& K end

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
4#
发表于 2007-11-23 12:28 | 只看该作者
据猜测,程序可能有问题。  [9 o0 p+ S$ M/ p( F% H
{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
5 {$ r- _& q% R6 w2 L) g" {( c6 l7 J* a+ g

- K$ B) N! K$ N& B$ l其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,) N- b9 ^. [8 B8 ], [+ y% U

  N) K; b$ C# o  L# X导致最高进位出现问题。
6 Y' g: u" z% @7 e8 H& ^% ~& B# N$ Y# P  {5 z$ `. g; I+ Z
此属推断,待验证。。。: H& u2 V6 I' q3 L( m
, R+ C$ h$ V1 ~  o& Y4 x1 Y
可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
7 W6 N% R5 [5 g8 ]' I+ W
8 [! e- h- H* @) O2 u* j" A; P再{thirdco,thirds}={second[2:0],seconds};' g6 |" f! C- T$ Y) Z" s; q; |

8 D9 n6 }9 P7 A- D/ p6 `) u不过我这边现在没装这个工具软件。。。
* u: [, c4 ~2 O& B" D

+ q( S/ ?' h. {  E5 S+ j! ^2 \; N/ n3 J
[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
3#
 楼主| 发表于 2007-11-23 08:58 | 只看该作者
原帖由 langhuamin 于 2007-11-22 13:28 发表 " h3 R" D2 T& a2 h) A, b9 w
就是中间那组数据有一位算错了。估计是连续进位的问题。
问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
2#
发表于 2007-11-22 13:28 | 只看该作者
就是中间那组数据有一位算错了。估计是连续进位的问题。
1 v8 u8 z, v  ^( l+ |4 L9 ~8 ~/ {7 ]+ d7 B
[ 本帖最后由 langhuamin 于 2007-11-23 08:31 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-10-18 23:27 , Processed in 0.066576 second(s), 36 queries , Gzip On.

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

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

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