verilog语言的综合与不可综合

合集下载

可综合的verilog

可综合的verilog

Function和task有的工具支持,有的工具不支持,一般函数描述纯组合逻辑可以综合。

1. 可综合1. 所有综合工具都支持的结构[plain]view plaincopy1.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有些工具支持,有些工具不支持:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repreat,task,while 2. 建立可综合模块的原则1. 不要用initial(FPGA上电时初始状态不定,一般需要上电复位信号,在复位信号有效的时候进行初始化,上电复位信号可以由外部手动输入,也可以系统自己产生,转一篇博客,P.S.现在的综合软件功能已经足够强大,即使写了initial语句,在ISE13.3中仍然是可综合的,而且没有warning和info的提示)2. 不使用#10(在仿真中有用,实际在硬件上不会实现)3. 不使用循环次数不定的循环语句,如forever、while等4. 不使用用户自定义原语(UDP原件)5. 除非是关键路径设计,一般不采用调用门级原件描述的设计的方法,建议采用行为语句完成设计6. 尽量使用同步方式设计电路7. 用always语句描述组合逻辑时,在敏感信号列表中要列出所有输入信号8. 所有的内部寄存器都应该可以被复位,在FPGA设计时应尽量使用器件的全局复位端信号作为系统的总复位9. 时序逻辑使用非阻塞赋值,组合逻辑使用阻塞赋值,同一过程块中不要同时使用阻塞和非阻塞两种方式10. 不要在不同的always过程块中对同一变量赋值(否则综合时会提示有多驱动源错误,multiple source),对同一赋值对象,不能既使用阻塞赋值,又使用非阻塞赋值11. 如果不打算把变量综合成锁存器,在if语句或case语句的所有分支中都要对变量明确赋值(不能省去else或default,原理:在省去的情况下,变量的值会保持原来的值不变,所以系统会综合出一个锁存器)12. 避免混合使用上升沿和下降沿触发器13. 同一变量的赋值不能受多个时钟控制,也不能受两种不同时钟条件(或不同时钟沿)控制14. 避免在case语句中使用x或z值2. 不可综合1. 所有综合工具都支持的结构[plain]view plaincopy1.time,defparam,$finish,fork,join,initial,delays,UDP,wait2. 不可综合语句1. initial 只能在Testbench中使用,不能综合2. events 在Testbench中更有用,不能综合3. real 不支持real类型的综合4. time 不支持time类型的综合5. force 和release6. assign 和deassign不支持对reg类型的数据进行assign和deassign综合,支持对wire类型进行assign和deassign的综合7. fork join 不可综合,可以用非块语句达到同样的效果8. primitives 支持门级原语综合,不支持非门级原语综合9. table 不支持table和UDP的综合10. 敏感符列表中同时有posedge和negedge,如always @ ( posedgeclk ornegedgeclk ) begin ...end11. 同一个reg被多个always块驱动12. 延时,不可综合为硬件电路延时,综合工具会忽略延时,但是不会报错13. 与x、z比较,综合工具会忽略,所以要保证信号只有两个状态,0或1。

systemverilog 可综合 语法

systemverilog 可综合 语法

systemverilog 可综合语法-概述说明以及解释1.引言1.1 概述SystemVerilog是一种硬件描述语言,其可综合语法用于描述硬件设计的行为和结构。

可综合语法是指在编写SystemVerilog代码时,能够被综合工具翻译成底层硬件电路,并最终映射到FPGA或ASIC等可编程器件上的语法规则和风格。

因此,可综合语法在硬件设计中起着至关重要的作用。

在硬件设计中,可综合语法使设计工程师能够通过代码描述硬件的功能和结构,包括处理器、逻辑电路、存储器等。

通过使用可综合语法,设计工程师可以更加灵活地实现各种功能和性能要求,同时也能提高设计的可维护性和可重用性。

SystemVerilog的可综合语法特点是其结构化的设计风格,丰富的数据类型和内置的高级语言功能。

与传统的硬件描述语言相比,SystemVerilog提供了更多的抽象层次和编程特性,可以更高效地完成复杂的硬件设计任务。

例如,SystemVerilog支持面向对象的设计方法,可以使用类和对象对设计进行建模和封装。

此外,SystemVerilog还提供了多种数据类型和运算符,使设计工程师可以更方便地处理各种数据和信号。

综上所述,可综合语法在SystemVerilog中具有重要的地位和作用。

通过使用可综合语法,设计工程师能够更加方便地描述和实现各种硬件功能,提高设计的效率和可靠性。

在今后的硬件设计中,可综合语法的应用将更加广泛,并且不断发展和完善,以满足不断变化的设计需求。

