verilog不可被综合的语句

合集下载

verilog语法规则(上)

verilog语法规则(上)

verilog语法规则(上)1.Verilog分以下四个层次:l 低阶交换模型:电路由开关与储存点所组成l 逻辑间层次描述:⽤and ,or, buf , not 等l 资料处理模型或暂存器转移层次:⽤于说明资料如何在暂存器中储存与传送。

使⽤assign(电路所需功能的指定描述)来描述。

l ⾏为模型:只需要考虑模组的功能,使⽤always ,for ,while ,case等2.关键字keywords必须使⽤⼩写来表⽰。

3.不能⽤于电路合成的verilog 语法:叙述:Delay, Initial, Repeat, Forever, Wait, Fork, Join, Event, time, Deassign, Force, Release, Primitive, Cese indentity, not identity operations,Rtuan,tranif0,tranif1,rtranif0,rtranif1运算⼦:= = =,!= =,/,%逻辑间型态:tranif1,tranif0,rtran,trtanif1,rtranif0等逻辑间型态Triand,trior,tri0,tri1,tritrg等接线型Nmos, pmos, coms ,rnmos ,rpmos ,rcmos等元件Pullup,pulldown等讯号改变元件其他不能⽤于电路合成的构建⽅式1) 不能在模组内有另⼀个阶层式的名称: module2) ifdef,endif,else等条件编译命令verilog的时间控制:主要⽤途是设定某⼀个程序在特定的时间被执⾏。

事件:当⼀条接线wire,wor,wand或暂存器register的值被改变时就是⼀个事件当模组的输⼊埠介绍到新的值时也是⼀个事件可⽤于合成的verilog电路描述的事件基础时间控制,有两种:1) 正规事件控制@当信号产⽣正缘posedge ,负negedge,转换或者值被改变时,叙述才会被执⾏。

自己总结的verilog规则

自己总结的verilog规则
38、并位操作符{}
39、时序逻辑电路中if条件下一般用<=运算符
40、if()
begin
……
end
else if()
begin
……
end
else if()
begin
input ;
reg ;
integer ;
……
begin
……
end
24、reg mema [7:0](8个1位寄存器构成组成)reg [7:0] mema(1个8为寄存器)可用mema[4]引用前者。
25、并行块:fork...join(不可用于RTL代码设计,只可用于测试代码) 顺序块begin...end
26、initial和fork...join均不可综合
括号可为空,此时不断循环,另外begin与end间被赋值的变量必须为reg型直接用=赋值
always@()
begin
#10 clk=1;
#10 clk=0;
else
例:边沿触发 always@(negedge clk)
...
11、仿真时用initial类似always,不可综合
12、例化时实参与形参顺序相同则不需写形参,若形参、实参都写则可调换顺序
13、assign并不需要在always中,也可以在外面
44、任务的定义与调用
task my_task;
input a,b;
output c,d;
一个或多个赋值表达式;
endtask(无分号)
end
可在其中使用if语句
9、always可用于描述组合逻辑电路
也可用于描述时序逻辑电路,区别在于时序电路敏感信号一般为上升沿或下降沿

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、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。

不可综合语句——在多个always块中对同一变量赋值

不可综合语句——在多个always块中对同一变量赋值
reg [2:0] POS;
always@( posedge CLK)
begin

POS<=POS+3’b1;

end
always@( posedge IN3)
begin

POS<=POS+3’b1;

end
endmodule
这样的代码是不可综合的,那么怎么处理呢。小生找到了两个方法。
方法一:状态机
原则2:锁存器电路建模时,用非阻塞赋值。
原则3:用always块描述组合逻辑时,采用阻塞赋值。
原则4:在同一个块中描述时序逻辑和组合逻辑的混合逻辑时,用非阻塞赋值。
原则5:同一个always块中只能全用阻塞赋值或者全用非阻塞赋值。
原则6:不能在多个always块中对同一个变量进行赋值。
这个问题也困饶我比较久了,今天终于解决,啦啦啦啦啦~~
不可综合语句——在多个always块中对同一变量赋值
先从夏老师的书里摘录点东西:
QUOTE:
“在描述组合逻辑的always块中使用阻塞赋值,则综合成组合逻辑的电路结构。”
“在描述时序逻辑的always块中使用时序赋值,则综合成时序逻辑的电路结构。”
阻塞与非阻塞赋值的使用原则:
原则1:时序电路建模时,用非阻塞赋值。
这个可能是比较通用的方法。小生引入了一个1位状态机(如图)
将INT由0变为1的过程作为IN3的上升沿,将INT由1变为0的过程作为IN3的下降沿。
代码如下:
CODE:[Copy to clipboard]
reg INT;
always@(CLK)
if(INT==0)
if(IN3==1)
begin

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语句(原创版)目录1.Verilog 语言概述2.Verilog 语句的分类3.可综合的 Verilog 语句4.应用举例正文1.Verilog 语言概述Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。

