|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 House 于 2019-3-25 16:20 编辑
/ C, O2 }! [1 ]% C3 M' G7 S) C4 \! a6 `! v5 U& q# _3 {
2 U+ t$ a! P# q5 `. S
! [" t6 _3 l& x3 X4 z1 ~
今天我们来聊一聊FPGA中不可综合语句 相关知识。
9 c4 A9 u8 s& B4 r8 P, S4 z5 b4 x9 T
# L1 K$ ^) L: M7 Y0 r
; R3 K/ h j2 M2 c3 G% p (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。
/ g5 v4 K8 g7 R; ` (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。+ u& x/ l- p5 R1 D
(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。, K9 _' W0 x5 _( P# h7 B# K0 Q
' k6 |( F3 a) A+ \
2 Y% D7 B- @! F8 f! U; T8 f) j
+ n5 L; h5 g6 T" ?7 y 建立可综合模型的原则
5 B7 ]+ ]5 L3 C: Y. F8 ]" c1 u( p 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:
; d# i ]$ ~/ x/ s (1)不使用initial。 g9 `0 b6 ?0 b# x* n0 R# x
(2)不使用#10。1 w$ a4 z) p4 f- E
(3)不使用循环次数不确定的循环语句,如forever、while等。3 k) R! ]9 O9 Z2 B* p' R
(4)不使用用户自定义原语(UDP元件)。
0 T4 Z) @- C* O( |6 ~* J: y (5)尽量使用同步方式设计电路。1 ]- \! d" [3 B C5 e! O
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
" p0 C" e/ G5 n6 R (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。# r6 _6 m3 m( d! e0 i" |% j
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。: }4 z$ p1 Q: w7 A8 J' Q: g
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。% n9 W- P0 l: i. P3 n7 z$ D0 O5 ~
(10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
& n) C) H( s' ^9 g2 P c' W; y/ ` (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
; P# _- ~! L1 C5 B0 O/ p0 W (12)避免混合使用上升沿和下降沿触发的触发器。
' b) f: P1 f2 I0 y- ?& ^ (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。! P }8 P# Y7 @+ g
(14)避免在case语句的分支项中使用x值或z值。9 I" ~* u& A* I2 [& Z
6 t/ |, x, L* p, b
- F: @, y ^5 ~( e) V6 }/ }; b. n% K
1、initial 4 V) L2 X" e8 w( T& F7 _" L& V
只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)" B, f1 l3 V, b: B9 {6 ^5 l( \) [/ a( e
2、events
k! u- o, r8 o5 `, a event在同步test bench时更有用,不能综合。3 g8 T+ G0 ]: {# r$ l
3、real
+ k6 T0 l _7 W% y" d- x 不支持real数据类型的综合。/ R3 v' j' V/ s
4、time
% g5 a; k8 ]) d 不支持time数据类型的综合。5 g# N; s5 `7 M
5、force 和release 2 z. \6 }9 r. G- u1 f) Y" J
不支持force和release的综合。
! a. l. R- y ?! Y# ?) ~7 K( { 6、assign 和deassign " M0 O& j- n) K+ E4 h
不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。9 h0 I, {# h, {( J* }
7、fork join ) d; T5 q9 Z0 R8 J* W4 ]$ c
不可综合,可以使用非块语句达到同样的效果。* L( r Q5 F% B% W9 f# |4 g
8、primitives 4 X) u: m* J9 J1 x* W$ _
支持门级原语的综合,不支持非门级原语的综合。( F+ X! K! [: N0 @8 I3 o8 o
9、table 0 e+ t4 q; H: S. m7 G j% E
不支持UDP 和table的综合。% l: m8 E- T! m8 t
10、敏感列表里同时带有posedge和negedge( e5 F4 q# L) [2 y( S* v7 `
如:always @(posedge clk or negedge clk) begin...end1 V0 n" u% `- I( R
这个always块不可综合。 u4 N+ }' D% o8 S: Z3 @: B% J
11、同一个reg变量被多个always块驱动
; ~# x) }3 ~- f( w/ y" E' Z; M 12、延时
9 |/ U8 h, \; A8 k- } 以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。+ s& P1 n2 ]# q' O+ S
如:a=#10 b;* d$ t+ u+ d+ ]$ }9 J1 R$ i
这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;
1 A: ^; }3 O8 |# t2 J$ | 13、与X、Z的比较 b4 ]6 ?( Q) @2 [! h; j
可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。2 r7 d- b6 d, h
如:) u% D4 p: u. d+ L1 h6 C
1 module synthesis_compare_xz (a,b);
6 {% E! K( S8 b6 [5 h @ 2 output a;
) r! r9 P* [! ]% J 3 input b;: [: ?; [' ~3 K9 o; p
4 reg a;" o4 P, w" u) W! Y# D1 Q, }
5 / U7 J$ d7 v. c: X5 m. h3 h
6 always @ (b)
4 a3 A% Z! @- ]5 B: z. e 7 begin& D( X, J J6 ]: x1 F* l
8 if ((b == 1'bz) || (b == 1'bx)) begin
/ E4 ~8 K0 [9 J5 }6 X 9 a = 1;! q0 p# N3 ^# {, V# ~- i5 O
10 end else begin
) T2 I" ]$ l/ Q! p& h F 11 a = 0;
& \: r' U+ o" x& V1 n* L+ a 12 end4 y+ `! x7 h0 \" r( C4 r/ D- u
13 end ) s, o0 h2 W) F
14 9 {2 b6 n/ N) ~; |8 e# C5 f: q5 h
15 endmodule, `, p" ?, m" t. f- i
|
) L! J7 _0 Y: { ^; c |
|