1.2 文章结构文章结构部分的内容可以包括以下内容:文章结构的目的是为了给读者提供清晰的导航和理解文章的逻辑框架。

通过合理的结构,读者可以更好地理解文章的目的和内容,并能够有序地阅读和理解整个文档。

本文的结构如下:第一部分是引言部分,用于介绍文章的背景和相关信息。

在引言部分,我们将概述SystemVerilog可综合语法的定义和作用,并介绍本文的结构和目的。

第二部分是正文部分,主要内容是关于SystemVerilog可综合语法的定义和特点。

verilog综合心得

verilog综合心得

综合:不可综合的运算符:= = = ,!= =,/(除法),%(取余数)。

1、不使用初始化语句。

2、不使用带有延时的描述。

3、不使用循环次数不确定的循环语句,如:forever、while等。

4、尽量采用同步方式设计电路。

5、除非是关键路径的设计,一般不调用门级元件来描述设计的方法,建议采用行为语句来完成设计。

6、用always过程块描述组合逻辑,应在信号敏感列表中列出所有的输入信号。

7、所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。

8、在verilog模块中,任务(task)通常被综合成组合逻辑的形式,每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。

9、用户自定义原语(UDP)是不可综合的,它只能用来建立门级元件的仿真模型。

移位运算符:Verilog HDL提供向右(>>)及向左(<<)两种运算符,运算符高位或地位一旦移出即予丢弃,其空缺的位则予以补零。

连续赋值语句(assign)、case语句、if…else语句都是可以综合的initial 语句内若包含有多个语句时,必须以begin end 作聚合;单一的初值赋值,因此并不需以begin end做聚合。

循环(Loops)并不能单独地在程序中存在,而必须在initial和always块中才能使用。

initial过程块中的语句仅执行一次,而always块中的语句是不断重复执行的。

编写顶层模块的注意事项每个端口除了要声明是输入、输出还是双向外,还要声明其数据类型,是连线型(wire)还是寄存器型(reg),如果没有声明则综合器默认为wire型。

1、输入和双向端口不能声明为寄存器型。

2、在测试模块中不需要定义端口。

编写testbentch所归纳的心得module 模块名称;将input 定义为reg;将output定义为wire;引用欲测试的module 别名initial begin设定reg 初始值endalways处理变化值endmodule在always 、initial 过程块内,被赋值的每一个信号都必须定义成寄存器型。

verilog数字系统设计教程习题答案

verilog数字系统设计教程习题答案

verilog数字系统设计教程习题答案第二章1.Verilog HDL 既是一种行为描述语言,也是一种结构描述语言。

如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互联的结构模块。

这意味着利用Verilog语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。

2.模块的基本结构由关键词module和endmodule构成。

3.一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。

其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。

利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。

4.Verilog HDL和VHDL作为描述硬件电路设计的语言,其共同的特点在于:能形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去)、便于文档管理、易于理解和设计重用。

5.不是6.将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。

7.综合工具可以把HDL变成门级网表。

这方面Synopsys工具占有较大的优势,它的Design Compile是作为一个综合的工业标准,它还有另外一个产品叫Behavior Compiler,可以提供更高级的综合。

另外最近美国又出了一个软件叫Ambit,据说比Synopsys的软件更有效,可以综合50万门的电路,速度更快。

今年初Ambit被Cadence公司收购,为此Cadence 放弃了它原来的综合软件Synergy。

verilog语言的综合与不可综合

verilog语言的综合与不可综合

Verilog的综合与不可综合综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。

不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。

一、基本Verilog中的变量有线网类型和寄存器类型。

线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。

二:verilog语句结构到门级的映射1、连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。

因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。

Assign语句中的延时综合时都将忽视。

2、过程性赋值:过程性赋值只出现在always语句中。

阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。

建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。

过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。

如,时钟控制下的非阻塞赋值综合成flip-flop。

过程性赋值语句中的任何延时在综合时都将忽略。

建议同一个变量单一地使用阻塞或者非阻塞赋值。

3、逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门4、算术操作符:Verilog中将reg视为无符号数,而integer视为有符号数。

因此,进行有符号操作时使用integer,使用无符号操作时使用reg。

5、进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。

如:Wire [3:0] A,B;Wire [4:0] C;Assign C=A+B;C的最高位用来存放进位。

6、关系运算符:关系运算符:<,>,<=,>=和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

7、相等运算符:==,!=注意:===和!==是不可综合的。

可以进行有符号或无符号操作,取决于数据类型8、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。

verilog第二章简单的Verilog模块

