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

你知道verilog 中不可综合语句有哪些吗?

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    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" s

    2、events                  

    - b1 [+ g9 q, A) P* J

        event在同步test bench时更有用,不能综合。


    9 I/ ~4 c7 b' V2 i+ j/ t; c

    3、real                       


    - X1 U) F4 n* V

        不支持real数据类型的综合。


    ! d. W7 M& F, Y9 m# x

    4、time                           

    ( D  a  |3 r7 D

        不支持time数据类型的综合。


    4 u  G' L, ~3 h

    5、force 和release      


    ! }3 A. [4 B( O1 p, o) t* v# }

        不支持force和release的综合。


    , b6 U0 R+ m+ S& ^- C+ U

    6、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& g

    12、延时

    + 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 ?. p

    1 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
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-3 12:44 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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