找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

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

EDA365欢迎您!

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

x
是一个关于流水线方式实现的8位全加器, u. u( m8 t; v. H
从书上抄的一个例子:
/ V3 j8 q( f5 x+ E. kmodule pipeline(cout,sum,ina,inb,cin,clk);( I% n1 f# b8 ~
    + m, i' Y, F- S( F+ e3 T' ]8 ]8 w
    output [7:0] sum;
+ k- Z# D* p, W" b1 f( D1 U    output cout;% A/ z  i! F) Q9 s1 r3 s/ K' X6 g
    input [7:0] ina;
- W" O; k& m- W+ z1 J4 @    input [7:0] inb;1 D1 c. c6 c) C, e2 t2 q, u
    input cin,clk;
- p8 {2 F! v5 |4 F" m* K  g6 k    reg [7:0] tempa,tempb,sum;: B  X8 @! w5 w2 i$ ~' q  ?% m/ t: G5 f
    reg tempci,firstco,secondco,thirdco,cout;
! @* M  }3 @! {- w' d( v/ U    reg [1:0] firsts,thirda,thirdb;
' y( Q# E" k3 h4 R/ L    reg [3:0] seconda;, w& |; k+ ~: a% L9 Z9 Y
    reg [3:0] secondb;1 V2 X; r! I$ g6 K% S/ I
    reg [3:0] seconds;0 Z9 \. P0 P; [9 i
    reg [5:0] firsta,firstb,thirds;
2 M" }; h% H' r7 a$ C3 o" C   
; L0 T% T1 i( D8 D8 O6 g/ d    always @(posedge clk)  
- V) ^3 q! |6 C! C: v% Q/ k3 g0 Y        begin4 H$ E1 _' O; Q: i% \# K) ]& L
            tempa=ina;
3 N/ Y, x3 r+ l' O! C3 ~3 O3 q            tempb=inb;# Y0 H$ z# [$ Y. d
            tempci=cin;
, g$ A  N$ b& z" B% {2 z) J        end               
! E& Z' ~- n. O5 _3 f    & F2 `; o, I: J6 b& I
    always @(posedge clk)  
8 D- G$ u4 p0 I* x# K# @& l1 g        begin 7 X8 f4 Y. e9 X1 s
            {firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;
# F: ?2 e. V* q2 t- K' W            firsta=tempa[7:2];' I1 F: T1 _' |+ G4 s- l9 v9 e
            firstb=tempb[7:2];
5 x. R, v5 i, t6 l2 ^, F        end      & `5 Q+ b( ?# `% _: `/ E
    : p& }5 `2 r+ x: R, p
    always @(posedge clk)  
8 }' C4 E3 J: _2 m2 T+ t        begin, D, s0 u3 ^$ y5 o# ]+ c: V
            {secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};  v1 J: B) p7 |9 B
            seconda=firsta[5:2];2 ~  d1 i7 K9 S! R( e2 `
            secondb=firstb[5:2];9 ^2 Y1 h( \' J% ~; L8 i
        end9 I9 e( j% |- s+ p. _
   
3 K+ i' G7 X9 c5 _/ w6 K  ]    always @(posedge clk)  ) u9 x" P3 K* }6 G' _8 I, o8 \
        begin
2 `8 z2 l1 f% L: r' x$ L8 w            {thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};+ ~" q" M) n* ^" c- i7 u, h
            thirda=seconda[3:2];
  Q3 p7 D4 H) \- b            thirdb=secondb[3:2];6 ^# g7 N4 r' B+ X( z
        end4 H& K# u4 }6 ~% r: l$ m
   
) z( S7 J2 R3 N/ W: {9 t& q    always @(posedge clk)  + [% H' g& J) N) ]6 y/ \9 O& q! b
        begin , L8 f: s6 ~6 P4 b0 \+ Z1 ~
            {cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};
4 x% L: C' ?; X  K+ x        end5 i" _. h( k% l% M4 p
    & h+ K5 K" l7 S8 h# z) r5 a" ?
endmodule
2 O# b) p. @  a) `. `2 d6 z, \自己写了一个激励文件:" _9 {% [  ?5 R$ A  X- p" N3 l
`timescale 10ns / 1ns: C# B) j: ^* V$ `0 l! y# C
module pipeline_tb;! z2 z/ `3 B: k3 b" j: ^2 d
    0 J8 N$ A# I) ]' d
   
$ j+ I3 v5 y; I/ N0 h6 f    //Internal signals declarations:
( v1 H& n" U0 F2 L# {    wire cout;
! m& {: p6 x+ C; p9 V7 Q    wire [7:0]sum;) {3 k( \/ j& o6 p
    reg [7:0]ina;+ P. O0 t1 R+ u! Z5 n* f# l5 R
    reg [7:0]inb;
" L. m( k2 o9 P+ `: Q    reg cin;' @: c" K! ?. _6 I7 b
    reg clk;" M4 |- h" O$ \$ E
    parameter dely=10;
/ H- m. q) X: @, n   
5 Y1 _9 K% d5 p/ B- H    0 p: U5 E$ z- u3 I( Q$ O
    // Unit Under Test port map
4 ~/ R  b, w- P0 t' ~; B: W    pipeline UUT (3 \9 J- O5 k& @' j/ \) C
        .cout(cout),$ O7 |' s2 D' _) s9 a
        .sum(sum),# ?0 _& z4 }& W5 t. [  `
        .ina(ina),
' e/ l6 [; P! F. ]& a        .inb(inb),6 G+ b! x8 ?; }6 \
        .cin(cin),
4 w9 j: _$ z* w& U7 o4 R7 m( p0 H        .clk(clk));     
: D5 C$ u- h" m& e/ G# X   
" R0 y  G1 G; }2 M8 B' ]  ]    always #(dely/2)clk=~clk;    ( u, H  ~# }: W9 t$ W, ~# ^
    ! ]& r" G7 B4 r7 k4 H, f
    initial
" f4 m. V- m. t! _6 D        begin
) Y& u4 g1 _8 E0 Z, a: p+ _# S5 J            clk=0;
- V5 \0 U7 P; K8 f5 Y            cin=0;" _2 H2 }7 C7 p- X5 h( H6 k$ D
            ina=8'b0;