verilog第二章简单的Verilog模块
not u1(nsl, sl);
and #1 u2(sela, a, nsl);
and #1 u3(selb, b, sl);
or #1 u4(out, sela, selb);
endmodule
/*一个名为adder的三位加法器的例子。*/
module adder ( count,sum,a,b,cin ); //模块定义开始
// 选择逻辑组合
2.2.2 模块的概念
一个设计是由一个个模块构成的。一个模块的设计如下:
1 模块内容是嵌套在module和endmodule两个语句之间。每个
模块实现特定的功能,模块是可以进行层次嵌套的。正因为
如此,才可以将大型的数字电路设计分割成不同的小模块来
实现特定的功能,最后通过顶层模块调用子模块来实现整体
endmodule
数据流语句
▪这个例子描述了一个三位的加法器。从例子中可以看出整个
Verilog HDL程序是嵌套在module和endmodule声明语句里
的,只出现了一个assign语句。
例SR触发器模块
S
Q
//SR 触发器
module SR_FF (Q, Q_n,S,R);
R
Q_n
output Q, Q_n; //端口声明
input S,R;
nand n1(Q, S,Q_n);
nand n2(Q_n,R,Q);
nand为verilog
中的与非门门级
原语部件
endmodule
模块中的5个部分并没全部出现,只出现在
低层次模块实例化
D触发器模块
//D 触发器
module D_FF (d, clk,clr,q,qb);

Verilog设计的可综合性与问题分析

Verilog设计的可综合性与问题分析

Verilog设计的可综合性与问题分析前⾔⽤Verilog HDL编写的设计模块最终要⽣成实际⼯作的电路,因此,设计模块的语法和编写代码风格会对后期电路产⽣影响,所以,若要编写可实现的设计模块,就需要注意⼀些问题可综合语法可综合的设计是最终实现电路所必需的,所以弄清哪些语法是可综合的,哪些语法是不可综合的⾮常有必要,⽽且设计者也必须知道⼀个代码能否被综合成最终电路;例如:写⼀个简单的除法a/b,想妄图直接通过综合⼯具⽣成⼀个除法器是不现实的,还有有符号数和浮点数的时候也需要注意。

总之,设计者的思路定要从软件⾓度转变到硬件⾓度,很多在软件中可以直接使⽤的情况到了硬件电路就需要从很底层的⾓度来编写。

可综合的语句有:1)module 与 endmodule 模块声明的关键字2)输⼊input,输出output和双向端⼝inout的声明3)变量类型reg,wire,integer4)参数parameter和宏定义define5)所有的Verilog HDL内建门,如:add,or之类的门6)数据流语句assign语句7)⾏为级中敏感列表⽀持电平和边沿变化,类似posedge,negedge8)always,function可以被综合,task中如果不含延迟可以被综合9)顺序块begin……end可以被综合10)if和 case语句可以被综合不可被综合的语句在Verilog HDL中不可被综合的语法这⾥也简单列出来:(1)初始化initial结构不能被综合,电路中不会存在这样的单元。

电路中⼀旦通电就会⾃动获得初始值,除此之外时序电路可以⽤复位端完成初始化组合,电路不需要初始化(2)#带来的延迟不可被综合。

电路中同样也不会存在这样简单的延迟电路,所有的延迟都要通过计时电路或交互信号来完成(3)并⾏块fork…join不可被综合,并⾏块的语义在电路中不能被转化(4)⽤户⾃定义原语UP不可被综合(5)时间变量time和实数变量real不能被综合(6) wait ,event , repeat ,forever等⾏为级语法不可被综合(7)⼀部分操作符可能不会被综合,例如,除法/操作和求余数%操作补充:综合⼯具也在不断更新和加强,有些现在不能被综合的语法慢慢地会变得可以综合,像⽐较简单的initial结构在⼀些 FPGA⼯具中也可以被识别,同时能被转化为电路形式。

verilog中的可综合逻辑和不可综合逻辑

verilog中的可综合逻辑和不可综合逻辑

verilog中的可综合逻辑和不可综合逻辑⼀、verilog语法,可否综合总体有以下区分:(1)所有综合⼯具都⽀持的结构:always,assign,begin,end,case,wire,tri,supply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,inpu 可综合的运算符包括:> , < , >= , <= , == , != , >>, << (位移量为变量,则会综合出通⽤位移器), &, |, ^ , +, - ,*, /(某些综合⼯具可能不⽀持){[ ],[ ]} :部分选取和位选取操作,这个有点复杂。

部分选取仅⽀持常量部分选取。

如:1module PartSelect(2 in_a,3 in_b ,4 out_c);56input [3:0] in_a, in_b;7output [3:0] out_c;89assign out_c[2:0] = {in_a[2],in_b[3:2]};1011endmodule12// out_c[2:0] 和 in_b[3:2]即为部分选取位选取⽀持常量和⾮常量选取,⾮常量选取时会⽣成多路选择器或译码器。