它最初由 Phil Moorby 在 1983 年开发,后来由 Cadence 公司进行商业化推广。

Verilog 具有易学易用、功能强大的特点,广泛应用于集成电路设计、计算机体系结构、数字信号处理等领域。

2.Verilog 语句的分类Verilog 语句主要分为两大类:行为描述语句(Behavioral Description)和结构描述语句(Structure Description)。

行为描述语句主要用于描述数字电路的功能和行为,包括 always 语句、initial 语句等;结构描述语句主要用于描述数字电路的物理结构,包括 module 语句、wire 语句等。

3.可综合的 Verilog 语句可综合的 Verilog 语句是指在数字集成电路设计中,可以被合成器(Synthesizer)转换为实际硬件电路的 Verilog 语句。

这类语句主要包括以下几类:(1)简单的逻辑门和寄存器:如与门、或门、非门、与非门、或非门、异或门等,以及触发器、计数器、寄存器等。

(2)各种运算和操作:如算术运算(加、减、乘、除等)、关系运算(大于、小于、等于、不等于等)、位运算(按位与、按位或、按位异或、取反等)、移位运算等。

(3)控制结构:如 if-else 语句、case 语句、for 循环、while 循环等。

(4)其他:如声明、实例化、端口定义、模块调用等。

4.应用举例以下是一个可综合的 Verilog 语句示例,用于实现一个 4 位全加器的功能:```verilogmodule full_adder(input a, input b, input cin, output sum, output cout);assign sum = a ^ b ^ cin; // 异或运算实现和assign cout = (a & b) | (a & cin) | (b & cin); // 与、或运算实现进位endmodule```在这个例子中,我们声明了一个名为 full_adder 的模块,包含两个输入端口 a、b,一个输入端口 cin,以及两个输出端口 sum 和 cout。

Verilog语法知识点总结(转)

Verilog语法知识点总结(转)

Verilog语法知识点总结(转)1.1 概述条⽬说明分类1>> ⾯向设计的语句; // 可综合。

2>> ⾯向测试的语句; //testbench ,不可综合。

特点设计语句 assign , always ,模块例化,都对应实际电路,并⾏执⾏。

构造1.2 模块 Module条⽬说明模块名(端⼝列表)整个电路的外特性,抽象为⿊盒⼦;端⼝⽅向input , output ; inout ;端⼝类型wire , reg ;端⼝类型是 wire 时可以省略。

例: input a ; // 端⼝⽅向为输⼊,类型默认为 wire ;1.3 数据类型1.3.1 wire/reg 线⽹wire 和 reg 都是线类型,⼯程上没区别;只是 always/initial 模块中输出定义需要为 reg 型;注意:不要将 reg 类型与 D 触发器混淆, reg 理解为因为代码所产⽣的。

例如:wire [7:0] a; // 定义了 8 位的 wire 型数据wireb; // 定义了 1 位的 wire 型数据reg [3:0]sum ; // 定义了⼀个 4 位的 reg 型数据1.3.2 常量类型格式说明parameter parameter 数据名 = 表达式parameterMSB = 7 ;// 定义参数 MSB 为常量 7 ;推荐⼤写;常量< 位宽 >< 进制 >< 数字 >⼆进制: B 或 b ;⼗进制: D 或 d ;⼋进制: O 或 o ;⼗六进制: H 或 h ;8’b1010_1100 (‘b 表⽰⼆进制 )下画线“ _”, 提⾼阅读性。