, f5 Z! u" X8 L$ T: Q) E. a5 Q            inb=8'b0;# [: ~. b. V' H. k
            #(dely*1000)    $finish;# _$ h2 f6 x0 a5 [+ l$ i% v
        end   
: [$ M% B( N0 i4 b7 H    4 D, d* K* H. E. H
    always #(10*dely) cin=$random;) J* m, ]5 ^0 Y4 \4 m1 z
   
$ ?  r) v# W6 h6 `  T# k    always #(10*dely) ina=$random;
4 n5 K- @  T% c! y2 \# H    " \' A: ?+ I8 Y% G; H+ E
    always #(10*dely) inb=$random; ; Q# @; f$ E' z: G/ V. c" X1 V
    3 m* P  X9 G; j4 Q" @) X
    initial
0 Z6 c' z. B' ~( x2 J1 }, z1 x        $monitor($realtime,,"ps %h %h %h %h %h %h ",cout,sum,ina,inb,cin,clk);
1 W- F4 {* P9 q) A1 @* nendmodule. ~; y  R1 h% T  _( ~5 D$ J' K
但是仿真出来的波形明显不对啊

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 | 只看该作者
就是中间那组数据有一位算错了。估计是连续进位的问题。+ g- Z6 i# D3 X6 e3 i- u' N. g
2 C6 t9 ^3 a3 n+ [
[ 本帖最后由 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 发表
/ Y" I1 V3 O. v- ]8 p: \1 B就是中间那组数据有一位算错了。估计是连续进位的问题。
问题是,为何第一个进位正确,而后面的两个进位就错误了?这属于什么问题?

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
4#
发表于 2007-11-23 12:28 | 只看该作者
据猜测,程序可能有问题。
* B0 r0 U0 z- ^( p, Z2 h; s{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};PCB
0 y' |/ l; T% G& l
2 w4 G: C  o; w- Y
) W  k6 a0 b% w7 G其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,
; s' U$ A  k  k+ o) [4 m' F0 v9 F+ X7 Z9 f  c- a: G
导致最高进位出现问题。: {, |# `( O5 g! |- ?/ a3 R

/ i/ }) S" P, I: j: [此属推断,待验证。。。
# [; q  r9 @7 W+ ]5 Y' P! k
- |3 n9 C% x. ~5 R4 `# L可以尝试先将second[2:0]=seconda[1:0]+secondb[1:0]+secondco;3 c! R; D7 G; B; d0 S
  I  W; ?- o5 l: d& y7 f& l8 e
再{thirdco,thirds}={second[2:0],seconds};
5 u9 r/ \; D( c# F4 m  N8 x
2 l7 j$ h" s+ k' S; `不过我这边现在没装这个工具软件。。。: _/ ]+ v& M/ g4 B( b' e
9 M  l. H+ j: e6 z6 L' k6 x+ Z
, G7 J0 ?: p: `4 C/ g( ?
[ 本帖最后由 langhuamin 于 2007-11-23 18:40 编辑 ]

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
5#
发表于 2007-11-24 11:54 | 只看该作者
回去试了一下,确实如此。
7 V  [0 s- V( v9 Z2 G& A而且程序段可以作以下简化:% [3 Z5 G$ r( L8 |$ e# {

' [& P+ p6 @, w% e
) _" A! h* P1 x( }% m# x6 Hreg [8:0]ins;
' F" P; Z5 `$ {" X' h' P: l* I$ q9 y0 K* @8 X
always @(posedge clk)  , T) V; w) t! I8 H
  begin
, t% w7 k8 H9 j3 ]$ L: T       tempa<=ina;
( K& \& M8 f; |0 K0 J       tempb<=inb;
! k5 d+ E8 C( [; U2 c4 f       tempci<=cin;
+ J. C6 M: S3 P   end               % g: l* S9 c- `' Z5 X- d. d: _; ]' E4 O
always @(posedge clk)  ' ]$ i  L8 l+ ]. s% {
begin
  G7 [7 x4 p9 P. h- J8 U       ins=tempa+tempb+tempc;      
  h* N; w; U" r  M       {cout,sum}={ins};
6 ^: j5 Y, c  W2 }( [ end

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
6#
 楼主| 发表于 2007-11-24 21:22 | 只看该作者
原帖由 langhuamin 于 2007-11-24 11:54 发表
: \7 R3 d# g( x- a2 d回去试了一下,确实如此。! Q: q% Q" L/ r0 v8 q
而且程序段可以作以下简化:
9 e8 c7 j: i% P1 r; ^: H6 ]
4 {! l) v# r' a) N5 |$ m9 q$ z* c6 ?) y( |7 T
reg [8:0]ins;/ J& q& H- J8 H0 O
' n% C  I+ [) f2 @2 X. e
always @(posedge clk)  
9 x, B, R) e( m4 h  begin' n4 N* A" n) y8 Z2 L
       tempa

4 h% q2 v. x& x. o- W/ {虽然没错$ J( ^5 W' c/ }+ d( w- a
这样的代码综合出来比流水线效率低
# p. _! R' x1 d5 w! M! ?综合出来用的器件也多哈
% Q5 J  B* q  x9 h呵呵

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
7#
 楼主| 发表于 2007-11-24 21:25 | 只看该作者
原帖由 langhuamin 于 2007-11-23 12:28 发表 3 T2 P- L- J; @3 W
据猜测,程序可能有问题。) C0 Q* ?3 D$ D" @2 D; S0 D
{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}CB. g6 ~1 e; Y+ T/ Q: p# d

5 _% x- B2 F+ q/ |) c! z1 r( M5 c
2 y" G; @9 h$ t6 i" \其中,{seconda[1:0]+secondb[1:0]+secondco,seconds}是6位,{thirdco,thirds}是7位,: I* b; c7 c5 L' a( e
3 a, M+ R* [+ q! V
导致最高进位出现问题 ...
5 E! o6 g1 e3 o2 k! b% b/ A- [
这个问题我也注意到了
, Q/ W* m8 z( X- }7 v1 }  [0 r: l但问题在于为何第一也是这样的效果为何就有进位变化
) V9 |$ J6 y1 u- O- A, T3 P8 T而只有后面的两个有错误?
$ J, Q! N- u* @7 ]/ |
/ w# [' N) e! a7 [7 j2 O! X7 q) r* Q不知道是否与verilog语言本事有关系?# w) @( d6 F; M1 }+ p
& d" {/ W* p' J" _# W
我自己试了试0 |/ Y  |7 t/ G$ Z. W5 `
如何在加之前先把2位的值赋值给一个3位的值8 ^* H3 M6 q- s9 l2 b8 S
这样就能保证赋值间的位数一样2 y0 C+ {9 ~% }; C7 x# P: I% M- E: k- h
这样进位的值就不会丢失了

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
8#
发表于 2007-11-24 22:05 | 只看该作者
原帖由 mengzhuhao 于 2007-11-24 21:25 发表 9 r! ]6 a6 ]- U% `" [9 @
7 D3 \1 f& a/ k# Z
这个问题我也注意到了
! }0 ^) n% l# G& h但问题在于为何第一也是这样的效果为何就有进位变化
. u( F. E. H; _2 p& Q+ w而只有后面的两个有错误?
8 K8 z1 x* G: e4 ^* }- e) s& ~2 \6 Y% ]& K
不知道是否与verilog语言本事有关系?
0 N  E& [: W* v! `6 x/ f9 {) m# a* w3 P; @! u+ v7 M$ Y4 @) p
我自己试了试
! }8 o- l& B" Q  r如何在加之前先把2位的值赋值给一个3位的值3 R) Y+ ^' q  b+ e. g( R2 G
这样 ...
. B7 ^" J- E1 P+ |
1 I. ?( Y5 N5 D. W
! C5 W; U7 Z& }

! S8 d0 o: Y4 k3 L$ t4 Q也可以说是verilog本身的原因吧,2 s9 Q0 U7 J: a; ^$ Z
因为这里{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds}
1 @+ a' y6 N) x# q7 D$ D3 D1 a并不是将右边计算完后得出的数据直接放入{thirdco,thirds}中的,+ L; G- D& |/ s1 l
这里{}={};在次序上是先将里面的算完得出运算结果(这时已经确定位数),然后再把结果作=处理。分两步进行。
) ^: a3 H' W4 S6 q& o7 S) q* m2 z本质上与second[2:0]=seconda[1:0]+secondb[1:0]+secondco;不一样。) |  y- i6 d# z4 g" \7 B0 X7 `+ S
一开始我也想到“在加之前先把2位的值赋值给一个3位的值”,这个方法和我说的那个原理类似。PCB

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

