找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

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

EDA365欢迎您!

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

x
是一个关于流水线方式实现的8位全加器
. T2 v( q& p% N0 A% s从书上抄的一个例子:; W) W( J. ^; C3 I1 Y# P0 g" u
module pipeline(cout,sum,ina,inb,cin,clk);
. {# P4 N/ j3 n* p8 z/ x    " u3 q7 L. V. Y: x0 L9 u9 i
    output [7:0] sum;
4 h8 D  p7 `' v" o5 `, Z* G. q+ G    output cout;  Z; b/ b3 H) D4 _  O
    input [7:0] ina;& p/ s- w; o6 k$ g
    input [7:0] inb;
) H- J0 l, Q! Q. D" W' [5 K    input cin,clk;
. Q6 q8 c6 W1 Z; \8 y    reg [7:0] tempa,tempb,sum;0 D5 T- f) O0 P. i
    reg tempci,firstco,secondco,thirdco,cout;
: t) |% {1 N7 w3 `) ?9 f! J9 _* |    reg [1:0] firsts,thirda,thirdb;$ x' Q3 p) L2 M9 V( ?1 j
    reg [3:0] seconda;  H9 K8 `& A3 Q5 ]
    reg [3:0] secondb;- R" S% n8 B, B
    reg [3:0] seconds;
/ V( N* _4 f2 Y    reg [5:0] firsta,firstb,thirds;* F8 m# h, ^4 A7 m2 h% w0 c1 u
    9 B$ X2 ~* E$ C) ]: Z- j! E
    always @(posedge clk)  
1 ]. H& L3 W. r6 r        begin0 H" o8 o! Q' E5 S! s' X
            tempa=ina;
6 u; c" T+ n# ]$ l. I7 ]8 s            tempb=inb;* T* r- ?* @: p( p  |5 y1 z0 \
            tempci=cin;
  d# y5 z# q; _, ~' p" q& q$ F        end               8 K0 g' a  S& c( }. s) L
    $ ~; b5 d9 ?- x% `+ I4 ]
    always @(posedge clk)  ( z' J' n. r( ~! ~9 M8 L
        begin
  j6 a& k; ]! j1 }# o            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
" g+ r) ?: R2 X            firsta=tempa[7:2];
7 K; r* m  d( A8 D) z            firstb=tempb[7:2];3 m% p& h2 q% }% A
        end      
3 O+ E( u$ a# e    5 M. o9 v2 F2 W- A; O( {
    always @(posedge clk)    L4 k5 j2 a1 Z3 H$ v
        begin
1 b( y5 k/ D) }; A/ [3 @* x            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};
; G( v8 b% P9 q* ~1 k            seconda=firsta[5:2];
1 r2 D) p  _8 D( g            secondb=firstb[5:2];& Q: H1 ~3 D& x2 l7 z9 {
        end. b  c  k4 J, m& V: Z
   
/ m1 ?( N$ K8 u8 \    always @(posedge clk)  5 V( j4 N# u" }% i
        begin
; b" j6 ?0 g8 j( u( y3 `6 E% ^. d5 a            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};
- p8 Q: \5 P* K            thirda=seconda[3:2];
+ }( v. m) c% d0 e6 b( d            thirdb=secondb[3:2];
: |( g7 z6 Z4 }2 ^6 p4 x9 V        end1 W' F" o. m$ h+ F) h
   
5 w) r( X' \' U3 \    always @(posedge clk)  
+ G' L& S# N' O5 G. V        begin
: F# v+ @: N. t4 K6 h3 ]            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};9 j: c! t( [' J; n- I; y
        end3 T, J8 L; m5 p+ h* [' x6 x8 E
    $ @2 `- y, f3 @* [$ |( y, w* S
endmodule0 ]8 P5 B& Z- {+ ]( l
自己写了一个激励文件:" E" J: p+ a) F: E) c3 R
`timescale 10ns / 1ns
  {! Y, r  x, `  t0 K7 hmodule pipeline_tb;; e- I: }0 E5 |/ r
    * u) B7 _" H7 ^
   
, {& {, s9 q# \  ~# l    //Internal signals declarations:
# P8 l2 `& a. V0 K3 x  |. \+ p6 G    wire cout;' O* D+ H1 F+ c* h' I$ F* Y
    wire [7:0]sum;
6 J7 q! B8 b; T% _1 p% `    reg [7:0]ina;/ f  B6 E7 Y8 U$ w% ^; i
    reg [7:0]inb;( r* N2 F3 H3 o+ P# I2 L
    reg cin;
0 @" f, ?9 Z8 s. T    reg clk;
  L. j# L# S) f( `    parameter dely=10;. X2 D2 w; W$ Q* q& x2 u2 z
    ) f. @; H+ P' u( A+ K. {  |
   
# I+ h7 r& f$ K7 |8 W$ w    // Unit Under Test port map
$ V7 \* X" n9 F' q, R( |; I* `/ M+ E    pipeline UUT (
$ ?) G$ J: Z  G4 s: t        .cout(cout),
7 ?' e5 [" W/ t% _% x. T! C        .sum(sum),
8 W+ q7 b" I* F( o        .ina(ina),% ~0 @0 W6 l1 g% K3 c  }
        .inb(inb),
# |2 R- t  `6 j: K4 K4 n6 _: E        .cin(cin),
4 ]/ k+ T2 `8 @* k1 f# A2 k9 m        .clk(clk));     : l2 H1 F& J( _. U' S5 y) I
    , S# W. s9 Z' ]2 e' }2 e; m$ g
    always #(dely/2)clk=~clk;   
1 F9 b5 e2 I& J0 e8 [: Q" ?    ) }. Y* ]$ x3 n! o- C
    initial
5 h* B4 x+ u* A6 _. V        begin ) D2 ]6 s' E9 x4 s: i
            clk=0;& ^& e3 e: u% [7 |$ t8 C/ g1 t! t3 L
            cin=0;4 ], B* D( i, y% d+ f/ V9 M
            ina=8'b0;
7 G$ G5 s! u- u            inb=8'b0;
! b4 n+ i2 a0 u1 ?            #(dely*1000)    $finish;
# t4 l$ G% n( M# \3 V- q, R        end    $ [/ o6 z( l- h7 n. v
    ) e8 t$ ~2 [- C9 b
    always #(10*dely) cin=$random;; S* W$ B, T+ y7 B& `' m- ^
    : U  G. i; h* M% Q
    always #(10*dely) ina=$random;
