TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 g8 ]9 |. U, v! y0 c' }verilog综合小结
* i) h/ C% z; h+ \. Y' k% R& p/ r) J9 I
一:基本
8 u. p$ z6 E) p5 s& t2 B3 S
+ [6 D/ w3 g) n9 V" Z2 k9 k4 SVerilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。1 e5 a u4 ~, L$ f( W
- S q6 t+ h9 t+ v- x
二:verilog语句结构到门级的映射
& C6 q! B- q$ ]
2 e/ K( V# ?* {& d3 F& h8 S( {连续性赋值:assign& c9 p8 ?/ b c; @
0 F( h: I) K5 y( c+ ^连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 过程性赋值:' `% {. N% R8 j: f3 o. j
4 k! s# M q3 V8 ]! H/ m过程性赋值只出现在always语句中。9 J* L5 J3 a# x! G3 b
8 B# P0 Q" Z9 T! y* p
阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。6 }/ g: \5 a$ m
# N$ Z+ n2 e/ Y1 y) f建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。9 M6 e1 V" V3 X6 v5 f
' T, D" z" O1 ~7 ]/ D. X0 ?* J
过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。5 l Y, @5 B! `9 m
& B5 Z3 e% S3 N' L' N8 u+ c
过程性赋值语句中的任何延时在综合时都将忽略。
?, ~4 u3 j" a6 c% d- @, _
/ \* u+ Z2 [7 e0 B建议同一个变量单一地使用阻塞或者非阻塞赋值。 逻辑操作符:
- u( N% P. e8 i& E9 }. g; S- y% @8 s$ Z) l3 [4 Z" {( O8 w
逻辑操作符对应于硬件中已有的逻辑门 算术操作符:) X$ J% S. g$ m& f4 f4 j+ S5 X G
: }5 c# E! m# N) K2 \ Z0 iVerilog中将reg视为有符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 进位:
: W' x0 t* t( v9 u" m8 U- v2 s( x# C' S" V% ~. a' _5 A, ~! h' o
通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:
- W5 R% x* `' X/ v5 B+ Y5 a
7 M4 z& |+ A+ ?) T% X/ xWire [3:0] A,B;
6 }$ D5 h0 P( y/ U# {1 a/ D1 f0 S% s P- I( b; O6 B; S, h
Wire [4:0] C;/ l5 N U" h L( k
6 l7 g B" v+ f+ B5 g% uAssign C=A+B;
0 H4 E: e/ q3 N& I9 Y I
6 Y& @' l% ^, z+ p% ~- l9 qC的最高位用来存放进位。 关系运算符:
/ ?. _4 J2 I- I3 }2 Q3 o: I, u$ Q/ C9 {) ~ I$ q) U" G
关系运算符:<,>,<=,>=
& u3 e _4 `: k4 n4 n
% t- U9 [' M' S8 D! P% x K和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg ,net还是integer。 相等运算符:==,!=
; o) t6 e$ {2 T2 I' _% N \/ d" l
- r F. P; G" O6 X9 b注意:===和!==是不可综合的。0 M2 J( j; B- ?2 ?- }3 R, e2 H3 B
# s Z6 J2 A' [- _可以进行有符号或无符号操作,取决于数据类型 移位运算符:
, ~7 ]& @+ p- ?( b( m2 }& e+ O L) R8 [( z& W" _8 o( R
左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。 部分选择:
* T0 V! o: d9 j2 K
! W' A2 ]* P3 y0 m2 U1 }部分选择索引必须是常量。 BIT选择:
6 f+ a. U3 h; a$ K
* B- N' T5 p* R8 lBIT选择中的索引可以用变量,这样将综合成多路(复用)器。 敏感表:
& l' \ r9 M6 X% l! U5 H. [9 s+ j$ q M
Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。 IF:7 W5 {# y f+ |/ q
9 Z# l; Y* ~! b0 e {- P! H* T) h如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。 循环:
b+ t# V* ~# w: v! L0 _% \" t# h* O$ t* a
只有for-loop语句是可以综合的。 设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。 不能在多个always块中对同一个变量赎值 函数
5 B+ s+ M6 I( E" X! `9 }
/ Y( Q0 M y0 P$ p9 F函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。 任务:& J0 k/ ]1 p6 ~ E3 {& ]% d
" y* ~( c3 i( v; F7 A; O4 t任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。 Z:
+ j1 l) b- T5 i; Y$ f7 [3 w k M; ~1 h( ^
Z会综合成一个三态门,必须在条件语句中赋值 参数化设计:
! R# q: F; k1 y3 H# }3 A6 d
* i; O( o0 S" t! s0 v s7 Z优点:参数可重载,不需要多次定义模块
: o" q7 v; X, |7 n9 r
9 Z% u4 }0 O1 t# V! @* f1 d' `三:模块优化
- v1 ~9 s! ]! F# n* Y9 d, u2 g4 T# E" a9 z0 h4 j
资源共享:
# x7 o3 s; O2 C6 V% j. Q( T1 ^
4 Z$ Q- r- w9 o5 V1 N当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。 共用表达式:) W H6 X5 k+ y, o
9 y4 ^! p& o, V- ?8 e$ t' T
如:C=A+B;
1 {% Y6 W/ E [1 A v ~4 U! c' a6 l8 o) N6 Y
D=G+(A+B);
9 c T8 P' q) s. X; N( Z2 F, t" I: b
两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器. 转移代码:
" ~" _6 c3 S& l% g7 n+ f2 P5 s) B p- a! W1 F, w% q
如循环语句中没有发生变化的语句移出循环. 避免latch:' l5 e5 C& [/ d' Z! ^
4 M3 l9 w- o5 k0 O, A, n' `; \6 S3 Z
两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。 模块:' ?+ y- H7 L& e; f
) ^7 j$ o% n- K4 @1 p9 _
综合生成的存储器如ROM或RAM不是一种好方法。最好用库自带的存储器模块。
$ O) J) y" Q3 V+ V% I' {# v+ X( F f
四、验证:
+ z4 D( C# r1 c' r/ [; G' U. [8 _2 c. I+ h2 w% Y
敏感表:# w- t% c& r( S# Y- r
4 }6 S) ~' F, c* i! a( P
在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。 异步复位:" ^# E: F0 x' k/ {* ]6 b
2 b# z( Q/ w! h4 R3 N# ^建议不要在异步时对变量读取,即异步复位时,对信号赎以常数值。
) z* q9 o5 g4 w' f, m2 D! E |
|