< 数字 >默认⼗进制;4 值逻辑0 : Logic Low低电平;1 : Logic High⾼电平;x : Unknow ;不确定;z : High Impedance ;⾼阻态; // 三态门1.4 运算符1.4.1 概述运算符说明算术运算符+ ( 加 ) , - (减), * (乘), / (除), % (取模);每个运算符在电路中都是个模块,如加法器,减法器;!注意:除法,除 2^n ,是移位运算,浮点运算就复杂了,因此浮点运算要专⽤除法器;关系运算符>, <, >=, <= , == (相等),! = (不相等);逻辑运算符&& (逻辑与) . || (逻辑或) , ! (逻辑⾮);条件判断语句中,为避免歧义,逻辑运算符⼆边推荐为 1bit ;位运算符& (与), | (或), ~ (⾮) , ^ (异或) ; ~^ (同或);移位运算符<< (左移), >> (右移);归约操作& , ~& , | , ~| , ^, ~^;//unary reduction ;条件运算符?:拼接运算符{}//{3{a[0]}}: 代表 3 根同样的 a[0] 线, {a[0],a[0],a[0]} 1.5 设计语句1.5.1 assign (连续赋值)实例说明assigny = ~ b ;assign out = a==1 && c==1 ;assign f =sel ? a : b ;>> 实现可以⽤布尔函数描述的组合逻辑电路;>>“=” 后⾯可以是任何布尔函数;>> 并⾏执⾏;典型错误 1 :assigna = b + a;避免出现反馈电路:变为了不可知时序逻辑电路;1.5.2 always (过程块)a、赋值赋值⽅式说明= ,阻塞赋值always @ ( a or b or C or … )begin语句块( = , if 语句, case 语句)end实现:组合逻辑电路;(注意!禁⽌⽤于时序逻辑电路)always 块内,阻塞赋值:是顺序执⾏(类似 C );敏感表: @ ( * ) //“*” ⾃动添加相关输⼊信号;敏感表: @ ( * ) //“*” ⾃动添加相关输⼊信号;避免出现 Latch (锁存器)分⽀语句( if 语句, case 语句)条件不满时,会在电路中⾃动⽣成锁存器来保存不满⾜条件的值,因此要补全 if-else ,和 case 的 defalut 语句;<= ,⾮阻塞赋值always @ ( posedge clk or negedge rst_n )begin语句块( <= , if 语句, case 语句)end实现:时序逻辑电路;(注意!禁⽌⽤于组合逻辑电路)always 块内,阻塞赋值:并⾏执⾏;b、if 语句条⽬说明格式 1if( 条件 )begin 语句 1;语句 2 ;endelse begin语句 1 ;语句 2 ;end格式 2if( 条件 )begin 语句 1;语句 2 ;endelse if begin 语句 1 ;语句 2 ;endelse begin语句 1 ;语句 2end特点分⽀语句,各个分⽀条件不同;顺序执⾏判断;注意if-else 成对使⽤;c、case 语句条⽬说明格式case( 表达式 )常量表达式 1:begin 语句;end常量表达式 2:begin 语句;end常量表达式 3:begin 语句;enddefault :语句;endcase特点分⽀语句,各个分⽀条件相同;并⾏执⾏判断;注意default 语句不可省略;d、代码 & 硬件条⽬说明映射赋值语句 -> 逻辑函数; // 加法器,减法器等;边沿型条件分⽀ -> D 触发器;条件分⽀ -> 多路选择器;⽰例1.5.3 模块例化a、作⽤系统设计时,建议遵循以下设计原则:b、常见的典型错误如下所⽰:1.5.4 全加器全加器顶层: w1 , w2 , w3 :模块之间连线;半加强: 2 种描述⽅法,如下:描述⽅式描述⽅式说明位置关联AND u1(a, b, and_out);名字关联AND u1(.a(a), .b(b), .o ( and_out ) ); // 推荐使⽤1.6 测试语句1.6.1 结构Testbench1.6.2 特殊符号语句说明`< 标识符 >表⽰:编译引导语,⽤于指导仿真编译器在编译时采取⼀些特殊处理;编译引导语句⼀直保持有效,直到被取消或重写;`timescale `timescale < 时间单位 >/< 时间精度 >例 1 :`timescale 1ns/1ns // 时间单位 1ns ;时间精度 1ns ;#2 // 延时 2 ×1=2ns ;#2.1// 延时 2.1 × 1 = 2.1ns, 精确到 1ns ,为 2ns ;例 2 :`timescale 1ns/100ps // 时间单位 1ns ;时间精度 100ps ;#2 // 延时 2 ×1= 2ns ;#2.1// 延时 2.1 × 1 = 2.1ns, 精确到 100s ,为 2.1ns ;`define`include`include “global.v”包含另⼀个⽂件,完整拷贝过来;`restall把所有设置的编译引导恢复到缺省状态;#<num>;#10; // 延迟 10 个时间单位1.6.3 语句语句说明initial 块语句:只执⾏⼀次, always 循环执⾏;不可综合;作⽤:initial产⽣激励信号;检查输出波形;赋初值;forever // 产⽣周期信号:intial beginclk = 0 ;forever#10 clk = ~clk; // 时钟信号end1.6.4 系统任务和函数条⽬说明$< 标识符 >表⽰ Verilg 的系统任务和函数$time当前的仿真时间$display 显⽰信号值变化:只执⾏⼀次,打印当前时刻;$display($time, “b% %b %b” , rst,clk,dout);$monitor 监视信号值变化:所有过程时刻;$monitor($time, “b% %b %b” , rst,clk,dout);$stop暂停仿真$finish结束仿真,释放电脑资源;1.7 代码模板1.7.1 组合逻辑电路条⽬说明assign assign add_cnt = flag==1; // ⽤于简单的组合逻辑电路;always always @(*)begin// 统⼀采⽤“ *” 为敏感列表;( =,if,case )语句; // 只能使⽤“ =” 赋值end1.7.2 时序逻辑电路a、计数器模板 13 段式模板模板 1always @( posedge cllk or negedge rst_n) begin1计数段always @( posedge cllk or negedge rst_n) begin if (!rst_n)cnt <= 0; // 初值规定为 0else if (add_cnt)begin// 【位置 1 】if(end_cnt)cnt <= 0;elsecnt <= cnt + 1;endend2加 1 条件assingadd_cnt = d==1; //d==1 :什么时候开始数脉冲3结束条件assing end_cnt = add_cnt&& cnt == X-1; // X: 数多少个脉冲b、计数器模板 23 段式模板模板 11计数段always @( posedge cllk or negedge rst_n) begin if (!rst_n)cnt <= 0; // 初值规定为 0else if (add_cnt) begin// 【位置 1 】if(end_cnt)cnt <= 0;elsecnt <= cnt + 1;endelsecnt <= 0; // 不连续,需要清 0 时,使⽤模板 2 ;end2加 1 条件assingadd_cnt = d==1; //d==1 :什么时候开始数脉冲3结束条件assing end_cnt = add_cnt&& cnt == X-1; // X: 数多少个脉冲c、 4 段式状态机模板段号代码// 初始化,次态赋值给现态,明确当前状态;1always @(posedge clk or negedge rst_n) begin if(!rst_n)state_c <= S00;// 初始状态elsestate_c <= state_n;end2always @( * ) begin // 组合逻辑,描述状态转换⽬标case(state_c)S00: beginif(s00_s20_start) // 条件名 S00->S20state_n = S20;elsestate_n = state_c; // ⽅便拷贝endS20: beginif(s20_s21_start)state_n = S21;elsestate_n = state_c;endS21: beginif(s21_s00_start)state_n = S00;elsestate_n = state_c;enddefault: beginstate_n = S00;endendcaseend3// 具体的转换条件内容assign s00_s20_start = state_c==S00&& ( 条件 ) ;assign s20_s21_start = state_c==S20&& ( 条件 ); assign s21_s20_start = state_c==S21&& ( 条件 );4根据转态设计输出:1 个 always 设计 1 个输出信号;1.7.3 Testbencha、框架条⽬内容模块名`timescale 1 ns/1 nsmodule testbench_name();信号定义reg clk ; // 时钟reg rst_n; // 复位reg[3:0] din0 ; //uut 的输⼊信号,定义为 reg 型,在 initial 中reg din1 ;wire dout0;//uut 的输出信号,定义为 wire 型wire[4:0] dout1;parameter CYCLE = 20; // 参数定义,⽅便修改;parameter RST_TIME = 3 ;待测模块例化module_name uut( // 统⼀采⽤名字关联.clk ( clk ),.rst_n ( rst_n ),.din0 ( din0 ),.din1 ( din1 ),.dout0 ( dout0 ),.dout1 ( dout1 ));激励产⽣// 复位,时钟,等显⽰输出结果$display // 类似 printf ;b、复位复位initial beginrst_n = 1;#2;rst_n = 0;#(CYCLE*RST_TIME);rst_n = 1;endc、仿真时钟仿真时钟initial beginclk = 0;forever#(CYCLE/2)clk=~clk;endd、激励信号激励信号initial begin#1;// ⽅便观测din1 = 0; // 赋初值#(10*CYCLE);// 开始赋值end以上就是总结的 Verilog 语法相关知识点,转⾃明德扬论坛。