: y4 [2 v8 z2 a% s" a& \+ l   
  Y3 }( R8 H( a. d2 g4 h* Y    always #(10*dely) inb=$random; 5 t- ^5 h8 \4 F3 `( F$ b0 ]8 h. j
    . P& r% g5 P. U4 [! M
    initial! |# }$ p; u' T) y- f
        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
% s4 I/ _0 p* gendmodule3 r% _$ y9 n9 Z! ^
但是仿真出来的波形明显不对啊

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

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

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
2#
发表于 2007-11-22 13:28 | 只看该作者
就是中间那组数据有一位算错了。估计是连续进位的问题。
3 h) ]" \" s- o& O' I+ A& y
4 \8 G4 _; o2 ^/ E[ 本帖最后由 langhuamin 于 2007-11-23 08:31 编辑 ]

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

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

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
4#
发表于 2007-11-23 12:28 | 只看该作者
据猜测,程序可能有问题。
; x$ a" V5 L0 E  C6 v0 I$ z- D. j{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB% M4 {1 U& r; n7 P$ n1 G; K

4 K6 l9 C2 N$ I6 C6 ]4 H" A
% g- b1 ~: ?$ R8 c其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,+ X+ \8 Z0 S# r8 ?- C5 @& R9 Q
, z- I  T. C3 y
导致最高进位出现问题。3 E+ ~$ j* U) P; V0 N- `8 m

3 G: ~- y, a4 \. G$ w/ z0 b此属推断,待验证。。。
& |: N+ r+ I# d
  e- n( l+ U/ t2 r0 h. A. [1 I可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;
; ?# A! M* _/ d5 h+ v4 Z
- L4 ]5 ?% G5 v* R9 Y' r. j再{thirdco,thirds}={second[2:0],seconds};% `6 P. \; k$ b, J7 [7 e# |
6 u; T/ x$ {$ q
不过我这边现在没装这个工具软件。。。5 I, o7 x3 F3 ]5 G) v! w$ o: h$ R
) S3 ^7 x) p& \7 g

9 N- ?! M; u/ ?0 B9 r7 `% l[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
5#
发表于 2007-11-24 11:54 | 只看该作者
回去试了一下,确实如此。( ~& @* f3 q# h0 s  F+ b% d
而且程序段可以作以下简化:
5 T+ J$ D1 ^/ x  C* M
3 K0 a: `2 F4 I* u3 h& W
. y) [; a; m; lreg [8:0]ins;
: O9 M6 ^6 h/ ]% t5 {# ~! Q0 Z. u$ n4 I6 H7 c- P" d
always @(posedge clk)  
. r2 ~3 \* j' R7 c/ x5 F  begin; Y) |' \2 A* K  h6 b: W
       tempa<=ina;) u8 C3 J' q$ S. d1 R4 n. W
       tempb<=inb;% e+ K9 E, _; N# y
       tempci<=cin;8 J- U2 }+ @3 W
   end               
