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

FPGA中不可综合语句汇总

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
FPGA中不可综合语句汇总
5 P8 y9 S4 \0 L- V, {

9 ]% V4 k) R) V* d* G9 Z3 e
(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。- ]: K/ |  |3 h
        (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。$ F0 ~9 Q9 M2 `# ], v/ \, ~2 g$ K4 b
        (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。9 E* v3 S. c# S
1 \; d$ _# B) M2 i: |% m
        建立可综合模型的原则  \& Y  p; V9 {7 v
         要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:( @7 A( Y6 U& K) P% Y* x4 `2 A8 \
        (1)不使用initial。* S% q- n) a! f) h1 M8 n, l5 X
        (2)不使用#10。
3 R; _- w5 \0 z7 N6 r3 p        (3)不使用循环次数不确定的循环语句,如forever、while等。
. K! m7 w/ H, S        (4)不使用用户自定义原语(UDP元件)。+ |) E6 q1 e3 D! n- b
        (5)尽量使用同步方式设计电路。: Y, K4 M' h5 x- T& o8 A
        (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。" L5 f) d# |: s+ s" z
        (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
, t! {3 S4 w! a6 I        (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。% x( B3 j5 r2 f3 g
        (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
- b+ B6 n; _7 u2 U: I. P        (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
; K. p# N3 J. B8 K$ k8 c        (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
, K% N- A/ d" H4 t, C( {        (12)避免混合使用上升沿和下降沿触发的触发器。# D& J6 s! h& u- a" m2 ]; y. T
        (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。8 |: k7 N. J' U2 x  \
        (14)避免在case语句的分支项中使用x值或z值。
! q$ m8 s, S6 r& L2 J( }. C! I4 A( p7 K' q: K" q
        不可综合verilog语句; i' S$ Q% h# j* J; I" P
        1、initial                   2 h" I% t( V& Y1 L
                 只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)) {2 T: a6 o; ~2 C7 T7 q& s
        2、events                  9 h- b- \8 G! m
                 event在同步test bench时更有用,不能综合。/ N! U* q9 W2 X2 _
        3、real                       
8 f$ A; p9 B- X! i- j) j, R6 A                   不支持real数据类型的综合。
0 d  v2 a; }3 K8 u. u" n        4、time                           
$ R; B' M" `. {& n% r                    不支持time数据类型的综合。
6 \! m3 @+ P" l) ?9 g" ~8 a        5、force 和release      2 R, L0 ]% E7 z% f/ s7 c8 Z4 `
                  不支持force和release的综合。' e: P8 O. i7 g
        6、assign 和deassign      - N) y  l  Y. X7 N
                  不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。
% |6 u8 I9 U7 v; |; o4 k        7、fork join               
7 V, A% p) c. [2 L                   不可综合,可以使用非块语句达到同样的效果。
: i/ w# G# l3 e2 g6 [- p        8、primitives                # g, f  ]" W7 y' V) B
                  支持门级原语的综合,不支持非门级原语的综合。
( E& j$ R9 e& Y$ t7 s- c6 }3 H        9、table                    
1 Q! X  g) Q8 t/ A                   不支持UDP 和table的综合。- q1 X/ c7 i0 B$ J4 K4 r
        10、敏感列表里同时带有posedge和negedge- s3 |, v* I0 d. Z0 u; B; F' y+ N" |
                  如:always @(posedgeclk or negedgeclk) begin...end& O* w7 ]2 }0 t4 J4 y: s1 D  V3 Z: r
                   这个always块不可综合。
+ \" q: H4 w& E. ~- s        11、同一个reg变量被多个always块驱动7 B6 U9 c! N5 w) f+ G3 k. F) T
        12、延时& a- Z/ l; h5 @* p/ m  w* X
                   以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
8 i- F9 r7 Q  I! Z" C                   如:a=#10 b;4 P  V' S( s1 ?$ F5 A: |& i3 W" K
                   这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;
! l9 S$ @+ Y* ?& ?7 P        13、与X、Z的比较5 b3 `; u6 M& X$ k5 ^
                  可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。- t' ~# v  h) w+ X
            如:
; t6 H% p' K. ?, h& Q" {/ l                module synthesis_compare_xz (a,b);
, I9 j4 M# {' X) W                output a;
' {. B) {* m2 Z4 R) ?7 R  o                input b;  X: P: [' K+ ?3 a
                reg a;
; a$ b9 T5 K  s. M8 v, E   
0 j' O4 z! n, \) o0 r8 O$ t                always @ (b)
! L( ~( F  Z+ g% A5 O9 l. @! Y                        begin
' t1 K; g" ^/ c# _  p                                if ((b == 1'bz) || (b == 1'bx))
2 E1 H/ Z* w# b; C                                         begin
( z! ]; j' l* h  S7 L5 J- M                                                a = 1;
3 M. C1 q$ }& x8 Q& G                                        end
" r' K" J$ G) @+ Y                                else
# l5 z* W6 Q- i; ?; Z# c) Z                                         begin
; c1 |2 i  V/ g( T& C3 B5 ^6 d                                                a = 0;/ @% r4 `3 A8 _
                                        end
, e/ [- O) R7 |                        end ) k! c- ]' Y& {2 A
  ' m( ]( M6 \1 e' }, E5 N  T# _- t) Q4 x& t
endmodule
' v' t5 k# c0 Y2 v; g, C

1 M" E8 G; Y$ W; C7 n# k# [7 d. u+ h( O+ U! O
; K0 }, x5 W8 H- Z: S0 `, Q
" U, L. l. ]0 |1 \- T! o5 h
7 j" j. R* L6 P6 G5 R

8 ?: `0 Y1 L. M8 w0 {! b
0 h: M$ @; \1 Y& U) Y
) E5 c3 }& X" e' w% p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 13:49 , Processed in 0.109375 second(s), 25 queries , Gzip On.

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

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

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