找回密码
 注册
关于网站域名变更的通知
查看: 441|回复: 1
打印 上一主题 下一主题

FPGA中不可综合语句 相关知识 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-25 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-3-25 16:19 | 只看该作者
这个帖子很实用啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-29 13:00 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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