关于verilog中语句可不可综合

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。 
    (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 
    (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 
 
建立可综合模型的原则 
    要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:     (1)不使用initial。     (2)不使用#10。 
    (3)不使用循环次数不确定的循环语句,如forever、while等。     (4)不使用用户自定义原语(UDP元件)。     (5)尽量使用同步方式设计电路。 
    (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 
    (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 
    (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 
    (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 
    (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 
    (12)避免混合使用上升沿和下降沿触发的触发器。 
    (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 
    (14)避免在case语句的分支项中使用x值或z值。 
  
不可综合verilog语句 
 
1、initial                    
    只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么) 2、events: event在同步test bench时更有用,不能综合。 3、real 不支持real数据类型的综合。 4、time        不支持time数据类型的综合。 5、force 和release       
    不支持force和release的综合。 6、assign 和deassign       
   不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 7、fork join                 
    不可综合,可以使用非块语句达到同样的效果。 8、primitives     支持门级原语的综合,不支持非门级原语的综合。

9、table      不支持UDP 和table的综合。 
10、敏感列表里同时带有posedge和negedge 
    如:always @(posedge clk or negedge clk) begin...end     这个always块不可综合。 
11、同一个reg变量被多个always块驱动 12、延时以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。     如:a=#10 b; 
    这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b; 13、与X、Z的比较 
   可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。

时间: 2024-10-30 20:35:12

关于verilog中语句可不可综合的相关文章

关于Verilog 中的for语句的探讨

在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Testbench中for语句在生成激励信号等方面使用较普遍,但在RTL级编码中却很少使用for循环语句.主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费.简单的说就是:for语句循环几次,就是将相同的电路

Verilog中generate语句的用法

在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和条件语句中使用,为此,Verilog-2001增加了四个关键字generate,endgenerate, genvar, localparam,genvar是一个新增的数据类型,用在generate的循环中的标尺变量必须定义为gnevar类型. 首先设计一个1bit位宽的buffer_1,这里有几点

一段比较有意思的代码——介绍system verilog中的新增幅值语句

system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. 1 package definitions; 2 typedef enum logic [2:0] {ADD,SUB,MULT,DIV,SL,SR} opcode_t; 3 typedef enum logic {UNSIGNED, SIGNED} operand_type_t; 4 typedef union packed { 5 logic [23:

verilog中的latch到底是个啥??简直快疯了!!!!!

在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器的区别. 锁存器与触发器最大的区别在于,锁存器是电平触发,而触发器是边沿触发.锁存器在不锁存数据时,输出随输入变化:但一旦数据锁存时,输入对输出不产生任何影响. 二,为什么语句的不完整会导致锁存器的产生? 语句不完整即有某些情况的输入对输出无任何影响,根据锁存器的特征,反映到硬件电路即会产生锁存器.

verilog中defparam的用法 (verilog调用底层模块(只改变)参数的传递)

当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式: 1)defparam 重定义参数 语法:defparam path_name = value ; 低层模块的参数可以通过层次路径名重新定义,如下例: module top ( .....)input....;output....;defparam U1 . Para1 = 10 ;M1 U1 (..........);endmodulemodule M1(....);

verilog中defparam的用法

有机会看下defparam的语法了:如下: 当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式: 1)defparam 重定义参数 语法:defparam path_name = value ; 低层模块的参数可以通过层次路径名重新定义,如下例: module top ( .....)input....;output....;defparam U1 . Para1 = 10 ;M1 U1 (..........);end

verilog中assign和[email protected](*)的区别和值得注意

verilog描述组合逻辑一般常用的有两种:assign赋值语句和[email protected](*)语句.两者之间的差别有: 1. 被assign赋值的信号定义为wire型,被[email protected](*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性. 2. 另外一个区别则是更细微的差别:举个例子, wire a; reg b; assign a = 1'b0; [ema

NHibernate中Session与ASP.NET MVC中Action的综合使用

NHibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在NHibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库, 但是这里的Session并非指HttpSession,可以理解为基于ADO.NET的Connnection,Session是NHibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关,首先,我们需要知道, SessionFact

Verilog中变量位宽注意

Verilog中,变量定义方式可以为:reg[位宽-1:0] 数据名:reg[位宽:1] 数据名.其他变量也类似. 以reg变量cnt为例,当cnt位宽为4时,可定义为reg[3:0] cnt,或者定义为reg[4:1] cnt 当cnt赋值为3时,reg[3:0] cnt:cnt=3 等效为 cnt[3]=0,cnt[2]=0,cnt[1]=1,cnt[0]=1; reg[4:1] cnt:cnt=3 等效为 cnt[4]=0,cnt[3]=0,cnt[2]=1,cnt[1]=1; 当cnt被