如:1//常量位选取2module ConstantBitSelect(3 in_a,4 in_b,5 in_c,6 out_d7 );89input [3:0] in_a,in_b,in_c;10output [3:0] out_d;1112assign out_d[2:0] = {in_a[2],in_b[1:0]};13assign out_d[3] = in_c[2];14endmodule15//这⾥in_a[2],out_d[3] , in_c[2]都是位选取。

Verilog可综合与不可综合语句汇总

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过程块中对同一个变量赋值。

verilog中的可综合与不可综合语句

verilog中的可综合与不可综合语句

verilog中的可综合与不可综合语句
verilog中可综合语句:input,output,parameter,reg,wire,always,assign,
begin...end,case,for,posedge,negedge,or,and,default,if,function,generate,integer,while,repeat(while、repeat循环可综合时,要具有明确的循环表达式和循环条件,for可综合时也要有具体的循环范围),·define
不可综合语句:initial,fork...join,wait,time,display,forever。

保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:(1)不能使⽤initial,initial⼀般使⽤在测试程序,做初始化。

(2)不建议使⽤延时,#1,这种只是模拟数字电路中因为布线产⽣的信号延时,不可综合,但也不会报错。

(3)不能使⽤循环次数不确定的函数,但forever在综合设计中禁⽌使⽤,只能使⽤在仿真测试程序中。

(4)尽量使⽤同步电路设计⽅式。

(5)除⾮关键电路设计,⼀般不建议调⽤门级元件进⾏设计,⼀般使⽤⾏为级进⾏设计。

(6)当使⽤always进⾏组合逻辑设计时,敏感列表⾥⾯的要列出所有输⼊信号。

(7)在进⾏时序电路进⾏编写时,采样⾮阻塞赋值。

组合逻辑设计时,采样阻塞赋值,但是不能在同⼀个always语句⾥两种混合使⽤。

(8)为避免产⽣锁存器,if,case要进⾏完整的语句赋值,且case语句中避免使⽤X值,Z值。

virilog语法总结

virilog语法总结

1、verilog特点:★区分大小写,所有关键字都要求小写★不是强类型语言,不同类型数据之间可以赋值和运算★ //是单行注释可以跨行注释★描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原★门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE中针对不同FPGA器件已经有对应的基本元件原语verlog语法要点2、语句组成:★ module endmodule之间由两部分构成:接口描述和逻辑功能描述★ IO端口种类: input output inout★相同位宽的输入输出信号可以一起声明, input[3:0] a,b; 不同位宽的必须分开写★内部信号为reg类型,内部信号信号的状态: 0 1 x z, 3‘bx1=3’bxx1 x/z会往左扩展 3‘b1=3’b001 数字不往左扩展★逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能★ always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行3、常量格式: <二进制位宽><‘><进制><该进制的数值>:默认进制为10进制默认位宽为32位位宽是从二进制宽度角度而言的由位宽决定从低位截取二进制数2’hFF=2‘b11,通常由被赋值的reg变量位宽决定parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义4、变量种类: wire reg memory① IO信号默认为wire类型,除非指定为reg类型(reg和wire 的区别)wire可以用作任何输入输出端口wire包括input output inoutwire不带寄存功能assign赋值语句中,被赋值的信号都是wire类型assign之所以称为连续赋值,是因为不断检测表达式的变化reg类型可以被赋值后再使用,而不是向wire一样只能输出reg类型变量初始值为xalways模块里被赋值的信号都必须定义为reg类型,因为always 可以反复执行,而reg表示信号的寄存,可以保留上次执行的值reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来② memory型只有一维数组,由reg型变量组成memory初始化只能按地址赋值,不能一次性赋值1*256的memory写法: reg mema[255:0] mema[3]=0; 不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取A[a:b] 无论a b谁大,a总是实际电路的信号高位,b总是实际电路的信号低位算术运算中如果有X值则结果为Xfor循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在5、运算符(其他简单的书上有自己看)== 和!=只比较0、1,遇到z或x时结果都为x (x在if中算做假条件),结果可能是1、0、x===和!==比较更加苛刻,包括x和z的精确比较,结果可能是0、1 &&的结果只有1‘b1或1’b0两种, A&A的结果位宽则是与A相同的{1,0}为 64‘h100000000,所以拼接运算中各信号一定要指定位宽移位运算左移将保留 4'b1000<<1等于5'b10000,右移则舍弃 4'b0011等于4'b0001数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算6、非阻塞式赋值<=与阻塞式赋值=(比较)阻塞:在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞非阻塞:在同一个always过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被该赋值语句阻塞<=:块结束后才能完成赋值块内所有<=语句在always块结束时刻同时赋值<=右边各变量的值是上一次时钟边沿时,这些变量当时的值用于描述可综合的时序电路=:=语句结束之后过程always才可能结束在always过程中,begin end块内按先后顺序立即赋值,在fork join内同时赋值(可能造成冲突)与assign连用描述组合电路begin end中阻塞的含义:begin ...@(A) B=C...; end 如果A事件不发生则永远不能执行下去,被阻塞了由于时钟的延时(往往在ps级),多个always(posedge)之间究竟谁先执行是个未知数使用八原则:(1)时序电路建模时,采用非阻塞赋值(2)锁存器电路建模时,采用非阻塞赋值。