6 M0 x; T, `# f8 m: Q" B9 v always @(posedge clk)  4 X/ o8 A( F6 b0 ?" y4 E# U+ q
begin 0 J7 t7 M1 @$ Y1 T" i3 E
       ins=tempa+tempb+tempc;      2 M! O; j, Z5 q9 \* b# Q  m* k# [/ m* x
       {cout,sum}={ins};( f8 Q# W2 ?; F: Q' c' A* m
end

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
6#
 楼主| 发表于 2007-11-24 21:22 | 只看该作者
原帖由 langhuamin 于 2007-11-24 11:54 发表
: G# ^) z  A! Y# o回去试了一下,确实如此。3 L7 o( ^0 _6 w' Y! c# P3 |
而且程序段可以作以下简化:9 C, s5 v1 e- k. l; ]- T0 B
. I; T' N  w4 @. d4 c
* y$ Z% c. J* E, T3 ~; J
reg [8:0]ins;
" T0 c1 d/ o% D% c( L. [9 E! B7 \6 ^4 X7 `# a& G' R- W
always @(posedge clk)  ; [. L" p; ~4 r# d& k5 V$ Q
  begin
/ u+ Y. P5 F$ r- A( V       tempa

# V+ R1 ]7 I: h' ^虽然没错* n7 r2 D6 q' i2 C+ w
这样的代码综合出来比流水线效率低3 _6 r, Y1 E4 f- P
综合出来用的器件也多哈
) E  w4 S' Q  q, e呵呵

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
7#
 楼主| 发表于 2007-11-24 21:25 | 只看该作者
原帖由 langhuamin 于 2007-11-23 12:28 发表 & C, s5 M& ^5 Q- {/ q6 p
据猜测,程序可能有问题。
5 e' `! H$ `) ]" U9 b{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB2 {2 a9 _( _, m; J6 ~
% ^2 S. w: X1 C9 u( W$ a

0 C- r2 [8 v4 q7 E其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,, s3 n6 a" b1 l
4 @5 U9 }; `: [; w7 k9 v' @
导致最高进位出现问题 ...
5 i2 L1 Z+ M% E2 V. o
这个问题我也注意到了% p; [, a. _- c& h% K) K
但问题在于为何第一也是这样的效果为何就有进位变化* R$ z5 D4 R6 t, ^8 Z8 u4 W
而只有后面的两个有错误?( _) K; f1 O9 q4 ~7 m$ I8 E

2 i% b; |) l$ ]: B$ j不知道是否与verilog语言本事有关系?4 |$ \# A) z* d& S0 \" N/ a
# R1 J' O: T. f- k6 y6 X( b
我自己试了试7 X# n3 D* o+ }4 y, B
如何在加之前先把2位的值赋值给一个3位的值% y8 V7 n, T7 l% l: \) `' j/ j
这样就能保证赋值间的位数一样; a: h& a9 V  y  x+ e
这样进位的值就不会丢失了

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
8#
发表于 2007-11-24 22:05 | 只看该作者
原帖由 mengzhuhao 于 2007-11-24 21:25 发表 # ~9 t, Z- r% @

7 u6 _' O; Z- d, A这个问题我也注意到了
' g4 U9 s) I) f但问题在于为何第一也是这样的效果为何就有进位变化  t. O. C8 k  z
而只有后面的两个有错误?
' Q# ~% |5 T" V8 f5 c8 v. O. f8 n; o$ q/ \! _7 H# X) Z
不知道是否与verilog语言本事有关系?2 {, y/ r% P6 O5 D- [+ k
+ N8 t$ W7 m( Z6 W4 L3 a% ^8 h
我自己试了试! r% c- A0 `$ V$ ^! R
如何在加之前先把2位的值赋值给一个3位的值
3 r% Y) e/ s# S" X4 |0 P7 k这样 ...
: r" |2 ?/ ]; ^3 y; o8 F0 {

' t2 v2 r1 O% f; _/ t/ j* h
+ Y' l% [* {1 J" [
# @( I8 O( s* w$ g3 M也可以说是verilog本身的原因吧,
) v/ ]4 H1 l) c6 F- M" P6 u* E( h因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
. `* D' k$ B0 w2 m2 J2 _/ m并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,
2 @5 g) n* A, \" T2 L! _( D这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。7 _/ L  S' e9 ~
本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。9 I7 k- |% d* F" [9 g
一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
9#
发表于 2007-11-24 22:09 | 只看该作者
原帖由 mengzhuhao 于 2007-11-24 21:22 发表
/ Y4 B0 y8 V) p) o; A4 L( V; C, a% \) f2 N7 U
虽然没错
* F3 b. a5 e7 ^% l6 M+ ?- p这样的代码综合出来比流水线效率低9 \, k# K' p% C) z; k0 y: S/ ~
综合出来用的器件也多哈
9 l& @# _( \/ E0 h( ^# l, y呵呵
9 T% P: R8 Q; B5 u% Q9 k+ s( l

+ d& j7 q' r& L/ f. s: n: G  `* W; m. r% s8 W9 X. u  g2 @$ |. n
呵呵,这个我倒没考虑过

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
10#
 楼主| 发表于 2007-11-25 21:52 | 只看该作者
原帖由 langhuamin 于 2007-11-24 22:09 发表 8 R: ^6 m( k6 u8 g' m
& g; ^) I) z% m& U/ g
7 }  r+ ^" ]7 B8 L; j

0 ^( d. F- ]* M* t7 l2 r: L- O6 w6 U呵呵,这个我倒没考虑过

7 ?& ]& m7 r4 {" ]6 r( f
$ G. o2 F6 p+ y, S你可以参看一些教程里面的综合结果实例对比
" I% m( K  d: a" U( W7 @3 L
0 |3 C, k" }+ k6 i4 q1 {代码不同效率不一样 虽然结果相同

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

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

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-10-19 01:24 , Processed in 0.069769 second(s), 36 queries , Gzip On.

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

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

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