EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
你知道verilog 中不可综合语句有哪些吗? " b3 @; x, @" a; L4 H5 }
7 x$ ~0 N7 G9 i7 B
(1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。. S6 S+ Y$ ]+ q
(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
5 |, d% H" u4 o$ _ (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
H/ w# s+ m2 X- ?, w, L, Y, g9 Q0 k' ^! s
建立可综合模型的原则& n/ {5 L" b7 o1 J h7 ^
要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:' k0 X" I. g3 j2 q" S
(1)不使用initial。
9 \4 G6 v$ g6 |% i6 T (2)不使用#10。+ V7 D% e0 H3 K& V: i: ~! [
(3)不使用循环次数不确定的循环语句,如forever、while等。6 i) c; O; [* E6 T
(4)不使用用户自定义原语(UDP元件)。5 L, ?$ G+ r" p* z4 ?
(5)尽量使用同步方式设计电路。) i+ c& ^- o9 o( z' g, c5 ~- L
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
: |+ @' O. w) e+ L1 l (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
7 Z% C. o# z6 p5 p W (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
# z% ~% ~6 _6 L2 w7 t$ X) C7 ` (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
& E% b$ v5 v/ E (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
0 u2 o+ |- z. G' d0 o* R (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
( o. Y W" Y" T( @( P (12)避免混合使用上升沿和下降沿触发的触发器。
' U6 _7 y0 Q! z; @; j (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。
0 U& @) U6 b; h' T: K (14)避免在case语句的分支项中使用x值或z值。 8 a2 [+ i+ o7 z) H$ H: F
/ ^- N) J9 j* ?6 ~( c/ G4 |8 u' s
% T' R$ H& ~6 n" Y' j' l不可综合verilog语句 . |( h& G1 W" }- }. Q( j& E" F
1、initial ' I& S" e4 t! ]" a k6 |7 E/ U
只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)
8 v( ~4 l- q( S" s2、events - b1 [+ g9 q, A) P* J
event在同步test bench时更有用,不能综合。
9 I/ ~4 c7 b' V2 i+ j/ t; c3、real
- X1 U) F4 n* V 不支持real数据类型的综合。
! d. W7 M& F, Y9 m# x4、time ( D a |3 r7 D
不支持time数据类型的综合。
4 u G' L, ~3 h5、force 和release
! }3 A. [4 B( O1 p, o) t* v# } 不支持force和release的综合。
, b6 U0 R+ m+ S& ^- C+ U6、assign 和deassign
$ k3 r# g+ p/ _( Z* s 不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 3 d" _# p: j6 c; e I
7、fork join ( m8 e g( a- W! i; Z0 j/ a
不可综合,可以使用非块语句达到同样的效果。 " ^, t# V0 H1 k) X5 E8 j# o6 Z
8、primitives 0 t6 `" M2 c( b
支持门级原语的综合,不支持非门级原语的综合。 5 @3 \" j/ o# c/ t/ {* y+ R
9、table / B0 p9 O! o/ u3 g( _/ y" n
不支持UDP 和table的综合。7 G4 E* b" d: X+ K ?
10、敏感列表里同时带有posedge和negedge 1 i0 j0 H! A3 D2 Y# n/ r0 H6 X
如:always @(posedge clk or negedge clk) begin...end P5 {/ E4 ^/ M" h- E
这个always块不可综合。
" X; Q, E- R: r+ A' }% @8 z, K; \11、同一个reg变量被多个always块驱动
6 _* n. U) k! ` \+ v" G5 a& g12、延时 + J2 }/ Q0 Z5 A. M
以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。 6 E" o& j4 I/ z/ E
如:a=#10 b; ! x/ u/ z8 _; i+ w
这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b; . `0 w: `% }& Q* W/ U- G
13、与X、Z的比较
& f( x+ F& l5 g( [ 可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。 2 S$ W, t4 l8 E9 H+ A# o |' n( h1 u$ r
如:
' q' q6 D! M+ ?4 u3 ?. p1 module synthesis_compare_xz (a,b);
" f3 l5 o: n/ C" N+ |2 output a;* w k3 k7 K" x1 Z: B9 u! l
3 input b;) Q. L' j* B( H8 C( D l6 S: q
4 reg a;. |4 p: [/ c! T: k7 W" O
5
- u4 j; S8 z1 n6 always @ (b)
) T8 r/ O% u. q* t7 begin
, Q& d8 k/ R% A, ^8 if ((b == 1'bz) || (b == 1'bx)) begin9 W7 `2 S: h" L# _
9 a = 1;( \- L6 n' |" ~: v$ _
10 end else begin1 I( Y4 e) c$ `1 o; S* l
11 a = 0;
* {1 S9 h) Y0 j3 S) N12 end
$ ?* d: U' C/ x7 }, I0 p$ S8 X13 end 5 |! Y# h1 _5 I+ i4 ] D6 A
14 , K5 ^# |9 V b/ L3 X
15 endmodule
: R( L8 J1 e8 r4 d: X) J: ~
( M( S) A1 n U" @$ a' x0 V |