第五章组合逻辑电路的VerilogHDL实现

第五章组合逻辑电路的VerilogHDL实现

第五章组合逻辑电路的VerilogHDL实现第5章组合逻辑电路的Verilog HDL实现5.10.1 逻辑电路的Verilog HDL描述方式Verilog HDL描述逻辑电路时常用3种描述方式,分别为:行为型描述、数据流型描述和结构型描述。

行为型描述只描述行为特征,不涉及逻辑电路的实现,是一种高级语言描述方式,使用例如always语句或initial 语句块中的过程赋值语句;数据流型描述指通过assign连续赋值实现组合逻辑功能的描述方式;结构型描述指描述实体连接的结构方式,所谓实体一般指Verilog 语言已定义的基元,包括门原语、用户自定义原语(UDP)和其他模块(module)。

行为型描述语句更简练,不能被综合;结构型描述语句通常容易被综合,但语句显得复杂。

在实际开发中往往多种描述方法混合使用。

5.10.2 2选1数据选择器的Verilog HDL实现2选1数据选择器可以有多种描述方式,通过4个实例和3种描述方式对例子中出现的语法现象进行解释。

5.10.12选1数据选择器的数据流型描述方式;5.10.22选1数据选择器的数据流型描述方式;5.10.32选1数据选择器的行为型描述方式;5.10.42选1数据选择器的结构型描述方式;5.10.2.1 2选1数据选择器实例1//例5.10.1module Mux21(a,b,s,y);//----------------1input a,b;input s;output y;assign y=(s==0)?a:b;//----------------2endmodule//----------------310.2.1 2选1数据选择器实例11. Verilog语言描述//例5.10.1module Mux21(a,b,s,y);//----------------1input a,b;input s;output y;assign y=(s==0)?a:b;//----------------2endmodule//----------------32. 程序说明(1)注释行(2)模块定义语句module和endmodule所有的程序都置于模块(module)框架结构内。