积分
130
9#
发表于 2007-11-24 22:09 | 只看该作者
原帖由 mengzhuhao 于 2007-11-24 21:22 发表 2 x/ x1 _3 J  u& S4 e7 @  _
) z$ v) F- C' \3 o$ Z1 F4 l; a/ I
虽然没错! Q( X) `% s0 A8 r  e
这样的代码综合出来比流水线效率低
* H* J- M% {* O! B  M% F% T! `* G综合出来用的器件也多哈1 I+ C- n) ~0 A
呵呵
0 ~6 [3 N8 ^! i0 G6 b4 T! _
/ P7 }& ], s! U9 l3 w$ x
$ ~$ L% ?4 j5 w( o+ R
呵呵,这个我倒没考虑过

604

主题

2859

帖子

1万

积分

EDA365版主(50)

Rank: 5

积分
13638
10#
 楼主| 发表于 2007-11-25 21:52 | 只看该作者
原帖由 langhuamin 于 2007-11-24 22:09 发表 ' k0 _7 {9 k% R# b( s! }
/ K: Z8 E3 }( X& V

8 r0 H1 w. Q1 A6 Q1 M1 i3 e/ I) y% g% D% N/ _3 s
呵呵,这个我倒没考虑过

) ]2 ]/ P# O9 E3 d- \; ~
. N! S9 \  f# @# g4 C4 ]你可以参看一些教程里面的综合结果实例对比3 p9 k4 C. K4 e3 J& ^9 z
( x6 K' j3 w- ]0 A2 B5 B
代码不同效率不一样 虽然结果相同

2

主题

41

帖子

130

积分

二级会员(20)

Rank: 2Rank: 2

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

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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