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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 House 于 2019-3-25 16:20 编辑
  n. N" P6 q9 b& I
- p" P$ W: O: a9 E  a0 N2 v

( y3 Q3 P- m9 y
1 x4 X2 Y( J" K; p- @  n6 r
今天我们来聊一聊FPGA中不可综合语句 相关知识。
- k- `( k/ X( @2 \- u8 ^3 k( M9 V9 f

; k9 ?% f, H' N- ^
2 }- _) _% x% ]        (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。
) i+ F/ F: K& L6 J        (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
; z; }" Q. U! F3 z        (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
4 S* R2 u" T6 w% F: Q# u( U  V) f+ j  s% ?# r. N6 T+ A0 c7 \4 i
8 @! N1 U0 r& C7 A# w
- b: }* W& M' x8 W
        建立可综合模型的原则
7 J5 C5 Q/ P( Q4 w            要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:
0 `8 [2 v9 B( }! h+ X# M    (1)不使用initial。: {3 \0 a$ W  ^& R1 p/ r
    (2)不使用#10。0 `7 Z$ g! I( t3 k2 v) x
    (3)不使用循环次数不确定的循环语句,如forever、while等。% G: A% C, e% e0 K: x
    (4)不使用用户自定义原语(UDP元件)。9 L/ b9 {0 m$ L* L9 k- R' K- C. n
    (5)尽量使用同步方式设计电路。0 I% U$ i3 f  d7 ]7 X8 F& l
    (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
" q& {1 N; Z. M2 W6 R8 S! m    (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。% W2 a" T5 K* I5 g" z) m( B0 t2 {
    (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
! ?; C6 `2 D0 Y; i5 @5 i0 H0 X    (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
0 t/ \/ }3 n% m/ M, \" L. n# K0 x5 h    (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
1 s) R# o* s- @& z. H    (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。' S( J3 ]# m' m0 Q! b
    (12)避免混合使用上升沿和下降沿触发的触发器。+ y0 N" C1 g1 [+ P) |+ x4 q
    (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。( e3 i  v; C5 f6 _
    (14)避免在case语句的分支项中使用x值或z值。
' `9 i5 w; x* f! g, g1 d. g$ c1 H  v8 J8 _+ B/ R

+ l1 f1 ~/ |7 K: m
7 I1 t! ?6 e! m- f% i        1、initial                   * `( G1 d( Q4 a! q# Y. `( d7 v
            只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)2 s/ E- n( O* ~* D
        2、events                  
' A# ?% V. C0 ]7 _            event在同步test bench时更有用,不能综合。/ I* d6 ]- P) B  G6 f9 z, d; @0 R7 L
        3、real                       3 v( U" u& l; E  }+ I) v' Y1 s
            不支持real数据类型的综合。
" }8 q3 F9 i' {" U        4、time                           6 R/ m: ^% Z2 H' I$ t
            不支持time数据类型的综合。9 I) d; g' O9 R2 w1 M: `( F
        5、force 和release      
5 [( C( w0 _8 _! ]) b& D$ P            不支持force和release的综合。
; a: S. _) n( }( O7 ^3 c        6、assign 和deassign      0 v) ?% v- \$ F& }% W
           不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。3 b: i! f& u1 X8 `8 S" B9 l
        7、fork join                ! j7 \9 f! t/ }3 g7 h  t
            不可综合,可以使用非块语句达到同样的效果。2 R3 w* A- r- q, S
        8、primitives               
# r+ b) s% h: I6 c0 Y/ u& |" ]            支持门级原语的综合,不支持非门级原语的综合。
% B9 C7 G* b6 M0 k        9、table                    - m  D! R' }% k$ k6 R7 S, Q
           不支持UDP 和table的综合。( z; Z% s/ l  q* t8 \
        10、敏感列表里同时带有posedge和negedge1 K" a+ S9 c  A/ M1 H9 G0 l) q8 h) L
            如:always @(posedge clk or negedge clk) begin...end
4 B. X4 g8 f( U8 h' Z0 {            这个always块不可综合。
9 e2 k% v; z* O. _5 X3 j        11、同一个reg变量被多个always块驱动
4 o; _  b& x9 n3 C5 v3 ?        12、延时; ^1 a, E- ~* E. y
            以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
6 B, \0 L5 E2 [. W% \            如:a=#10 b;2 L4 s0 N( y* ?9 a/ J6 ^9 x' x. k
            这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;
; `) p/ \) u; P" H# b, ]5 Q        13、与X、Z的比较7 |) X# n- q2 m
            可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。, |* G' Z8 ]  _+ E4 J" [
            如:
2 E! t8 o  s/ q8 K% U" ]; I        1 module synthesis_compare_xz (a,b);
- N" k' u$ n/ q4 n$ g8 U1 E        2 output a;
1 I# L! t5 @# `0 a; K! E        3 input b;
! c; ~( M/ O* F* _5 d        4 reg a;; J  J) A) E$ ]" `
        5   
6 `& c8 T  Y3 ~5 B        6 always @ (b), p$ h7 I0 s* P& X
        7 begin1 d+ R5 g  J& J( R
        8   if ((b == 1'bz) || (b == 1'bx)) begin
$ R' h; q- M7 h4 m        9     a = 1;
$ R" G3 _9 ^  d# f        10   end else begin# Q* o5 A7 R* b& `' j
        11     a = 0;
+ I, H$ _# A2 K: F' J. @0 u        12   end3 `& j' i) W& A' x( ~2 h0 D3 B
        13 end
( ^. O0 R  T# q3 N! E6 R& x        14   
( T# L! s1 z3 H0 r4 j  |* [        15 endmodule. Y' V0 ?& x5 O0 \
- l0 }' [4 ]3 Y( E3 x: D

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 01:03 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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