verilog语句可综合vs不可综合

verilog语句可综合vs不可综合

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,supply0,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过程块中对同一个变量赋值。

Verilog逻辑综合

Verilog逻辑综合

一、verilog结构类型
逻辑综合工具并不能处理随意编写的verilog结构描述:通常,周期到周期的任 何RTL verilog结构描述都能为逻辑综合工具所接受。
支持综合的Verilog结构类型
结构类型
关键字或描述
注释
端口
input, inout, output
参数
parameter
模块定义
module
计算机辅助逻辑综合工具的出现已经把高层次描述向逻辑门的转化过程自 动化了。设计者现在可以把精力集中在体系结构的方案、设计的硬件语言描 述上,由综合工具在内部进行几次反复,生成优化的门级描述。
自动化的逻辑综合已经非常有效地减少了高层次设计到门级网表的转化时 间。它使设计者可以把更多的时间用于更高层次的描述上,因为把设计转换 到门级网表所需的时间大大减少了。
s);
input d0, d1, s;
output out;
reg out;
always @( s or d0 or
d1)
if (s)
out
out = d1;
else
out = d0;
endmodule
定义了所有可能的选项的if—then嵌套语句,综合结果是受条件 控制的纯组合逻辑电路。
module compif (a, b, c, d,
z_1.SUM0_0_x2
XOR2
[1]
z_1.SUM1_0_x2
[1]
z_1.N_6_i_i.O
module increment (phy, ones,z); input phy; input [1:0] ones; output [1:0] z; reg [1:0] z; always @ (phy or ones) if (phy) z = ones +1; endmodule

verilog不可被综合的语句

verilog不可被综合的语句

verilog 不可综合语句总结汇总2009-04-20 18:37(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)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。

对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。

但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。

Verilog语言的可综合性

Verilog语言的可综合性

V e r i l o g 语言的可综合性可综合的Verilog HDL 语句都是V e r i l o g H D L 标准( I E E E 1 3 6 4 ) 的一个子集,并且因所用工具不同而异。

在设计中不能采用不可综合的语句( 测试代码除外) 。

下面我们讨论一下大部分综合工具都支持的语句,具体到某种工具的特性还要查看说明文档。

对于数据类型、运算符、赋值语句、基本门级元件等的可综合性问题,因为都有固定的规定,这里就不多讨论了。

组合逻辑和时序逻辑的可综合性: 用a s s i g n 语句对w i r e 型变量进行赋值,综合后的结果是组合逻辑电路。

用a l w a y s @ ( 电平敏感变量表) ,即电平敏感的a l w a y s 块描述的电路综合后的结果是组合逻辑电路或电平敏感的锁存器,此时,a l w a y s 块内赋值语句左边的变量是r e g或i n t e g e r 型,块中要避免组合反馈回路,每次执行a l w a y s 块时,在生成组合逻辑的a l w a y s 块中被赋值的所有信号必须都在敏感电平列表中列出,否则在综合时将会为没有列出的信号隐含的产生一个透明的锁存器,这时综合后的电路已不是纯组合电路了。

用a l w a y s @( p o s e d g e c l o c k ) 或a l w a y s @ ( n e g e d g e c l o c k ) 块描述的电路综合为同步时序逻辑电路,设计同步时序逻辑电路的关键是建立描述该电路状态转移的可综合的有限状态机模型,在V e r i l o g H D L语言中最常用的描述同步时序状态机的结构是a l w a y s 和块内的c a s e . i f 语句,除了紧跟在a l w a y s 后的@( p o s e d g e c l o c k ) , @ ( n e g e d g e c l o c k ) 外,a l w a y s 块中不允许其他的@ ( e v e n t ) 语句,目前大多数综合工具不能综合V e r i l o g H D L描述的异步状态机,所以用V e r i l o g 设计的时序电路应该是同步时序电路。

可综合的Verilog语句

可综合的Verilog语句

可综合Verilog语句⏹一:综合就是从采用Verilog HDL 语言描述的寄存器传输级电路模型构造出门级网表的过程.产生门级网表之后,逻辑优化器读入网表并以用户指定的面积和定时约束为目标优化网表.⏹二.设计流程中的综合⏹Verilog HDL允许用户在不同的抽象层次上对电路进行建模,这些层次从门级、寄存器传输级、行为级直至算法级。

因此,同一电路就可以有多种不同的描述方式,但不是每一中描述都是可综合的。

事实上,Verilog HDL 原本被设计成一种仿真语言,而不时一种综合语言。

结果导致Verilog HDL 中很多结构没有相应的硬件可以对应,例如系统调用$display.同样也不存在用于寄存器传输级综合的Verilog HDL 标准子集.⏹正是由于存在这些问题,不同的综合系统所支持的Verilog HDL 综合子集是不同的.由于Verilog HDL 中不存在单个的对象来表示锁存器或触发器,所以每一种综合系统都会提供不同的机制以实现锁存器或触发器的建模.因此各种综合系统都定义了自己的Verilog HDL 可综合子集以及自己的建模方式.⏹使用Verilog HDL 以不同的方式描述了同一电路.某综合系统支持对方式A和方式B的综合,但可能不支持对方式C的综合,这意味着综合模型在不同的综合系统之间通常是不可移植的.⏹这一局限性使设计者不仅需要理解Verilog HDL ,而且必须理解特定综合系统的建模方式,才能编写出可综合的模型.可综合的数据类型⏹1.网线数据类型:⏹Wire,wor,wand,tri,supply0,supply1⏹2.寄存器数据类型:⏹Reg,integer⏹Time,real:不能综合.⏹3.常量:⏹整型.⏹实型和字符串型不能综合.可综合的运算符⏹1.逻辑运算符能直接映射成硬件中的基本逻辑门.⏹2.算术运算符⏹3.关系运算符:⏹能综合的有:>,<,<=,>=.⏹4.相等性算符:⏹能够综合的有:==和!=.⏹不能综合:===和!==(有些工具按==和!=综合).⏹5.移位运算符:⏹<<和>>,移位腾出的位都补0.多个时钟的可综合情况⏹1.多个时钟的情况:对变量的赋值不能受多个时钟控制例如:⏹ module multclk(clk1,clk2,addclk,and,rstn,subclr,subn,dsadd,dssub);⏹input clk1,addclk,adn,rstn,subclr,subn,clk2;⏹output dsadd,dssub;⏹reg dsadd,dssub;⏹reg addstate,substate;⏹always @(posedge clk1)⏹begin⏹addstate<=addclk^(adn|rstn);⏹substate<=subclr^(subn&rstn);⏹end⏹always @(posedge clk2)⏹begin⏹dsadd<=addstate;⏹dssun<=substate;⏹end⏹ endmodule⏹2.多相位时钟:对变量的赋值不能受两种不同的时钟条件的控制.⏹module multphase(clk,a,b,c,e);⏹input clk,a,b,c;⏹output e;⏹reg e,d;⏹always @(posedge clk)⏹e<=d|c;⏹always @(negedge clk)⏹d<=a&b;⏹ endmodule用有限状态机实现的3位二进制计数器.(带进位)module fsm_count(clk,rst,dout,cout);input clk,rst;output [2:0] dout;output cout;reg cout;reg [2:0] dout;reg [3:0] state;always @(posedge clk){cout,dout}<=state;parameter zero=4'b1000,one=4'b0001,two=4'b0010,three=4'b0011,four=4'b0100, five=4'b0101,six=4'b0110,seven=4'b0111,init=4'b0000;always @(posedge clk)beginif(!rst)state<=init;elsebegincase(state)zero:state<=one;init:state<=one;one: state<=two;two:state<=three;three:state<=four;four:state<=five;five:state<=six;six:state<=seven;seven:state<=zero;default:state<=init;endcaseendend状态机设计的一般原则:状态机是逻辑设计中的最重要的设计内容之一,通过状态转移图设计手段可以将复杂的控制时序图形化表示,分解为状态之间的转换关系,将问题简化。

可综合的verilog语句

可综合的verilog语句

可综合的verilog语句摘要:一、引言1.Verilog 简介2.Verilog 语句的可综合性二、可综合的Verilog 语句1.基本赋值语句2.组合逻辑实现3.时序逻辑实现4.实例化模块三、Verilog 语句的可综合性分析1.基本赋值语句的可综合性2.组合逻辑实现的可综合性3.时序逻辑实现的可综合性4.实例化模块的可综合性四、提高Verilog 代码可综合性的方法1.遵循可综合编程规范2.使用可综合的语法结构3.模块划分与层次设计五、总结1.Verilog 语句可综合性的重要性2.提高代码可综合性的实际应用价值正文:【引言】Verilog 是一种广泛应用于数字电路设计和验证的硬件描述语言。

在Verilog 中,语句的可综合性指的是能否将Verilog 代码转换为实际硬件电路。

了解可综合的Verilog 语句对于编写高效的硬件描述语言代码至关重要。

本文将介绍可综合的Verilog 语句及其可综合性分析,并提出提高代码可综合性的方法。

【可综合的Verilog 语句】Verilog 中有很多可综合的语句,包括基本赋值语句、组合逻辑实现、时序逻辑实现和实例化模块。

1.基本赋值语句基本赋值语句包括阻塞赋值(assignment)和非阻塞赋值(non-blocking assignment)。

这两种赋值语句都是可综合的。

2.组合逻辑实现组合逻辑实现通常使用与门(and)、或门(or)、非门(not)等基本逻辑门实现。

这些逻辑门的Verilog 实现都是可综合的。

3.时序逻辑实现时序逻辑实现通常使用寄存器(register)、计数器(counter)等元件实现。

这些元件的Verilog 实现都是可综合的。

4.实例化模块实例化模块是通过使用`实例化`关键字将一个模块复制多次。

实例化模块的Verilog 实现也是可综合的。

【Verilog 语句的可综合性分析】1.基本赋值语句的可综合性基本赋值语句的可综合性取决于赋值的目标。

verilog x,z 在综合时的理解

verilog x,z 在综合时的理解

verilog x,z 在综合时的理解Verilog是一种硬件描述语言,用于设计和描述数字电路的行为。

在综合过程中,x和z是两个重要的逻辑值,它们分别表示未知和高阻态。

在Verilog中,x表示未知逻辑值,即信号的状态无法确定。

当信号的输入或输出存在多个驱动时,x的值会出现。

这种情况通常发生在电路设计不完整或存在冲突的情况下。

在综合时,x的处理方式取决于具体的综合工具和设置。

综合工具可能会将x视为0或1,也可能会保留其未知状态。

与x相似,z表示高阻态,也称为高阻(high-impedance)。

高阻态是指信号的输出电平处于中间状态,既不是高电平也不是低电平,而是处于一种不确定的状态。

高阻态通常用于多驱动电路,其中多个信号源可以同时驱动同一个信号线。

在综合过程中,x和z的处理是由具体的综合工具和设置决定的。

综合工具会根据输入的Verilog代码和设置来生成等效的门级电路描述。

对于x和z,综合工具可能会将其转换为特定的逻辑门电路,以确保电路的正确性和功能。

由于综合过程的复杂性,设计者需要仔细考虑信号的驱动和逻辑关系,以避免x和z的出现。

在Verilog中,x和z的存在可能会导致设计错误和功能故障。

因此,设计者需要通过正确的设计和验证方法来避免它们的出现。

这包括使用合适的电路设计规范,进行仿真和验证,在设计过程中避免冲突和不完整的逻辑,以及正确设置综合工具和其它相关工具。

总结起来,Verilog中的x和z代表未知和高阻态,在综合过程中需要注意其存在可能导致的设计错误和功能故障。

设计者需要通过正确的设计和验证方法来避免x和z的出现,并确保电路的正确性和功能。

Verilog语言的可综合性

Verilog语言的可综合性

V e r i l o g 语言的可综合性可综合的Verilog HDL 语句都是V e r i l o g H D L 标准( I E E E 1 3 6 4 ) 的一个子集,并且因所用工具不同而异。

在设计中不能采用不可综合的语句( 测试代码除外) 。

下面我们讨论一下大部分综合工具都支持的语句,具体到某种工具的特性还要查看说明文档。

对于数据类型、运算符、赋值语句、基本门级元件等的可综合性问题,因为都有固定的规定,这里就不多讨论了。

组合逻辑和时序逻辑的可综合性: 用a s s i g n 语句对w i r e 型变量进行赋值,综合后的结果是组合逻辑电路。

用a l w a y s @ ( 电平敏感变量表) ,即电平敏感的a l w a y s 块描述的电路综合后的结果是组合逻辑电路或电平敏感的锁存器,此时,a l w a y s 块内赋值语句左边的变量是r e g或i n t e g e r 型,块中要避免组合反馈回路,每次执行a l w a y s 块时,在生成组合逻辑的a l w a y s 块中被赋值的所有信号必须都在敏感电平列表中列出,否则在综合时将会为没有列出的信号隐含的产生一个透明的锁存器,这时综合后的电路已不是纯组合电路了。

用a l w a y s @( p o s e d g e c l o c k ) 或a l w a y s @ ( n e g e d g e c l o c k ) 块描述的电路综合为同步时序逻辑电路,设计同步时序逻辑电路的关键是建立描述该电路状态转移的可综合的有限状态机模型,在V e r i l o g H D L语言中最常用的描述同步时序状态机的结构是a l w a y s 和块内的c a s e . i f 语句,除了紧跟在a l w a y s 后的@( p o s e d g e c l o c k ) , @ ( n e g e d g e c l o c k ) 外,a l w a y s 块中不允许其他的@ ( e v e n t ) 语句,目前大多数综合工具不能综合V e r i l o g H D L描述的异步状态机,所以用V e r i l o g 设计的时序电路应该是同步时序电路。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Verilog的综合与不可综合综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。

不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。

一、基本Verilog中的变量有线网类型和寄存器类型。

线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。

二:verilog语句结构到门级的映射1、连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。

因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。

Assign语句中的延时综合时都将忽视。

2、过程性赋值:过程性赋值只出现在always语句中。

阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。

建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。

过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。

如,时钟控制下的非阻塞赋值综合成flip-flop。

过程性赋值语句中的任何延时在综合时都将忽略。

建议同一个变量单一地使用阻塞或者非阻塞赋值。

3、逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门4、算术操作符:Verilog中将reg视为无符号数,而integer视为有符号数。

因此,进行有符号操作时使用integer,使用无符号操作时使用reg。

5、进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。

如:Wire [3:0] A,B;Wire [4:0] C;Assign C=A+B;C的最高位用来存放进位。

6、关系运算符:关系运算符:<,>,<=,>=和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

7、相等运算符:==,!=注意:===和!==是不可综合的。

可以进行有符号或无符号操作,取决于数据类型8、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。

9、部分选择:部分选择索引必须是常量。

10、BIT选择:BIT选择中的索引可以用变量,这样将综合成多路(复用)器。

11、敏感表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。

12、IF:如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。

如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。

Case语句类似。

Case的条款可以是变量。

如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。

如果先读取,后赎值,则会产生latch。

13、循环:只有for-loop语句是可以综合的。

14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。

建议不要使用局部变量。

15、不能在多个always块中对同一个变量赎值16、函数函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。

17、任务:任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。

18、Z:Z会综合成一个三态门,必须在条件语句中赋值19、参数化设计:优点:参数可重载,不需要多次定义模块四:模块优化1、资源共享:当进程涉及到共用ALU时,要考虑资源分配问题。

可以共享的操作符主要有:关系操作符、加减乘除操作符。

通常乘和加不共用ALU,乘除通常在其内部共用。

2、共用表达式:如:C=A+B;D=G+(A+B);两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.3、转移代码:如循环语句中没有发生变化的语句移出循环.4、避免latch:两种方法:1、在每一个IF分支中对变量赋值。

2、在每一个IF语句中都对变量赋初值。

5:模块:综合生成的存储器如ROM或RAM不是一种好方法。

最好用库自带的存储器模块。

五、验证:1、敏感表:在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。

2、异步复位:建议不要在异步时对变量读取,即异步复位时,对信号赎以常数值。

欢迎进入超前MCU 技术论坛对关于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值。

不可综合语句:1)initial 只能在test bench中使用,不能综合。

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。