第2章 Verilog 语言规则(修改)

第2章 Verilog 语言规则(修改)

9.2 数 据 类 型
Verilog的数据类型及逻辑系统
学习内容:
学习Verilog逻辑值系统 学习Verilog中不同类的数据类型 理解每种数据类型的用途及用法 数据类型说明的语法
Verilog采用的四值逻辑系统
’0’, Low, False, Logic Low, Ground,VSS, Negative Assertion
trireg类型很象wire类型,但trireg类型在没有驱动时保持 以前的值。这个值的强度随时间减弱。
寄存器类 (register)
寄存器类型在赋新值以前保持原值
寄存器类型大量应用于行为模型描述及激励描述。在 下面的例子中,reg_a、reg_b、reg_sel用于施加激 励给2:1多路器。
第9章 Verilog语言规则
9.1 文字规则
常量(或常数)
整数类型(integer)(32位):可以被综合。 实数类型(real)(32位) 不可综合 字符串类型(strings)
9.1 文字规则
1. 整数
注意:
为了增加可读性,在较长的数间可用下划线分 开。
若不注明位宽和进制,或仅用D注明进制时, 都是十进制。如:123,’D12
‘1’, High, True, Logic High, Power, VDD, VCC, Positive Assertion
’X’ Unknown: OccuResolved Conflict
HiZ, High Impedance, Tri- Stated, Disabled Driver (Unknown)
注意integer和reg 类型在算术运算 时的差别。integer 是有符号数,而 reg是无符号数。

可综合的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 基本语法2

Verilog 基本语法2

4'b1001<<1=5'b10010; 4'b1001<<2=6'b100100; (左移会使得位数增加?)
1<<6=32'b1000000;
4'b1001>>1=4'b0100; (右移不会改变位数?)
4‘b1001>>4=4'b0000
• 7)位拼接运算符
• {信号1的某几位,信号2的某几位,......信号n的某几位} 将某些信 号的某些为列出来,中间用逗号分开,最后用大括号括起来表示
• 4)关系运算符
• < 、 > 、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声 明的关系是真的,则返回值是1。 关系运算符的优先级别低于算 数运算符。若关系模糊,则返回不定值
• 如: a<size-1
//这种表达方式与下面的表达方式相同
• a<(size-1)
//
• size-1<a
[n-1,0] 和 [n,1] 表示该数据的位宽为n。如:
wire a;
//定义了1个1位的wire数据
wire [7,0] b; //定义了1个8位的wire数据
wire [4,1] a,b; //定义了2个4位的wire数据
//表示共有 i 条总线,每台总线内有n条线路。
寄存器是存储单元的抽象,寄存器数据 类型的关键字是reg。常用来表示always
• 2)位运算符:
• 按位取反~ 、按位与 & 、按位或 | 、按位异或 ^ 、按位同或 ^~
• 在不同长度的数据进行位运算时,系统会自动的将两个数右端对 齐,位数少的操作数会在相应的高位补0,以使两个操作数按位 进行操作。

可综合的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中disable语句的综合

verilog中disable语句的综合

verilog中disable语句的综合Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。

在Verilog中,disable语句是一种用于控制模块中任务或过程的执行的语句。

它可以用于暂停或停止任务或过程的执行,以便在需要的时候重新启动。

disable语句的语法如下:disable <task_name>;其中,<task_name>是要被禁用的任务或过程的名称。

disable语句的作用是暂停或停止任务或过程的执行。

当disable语句被执行时,任务或过程将被禁用,不再执行其中的语句。

禁用的任务或过程可以通过enable语句重新启用。

disable语句的综合是指将Verilog代码转换为硬件电路的过程。

在综合过程中,disable语句的功能被转换为逻辑电路,以实现相应的控制功能。

在综合过程中,disable语句通常被转换为一个控制信号,用于控制任务或过程的执行。

这个控制信号可以是一个使任务或过程停止执行的使能信号,也可以是一个使任务或过程重新开始执行的使能信号。

disable语句的综合需要考虑以下几个方面:首先,综合工具需要识别disable语句,并将其转换为相应的控制电路。

这需要对Verilog代码进行解析和分析,以确定disable语句的位置和作用。

其次,综合工具需要根据disable语句的位置和作用,生成相应的控制电路。

这包括生成控制信号的逻辑电路,并将其与其他电路连接起来。

最后,综合工具需要优化生成的控制电路,以提高电路的性能和效率。

这包括减少电路的延迟和功耗,以及优化电路的面积和布局。

disable语句的综合对于设计复杂的数字电路非常重要。

它可以用于控制任务或过程的执行,以实现复杂的功能和逻辑。

通过合理使用disable语句,可以提高电路的性能和效率,减少电路的复杂性和成本。

总之,disable语句是Verilog中用于控制任务或过程执行的重要语句。

verilog HDL综合

verilog HDL综合

4.7 循环语句
module forloop(addr,line); input [1:0] addr; output [3:0] line; reg [3:0] line; integer i; always @(addr) for(i=3;i>=0;i=i-1) if(addr==i) line[i]=1; else line[i]=0; endmodule
5.2 触发器的综合(1)
module pre_use(clk,a,b); input clk; input a; output b; reg b; always @(posedge clk) b = a; endmodule
5.2 触发器的综合(2)
module pre_use(clk,a,b); input clk; input a; output b; reg b; reg a_temp; always @(posedge clk) a_temp = a; always @(posedge clk) b=a_temp; endmod4.2.2 事件列表 always语句中所读取 的变量都应出现在事件 列表中,否则综合出来 的电路可能和设计模型 不一致 input a, b; output z; reg z; always @(a) z = a & b;
4.2 always 语句(3)
4.2.3 局部变量 input a, b, c, d; output z; reg z; always @(a or b or c or d) begin: local reg r1, r2; r1 = a & b; r2 = c | d; z = r1 & r2; end
4.4 case语句(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过程块中对同一个变量赋值。

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

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)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。

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

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

(10)不能在一个以上的always过程块中对同一个变量赋值。

而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。

(12)避免混合使用上升沿和下降沿触发的触发器。

(13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。

(14)避免在case语句的分支项中使用x值或z值。

不可综合verilog语句2009-04-14 19:33
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。

如:
1 module synthesis_compare_xz (a,b);
2 output a;
3 input b;
4 reg a;
5
6 always @ (b)
7 begin
8 if ((b == 1'bz) || (b == 1'bx)) begin
9 a = 1;
10 end else begin
11 a = 0;
12 end
13 end
14
15 endmodule。

相关文档
最新文档