来自:人人网日志可综合指那些可以综合成FPGA(ASIC)中某种结构的语言要素。

而不可综合则主要用于设计的验证、仿真。

比如流行的quartusII或xinlinx软件只支持可综合的verilog语言。

因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module. 比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register, 如果是,它的clock是什么? D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。

同样,Verilog中没有“编译”的概念,而只有综合的概念。

写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。

曾经接触过motorola苏州设计中心的一位资深工程师,他忠告了一句:就是用verilog 描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实现的电路,这是设计不出好的电路来的一般写verilog code时,对整个硬件的结构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。

可以看着图直接写code。

要知道,最初Verilog是为了实现仿真而发明的.不可综合的Verilog语句也是很重要的.因为在实际设计电路时,除了要实现一个可综合的module外,你还要知道它的外围电路是怎样的,以及我的这个电路与这些外围电路能否协调工作.这些外围电路就可以用不可综合的语句来实现而不必管它是如何实现的.因为它们可能已经实际存在了,我仅是用它来模拟的.所以,在写verilog的时候应该要先明确我是用它来仿真的还是综合的.要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂一些verilog综合方法的知识.就像前面说的,脑子里要有一个硬件的概念.特别是当综合报错时,就要想一想我这种写法能不能用硬件来实现,verilog毕竟还不是C,很多写法是不可实现的.要是这个module仅是用来仿真的,就要灵活得多了,这时你大可不必太在意硬件实现.只要满足它的语法,实现你要的功能就行了.有网友说关于#10 clk=~clk的问题,虽然这种语句是不可综合的,但是在做simulation和verification是常常用它在testbench中来产生一个clock信号。

相关文档
最新文档