搜档网
当前位置:搜档网 › Verilog中的一些语法和技巧

Verilog中的一些语法和技巧

Verilog中的一些语法和技巧
Verilog中的一些语法和技巧

1、.

2、.

3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但

是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。

4、在数据类型中?和Z均表示高阻态。

5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定

是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。

6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型

数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0];

7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。

8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动

地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。

9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是

2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x。而 = = =和!= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0.

10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变

量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)赋值语句执行完后,块才结束 2 b的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果。

11、模块的描述方式:(RTL为寄存器传输级描述)

“(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现。分为两种a、显式连续赋值语句;

连线型变量类型[连线型变量为快]连线型变量名

Assign #(延时量)连线型变量名=赋值表达式;

显式连续赋值语句包含了两条语句;第一条是对连线型变量的进行类型说明的说明语句;第二句是对这个已得到声明的连线型变量进行连续赋值语句。

影视赋值语句:连线型变量类型(复制驱动强度)[连线型变量位宽]#(延时量)连线性变量名=赋值表达式。隐式连续赋值语句是把连线性变量说明语句和连线性变量连续赋值语句结合在一条语句中。他可以对连线型变量进行说明的同时进行连续赋值。

Assign 连续赋值语句的功能是:当赋值表达式中的变量的只发生变化时,重新计算赋值表达式的值,并在指定的时延后将得到的结果赋给左端的连线性变量。Assign只能实现组合功能。而reg型数据可以可以存储过程赋值的最终结果。端口默认为连线性的不用定义一般,只要输入发生变化输出马上发生变化。(2)行为描述方式:

A、initial语句:此语句只执行一次。

B、always语句:次语句循环执行。

只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持所有值不变。以上两种语句在0时刻并发执行。

(3)、结构描述方式

结构描述是通过实例进行描述的方法,他将verilog中预定义的基本元件实例嵌入到语言中,监控实力的舒服,一旦其中任何一个发生变化,便重新运算并输出。在verilog HDL中可以使用如下结构描述部件:

A、用户自己定义的模块b、用用户自定义元件UDP c、内置门级元件 d、内置开

关级元件

(4)混合型描述

11、连续赋值语句与过程赋值语句的区别:

我觉得这个在刚开始学习verilog时,是会有一些疑问的!

a、从语法上来看,连续赋值语句由“assign”关键词来表示,而过程赋值语句中则不包含

b、连续赋值语句中左侧的被赋值数据类型必须是线网型数据,而过程赋值语句

中的被赋值数据类型则必须是寄存器类型的变量

c、连续赋值语句不能出现在过程快(initial 过程快或者always过程块)中,而过程赋值语句则只能出现在过程快中

d、连续复制语句主要用来对组合逻辑电路进行建模以及对线网型数据间的连接进行描述,而过程赋值语句主要用来对时序逻辑电路进行行为描述

e、连续赋值语句对被赋值线网型数据的赋值是“连续的”(即连续复制语句产生作用后,赋值表达式中的信号的任何变换都将立即反映到被赋值线网型数据的取值上,这也是我们有时会使用“连续驱动”这个术语的原因),而在过程赋值语句情况下,只有在过程赋值语句被执行时才执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响.

12、间隔符和注释符:verilog HDL中的间隔符包括空格(\b)、tab(\t)、换行符(\n)以及换页符。

注释符有2种://和/*……….*/ 后为多行注释符用于对多行语句注释;前者为单行注释符,只对注释符所在的行有效。

13、数值:下划线除了不可以放于数值的首位意外,可以随意用在整型数和实型数之间,他们对数值的大小没有任何的影响,只是为了提高可读性。

在verilog中有二进制(b或者B)、十进制(d或者D)、八进制(o或者O)、十六进制(h或者H)

格式: 用于指定所表示数的位宽,在数值的表示中式可以缺省的.位宽小于数值的实际位数时,相应的高位部分被忽略;当位宽大于实际的位数,且数值的最高位是0或者1时,相应的高位补零;当位宽高于数值的实际位数,但数值的最高位是x或者z时相应的高位部分补x 或者z。二进制中的x或者z表示一位处于x或者z,八进制的表示三位,十六进制的表示4位。

14、实型数及其表示方法

Verilog HDL中的实数可以用十进制与科学计数法两种格式来表示,如果采用十进制数格式,小数点两边必须有数字,否则为非法字符。

如 3.8E10 2.1e-9;

15、字符串

字符串是用双引号括起来的字符序列,他必须包含在同一行中,不能分成多行书写。如字符串用作verilog HDL表达式或赋值语句中的操作数,则字符串被看做8位的ASCII值序列,即一个对应8位的ASCII码。

在verilog中采用寄存器变量来存储字符串,寄存器变量的位数要大于字符串的最大长度。需要注意的是,verilog HDL中并不需要特殊位来存储终止符。可以采用标准操作符对字符串进行诸如连接类的操作。在操作过程中字符串变量位数大于字符串的实际长度,则字符串变量的高位补零。

Reg[8*12:1]stringvar

Initial

Begin string=“hello woeld!”;

End

特殊字符:\n 换行符\t tab键 \\ 符号\

\*符号* \ddd三位八进制数表示的ASCII值 %%符号%

16、数据类型

(1)、物理数据类型:分为连线性和寄存器型变量可以取0、1、x、z,中的认可一个。X表示一个位置初始状态的变量,或者由于多个驱动源试图将其设定为不同的值而引起的冲突性连线性变量,z表示高祖状态或浮空量。

物理类型数据分为连线型和寄存器型亮中

连线型数据对应的是硬件电路的物理信号连线,没有电荷的保持作用(trireg 除外)。连线型数据必须有去动员驱动,有两种方式对他进行驱动:一种是结构描述中把它连接到一个们或者模块的输出端;二是用连续赋值语句assign对其进行复制。当没有驱动源对其驱动时,他将保持高阻态

Verilog HDL中的连线型数据及其功能描述

寄存器数据对应的是具有保持作用的硬件电路与元件,如触发器、锁存器等。如reg没初始化则将为x缺省为一位。

两种数据的区别:寄存器型数据保持最后一次的赋值,而连线型数据需要有持续的驱动。寄存器数据的驱动刻意通过过程赋值语句实现,过程赋值语句只能出现在过程语句后面的过程块语句中。

存储区:verilog中采用寄存器数组来表示存储器,用来对ROM,RAM或寄存器文件进行建模。数组中的每一个寄存器均称为一个元素,用不同的索引来寻址。Reg[16:1] mem[5:1] 申明16位5字的存储器与寄存器。

(2)、抽象数据类项

有整型integer 时间型time 实型real 参数性parameter

17、运算符

算术运算符:包括+ - * / %是二元运算符。如果操作数为寄存器或者连线型则为无符号数;如果为整型或者实型,则刻意是有符号数。当用基数格式表示整数时,一定是无符号数;两个操作数中的一个为x则记过为x。

18、按位运算符和逻辑运算符:!是逻辑非而~是按位操作的非即按位取反。例如:对于

!(3==2)的结果是1;而后者对为进行操作~(0、0、1、0)=1101;

19、归约运算符:归约运算是对单个的操作数进行归约的递推运算,最后的结果是一位的二进制数。具体过程:先讲操作数的第一位和第二位进行归约运算,然后将运算结果与第三位进行归约运算,以此类推,直到最后一位。格式(&b)

19、移位运算?!不会

20、条件运算符:verilog HDL中只有唯一的一种三目运算符,及条件运算符有三个操作数。如第一个操作数为逻辑1,则算子返回第二个操作数;如第一个操作数为逻辑0,则返回第三个操作数;如第一个操作数为高阻态或未知态则按下表给出的逻辑,将第二个和第三个操作数按位比较得到结果。

21、连接和复制:连接运算是将多个小的表达式合并成一个大的表达式。Verilog HDL中用符号{,,}实现多个表达式的链接运算,各个表达式之间用“,”隔开。复制运算符{{}}将一个表达式放入双重花括号内,而复制因子放在第一个括号内,用来指定复制的次数。

二、模块的基本结构

1、行为描述的结构:

Module<模块名>(<端口列表>)

模块端口说明

参数定义(可选)

数据类型说明

过程快(initial过程块或always快,可有一个或多个)

连续赋值语句

任务定义(tast)(可选)

函数定义(function)(可选)

其中:数据类型说明用来对模块中用到的各类变量类型进行说明,如果某个变量没有进行数据类型说明,则他的类型缺省为连线类型(wire)。

上面列出的各个模块组成项可以是任意次序出现,但是端口说明和数据类型说明必须出现在端口和数据被引用之前。

2、(1)在行为描述模块中出现的每个过程块(always过程块或者initial过程块)都代表一个独立的进程。

(2)在进行仿真时,所有的过程块的执行都是从0时刻开始并行的执行。(3)每一个过程块内部的多条语句的执行方式可以是顺序执行的(当快定义语句为begin——end时的情况),也可以是并行执行的(块定义语句是fork-join 时的情况)。

(4)always和initial过程块都是不能嵌套使用的。

3、initial过程块:

Initial

语句块

而语句块的格式为:

<块定义语句>:<块名>

块内局部变量;

时间控制1 行为语句;

。。。。。。。。

时间控制n 行为语句;

<块定义语句2>

其中:块定义语句刻意是“begin end”语句组,或者时“fork,join”语句组。<块名>为可选项,块名可以乘早一个局部作用域。定义块名的过程快成为“有名块”,在有名块下可以定义局部变量,有名块内部语句的执行刻意被disable语句中断。

块内局部变量说明也是可选项,只有在有名块中才能定义局部变量,并且块内局部变量只能是寄存器类数据类型。

行为语句可以是如下语句中的一种:过程赋值语句(阻塞型或非阻塞型过程赋值语句)过程连续赋值语句(assign/deassign或force/release语句组) if 条件分支语句 case条件分支语句循环控制语句(forever、repeat、while、for循环语句) wait等待语句 disable终端语句事件触发语句(event ——trigger)任务调用语句(用户自定义的任务或系统任务)。

Initial过程块的使用只要是面向功能模拟的,他通常不具有可综合性。Initial 过程块通常来描述测试模块的初始化、监视、波形生成等功能行为;而对硬件功能模块的行为描述中,initial过程块常常用来对只需执行一次的过程进行描述,例如刻意用来寄存器的初始化!

4、always过程块:

Always过程块是由“always”过程语句和语句块组成的,他的格式为:

Always@(敏感事件列表)

语句块

其中语句块的格式为:

<块定义语句1 这里一般是begin或者fork>:<块名>

块内局部变量说明;

时间控制1 行为语句1;

。。。。。。

时间控制n 行为语句n;

<块定义语句2 这里一般是end>

说明:@(敏感事件列表)是可选项,带有敏感事件列表的语句块被称为“由事件控制的语句块”他的执行守敏感事件的控制。敏感事件是有OR连接起来的一个或者多个表达式,只要发生了敏感事件列表所列出的多个事件中的任何一个,就启动后面语句块的执行。敏感事件列表实际上代表了一个事件控制类型的时间控制。

他的块内定义语句也分为串行块和并行块。

5、always和initial语句的区别:always语句过程语句后面可以有一个敏感事件列表,该敏感事件列表的作用是来激活always过程块语句的执行,而initial 语句后面则不允许有敏感事件列表。如果always的敏感事件列表是缺省的则认为触发条件始终被满足。

6、always过程块的使用只要是对硬件功能模块的行为进行描述,他可以是在测试模块中用来对视中进行描述。利用always过程块可以实现锁存器和触发器他也可以用来实现组合逻辑。

在用always过程块视线组合逻辑时要注意将所有的输入信号都列入敏感事件列表中,而在使用always过程块实现时序逻辑时却不一定要将所有的输入信号都列入敏感事件列表。

7、串行块:begin:<块名>

快内局部变量

时间控制1 行为语句1;

。。。。。。

时间控制n 行为语句n

End

其中:块内局部变量刻意是reg型声明语句、integer型变量声明语句及real 型变量声明语句。他的语句是顺序执行的。

8、并行块和串行块的格式是相同的,只是它的关键字是fork-join,而且他的语句是并行执行的。而且并行块和串行块是可以嵌套使用的。

三、行为描述:时间控制和赋值控制

1、时间控制可以用来对过程块中各条语句的执行时间进行控制,时间控制分为两类:

(1)、延时控制:为行为语句的执行指定一个延时时间的控制方式

(2)、事件控制:为行为语句的执行指定触发事件的时间控制方式

其中时事件控制方式又可以分为两类:边沿触发事件控制和电平敏感事件控制2、延时控制格式为:

#<延迟时间> 行为语句;

或者

#<延迟时间>;

其中:#是延时控制的标识符,“<延迟时间>”是一个直接指定的延迟时间量,他是以多少个仿真时间单位的形式给出的,可以是一个立即数、变量和表达式。如延迟时间为x或者z那么延迟控制等小于零延迟控制。如果为负值,是以该负值的二进制补码值作为实际的延时量。

3、边沿触发控制分为四种格式:

第一种:@<事件表达式> 行为语句;

第二种:@<事件表达式>;

第三种:@(<事件表达式1>or<事件表达式2>。。。or<事件表达式n>)行为语句;第四种:@(<事件表达式1>or<事件表达式2>。。。or<事件表达式n>);

其中事件表达式有三种形式:

<信号名>

Posedge<信号名>

Negedge<信号名>信号名可以是任意数据类型的标量或矢量。

第一种事件表达式形式:代表的触发事件是<信号名>所指定的信号发生了某种逻辑变化(不论是整条便还是负跳变)。它是信号出了保持稳定太意外的任意一种

变化过程。

第二种表示正跳变可以是下列中的一种:0——x 0——z 0——1 x——1 z——1

第三种表示负跳变可以是写列中的一种:1——x 1——z 1——0 x——0 Z——0.

4、用always过程块实现组合逻辑功能

(1)事件表达式内不能能包含“posedge”和“negedge”关键词,也就是说敏感事件列表中的事件表达式智能是前面所述的第一种现在敏感时间列表中。

5、电平敏感事件控制(wait语句)

与边沿触发事件控制不同,在电平敏感事件控制方式下启动语句执行的触发条件是某一个指定的条件为真。有三种形式:

第一种:wait(条件表达式)语句块;

第二种:wait(条件表达式)行为语句;

第三种:wait(条件表达式);

6、过程赋值语句:过程赋值语句是使用于两种结构化过程块(initial和always 过程块)中的赋值语句。在过程块中智能使用过程赋值语句(不能在过程块中出现连续赋值语句),同时过程赋值语句也只能用在过程块中。

过程赋值语句的基本格式为:

<被赋值变量><赋值操作符><赋值表达式>

其中赋值操作符是“=”或者“《=”之一,他们分别代表了阻塞型赋值和非阻塞性赋值类型。

7、过程赋值语句智能对于对寄存器类的变量(reg、integer、real、time)进行赋值

8、过程赋值的两种延时方式:

(1)、外部延时控制方式:如果时间控制部分出现在整个过程赋值语句的最左端,也就是出现在赋值目标变量的左边,那么这种时间控制就是外部时间控制方式。在这种控制方式下,过程赋值语句在仿真时是这样执行的:仿真进程晕倒这条带有时间控制的过程赋值语句后,首先要延迟等待有时间控制部分指定的延时时间量,或者等待到指定触发事件发生后,才开始计算有短的赋值表达式并将其值赋

予左端被赋变量。例如 #5 a=b;相当于延时5在把b的值赋给a。(2)、内部时间控制

当赋值语句中的时间控制部分出现在“赋值操作符”和“赋值表达式”之间这种情况下的时间控制成为“内部时间控制”。

格式为:a=#5 b;

先计算b的值,当延迟时间过后把b的值赋给a。

可见,在内部时间控制方式下,时间控制所“控制”的是赋值表达式被计算时刻到赋值操作被执行时刻之间的时间差,赋值表达式被计算时刻和赋值变量被复制的时刻是不同的,他们之间的时间差是有时间控制部分决定的。

注意:这里赋给a的值是b在零时刻的值,要是b在以后的时刻发生了变化,则a在延时时间过后得到的值依然是b零时刻的取值。

格式例子:b=#5 a;c=@(posedge clk)a;d=wait(enable)a;

9、“显式零延时”控制即延时时间为零。#0 a=b;上面的这条语句的执行过程与不具有延时控制的赋值语句“a=b”的执行过程是很相似的;在语句开始执行后他们都是首先计算表达是b的值,在对变量a进行赋值;同时这两条语句的开始执行时刻、表达式计算时刻和变量赋值时刻都是相同的。但是两种赋值有这微妙的差别:在显示零延时控制下,赋值语句内赋值表达式的计算以及变量的赋值操作是在当前的仿真时刻的末位进行的,也就是说要等到这一时刻其他正常操作完成后才进行的。而赋值语句“a=b”内的表达式计算和变量赋值操作则是在赋值开始执行后立即进行的,不需要等待同一时刻的其他操作完成后才进行。如initial

Begin

A=0;

B=0;

End

Initial

Begin

#0 a=1;

#0 b=1;

End

其中四条赋值语句的操作都是在零时刻得到执行。但是后两条赋值语句的左端加上了显示零延时控制#0,所以后两条语句在前两条语句执行完后才执行。也就是

先给a,b赋值0,然后再仿真时刻0 的末尾执行对a,b赋值1的操作,a、b 的最终取值是1。

10、阻塞和非阻塞赋值:

阻塞型————符号为“=”非阻塞型——符号为“<=”

区别:阻塞型在串行快中的个跳阻塞型过程赋值语句将以他们在顺序快中的先后排列次序依次得到执行;而并行块中的各条阻塞型过程赋值语句则是同事得到执行的。阻塞性过程赋值语句的执行过程是:先计算右端赋值表达式的取值,然后立即将计算结果赋值给“=”左端的被复制变量。

这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达是的值并立即将其结果付给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句阻塞,只有当前这条阻塞型过程赋值语句所对应的赋值操作执行完毕后下一条语句才能开始执行。也就是说“=”时,语句是一条一条执行的,第一条语句执行完毕后,第二条语句才开始执行。

非阻塞和阻塞是不同的,他的语句是同时执行的,在零时刻中他的赋值是同时进行的,在begin-end串行语句块中,一条非阻塞型过程赋值语句的执行不会阻塞下一条语句的执行,也就是说本条非阻塞型过程赋值语句对应的赋值操作执行完毕之前,下一条语句也是可以执行的。

12、连续赋值语句:主要对组合逻辑电路进行描述。

连线性赋值语句智能用来对连星星变量进行驱动(赋值),而不能对寄存器型变量进行赋值他可以采用如下两种格式:

(1)、显示连续复制语句:

连线型变量类型 [连线型变量位宽] 连线型变量名;

Assign #(延时量)连线型变量名=赋值表达式;

(2)、隐式连续赋值语句:

连线型变量类型(赋值驱动强度)[连线型变量位宽]#(延时量)连线型变量名=赋值表达式;

在以上两种格式中:“连线型变量类型”可以是出了trireg类型外的任何一种连线型数据类型。

驱动强度默认为(strong1,weak0)即赋1值时的驱动强度为strong,赋0值

时的驱动强度是weak。例如语句wire (weak1,strong0)a=b&c;

“延时量”也是可选的格式如下:

#(delay1,delay2,delay3)

其中delay1、2、3都是数值,“delay1”表示连线性变量转移到“1”时的延时量(称为上升延时);delay2为下降延时,delay3致命了连线性变量转移到“高阻(z)”状态的延时称之为关断延时。

在实际使用中上三个值是可以省略其中一个或者两个的:如值给出了一个延时值,则这个延时值同时带表“上升延时”、“下降延时”、“关断延时”。如给出了两个延时值,则分别代表“上升延时”和“下降延时”,而“关断延时:将由给出的两个延时值中的较小的哪一个指定。如果延时值这一项缺省,则默认所有的延时值为零。

“赋值表达式”可以包含连线型、寄存器型或函数调用等任何数据类型的操作数,同时也可以包含任何操作符。

13、在实际中,连续赋值语句的赋值目标可以是如下几种:

(1)、标量连线型变量

Wire a,b;

Assign a=b;

(2)、向量连线性变量

Wire[7:0]a,b;

Assign a=b;

(3)、向量连线型中变量的一位

Wire[7:0]a,b;

Assign a[3]=b[3];

(4)、向量连线性变量中的几位

Wire[7:0]a,b;

Assign a[3:2]=b[3:2];

(5)、上面几种类型的任意凭借运算结果

Wire a,c;

Wire[2:1]b;Assign{a,c}=b;

在需要对多个连线型变量进行连续赋值时还可以采用下列形势的连续复制语句,他可以实现对多个变量进行连续赋值。

Assign a=b;

C=d;

D=f;

就等同于

Assign a=b;

Assign c=d;

Assign d=f;

连续赋值语句是对连线型变量进行连续的驱动;

14、注意:与寄存器型变量类型不同,连线性变量没有数据保持能力;只有在被连续驱动后才能去的确定值(而寄存器型变量只奥在某一时刻得到一次过程赋值后就能一直保持其取值),弱一个连线性变量没有得到认可连续驱动则它的取值将为不定态“x”。连续复制就是实现对连线型变量进行连续驱动的一种方法。一个连线型变量一单被连续复制语句赋值后,赋值语句右端赋值表达式的值将始终对被复制连线性变量产生驱动(连续驱动)。

15、如果在一个模块内包含了多条连续赋值语句,或者在一个模块中同时包含了连续赋值语句、过程块、模块实例或原语实例时,他们之间都是并行执行的。.

16、过程连续赋值语句:与过程赋值语句一样,过程连续复制语句也是一种过程性赋值语句,它用来过程连续赋值。正如他的名称表示的那样,过程连续赋值是在过程块内对变量进行连续赋值的。

过程连续赋值语句和连续赋值语句的不同之处在于:

(1)、过程连续赋值语句智能用在过程块(initial块和always块)中,而连续赋值语句则不能出现在过程块中。

(2)、过程连续赋值语句刻意对寄存器类变量进行连续复制(force-release语句组还可以对连线性变量进行连续赋值),他的赋值目标不可以是变量的某一位或者某几位。

过程连续赋值语句执行的是一种“连续赋值”:一旦对某个变量进行了过程连续赋值,则改变量将一直受到过程连续赋值语句内“赋值表达式”的连续驱动,“赋

值表达式”内操作数的任何变化都会引起被赋值变量取值的更新,直到对该变量执行了“撤销过程连续赋值操作”。

17、assign和deassign语句

assign和deassign语句构成了一组连续赋值语句。他们只能用于对集训期类变量的连续赋值操作,而不能用来对连线型变量进行连续赋值操作。前者是对寄存器类变量的连续复制,而后者则是一条撤连续赋值的语句。

Assign语句的使用语法是:

Assign<寄存器变量>=<赋值表达式>;

其中“寄存器类变量”致命了连续赋值操作的目标变量,热“赋值表达式”则致命了连续赋值的“驱动信号”。

一旦assign语句得到执行,寄存器累变量将由赋值表达式进行连续驱动,他将进入被连续驱动的状态。他的优先级是高于普通过程赋值语句的。如果有2个assign语句对同一个寄存器变量进行了过程连续驱动,那么第二条assign语句的执行将覆盖第一条assign语句的执行效果。

Deassign的使用语法:

Deassign<寄存器变量>;

这是一条撤销连续复制语句。当他得到执行后,原来由assign语句对变量进行的连续赋值操作将失效,寄存器标量将被连续赋值的状态被解除,改变量又可以由普通的过程赋值语句进行赋值操作。

需要注意的是:当用deassign语句来撤销了对某个寄存器变量的连续赋值后,改寄存器变量仍将保持deassign语句执行钱的原有取值。

18、force和release语句

这组连续赋值语句不仅能对寄存器类变量产生作用,还可以对连线型变量进行连续赋值操作。其中“force”语句用来实现对寄存器类变啦ing产生作用,还能对连线型变量进行连续赋值操作,我们称之为“强制语句”。“force语句”的优先级高于“assign语句”。

Force语句的语法如下:

Force <寄存器或连线性变量>=<赋值表达式>

如果force语句内制定的背赋值目标变量是寄存器累变量,则在“force语句“得

到执行后,改寄存器强制的由”赋值表达式“连续的驱动,进入被连续赋值的状态,这是将忽略其他较低优先级的赋值语句(普通的过程赋值语句或assign赋值语句)对这个寄存器变量的赋值操作,知道执行了一条”release“语句来释放对这个寄存器变量的连续赋值为止。Force语句只能出现在过程块中。Release语句的语法如下:

Release<寄存器或连线型变量>用deassign的作用相似,用来解除force语句。

行为描述:高级程序语句、函数和任务

1、分支语句:包含量中if-ekse条件分支语句和case语句。

2、If-else语句的使用格式:

(1)、if(<条件表达式>)语句或语句块;

其中条件表达式中1代表真,0、z、x代表假。没else语句。

(2)、if(<条件表达式>)语句或语句块1;

Else 语句或语句块2;

(3)、if(<条件表达式>)语句或语句块1;

Else if(<条件表达式>)语句或语句块2;

。。。。。。。。

Else if (<条件表达式>)语句或语句块n;

Else 语句或语句块n+1;

3、case分支控制语句

case分支语句有case、casez、casex三种形式。

(1)、case语句的格式如下

Case(<控制表达式>)

<分支项表达式>1:语句块1;

<分支项表达式>2:语句块2;

。。。。。。

<分支项表达式>n:语句块n;

Default:语句块n+1;

Endcase

其中:“<控制表达式>”代表着对程序流向进行控制的控制信号;各个”<分支表达式>”则是控制表达式的某些具体状态的取值,在实际使用中这些分支项表达式通常是一些常量表达式。

如果“控制表达式”有几种不同取值情况对应着同一操作,则上述格式可以这样进行简写:用逗号将代表着这几种不同取值情况的多个“分支表达式”隔开,再将在这些枪狂下需要执行的语句块放在这几个分支项表达式的后面。例如

Case(op_code)

2’b00: out=a|b;

2’b01,

2’b10,

2’b11:out=a&b;

Default:out=0;

Endcase

4、casex和casez语句:casez语句执行是的比较过程将不考虑控制表达式中处于高阻态“z”的那些位的比较;而casex语句则将高阻状态和不定状态“x”都视为不比关心的情况。

5、循环控制语句:forever、repeat、while、for循环语句。

6、Forever循环语句实现的是一种无线的循环,改循环语句内指定的循环体部分将不断重复的执行。格式如下:

Forever 语句或语句块;

Forever语句常用来产生周期性的波形来作为仿真测试信号。

如initial

Begin

Forever

#25 clk=~clk;

End 产生一个周期为50的时钟波形。

如果需要在某个时刻跳出forever循环语句所指定的无限循环,则通过在循环体语句块中使用终止语句(disable语句)来实现这一目的。

如:

begin:FOREVER_PART

forever

begin

count=count+1;

if(count>=200) disable FOREVER_PART;

#25 clk=~clk;

End

End

7、repeat循环语句

repeat循环语句实现的是一种循环次数预先指定的循环,这中循环语句内的循环体部分被重复执行指定的次数。格式:

repeat(<循环次数表达式>)语句或者语句块;

其中循环此时表达式可以是整数、变量或一个数值表达式。

Data={data<<1,temp}用来实现移位操作。Temp等于data的最后一位

8、while循环语句

while循环语句实现的是一种条件循环,也就是说只有在制定的条件表达式取值为“真”时才会重复执行循环体,否则不执行循环体。格式如下:

while(<条件表达式>)语句或语句块;

只要条件表达式的值成立,就一直执行下去。知道条件表达式的值不成立结束语句的执行。

9、for循环语句

与while语句一样,for循环语句实现的循环也是一种“条件循环”,只有在制定的条件表达式成立时才进行循环。格式:

For(<语句一>;<条件表达式>;<语句二>)循环体语句或语句块;

语句一和语句二是两条过程赋值语句,他们分别来对循环计数变量执行赋初值操作和增值操作;分一下几步:

(1)、执行语句一。

(2)、对“<条件表达式>”是否成立做出判断:若“条件表达式”取值为真,则执行for循环语句中制定的“循环语句和语句块”,然后执行下面的第3步;若

“条件表达式”的取值不为真,则不再执行循环体部分,循环过程结束,退出for循环语句的执行。

(3)、执行语句二然后转到(2)继续执行。

从上面我们知道:“<语句一>”只是在第一次循环开始之前被执行了一次,他通常是一条给循环计数变量赋初值的过程赋值语句;“<语句二>”是每次循环技术后、下一次循环开始前被执行的,他通常用于对循环计数变量的取值进行修改;而“条件表达式”的取值判断是在每次循环开始前发生的,他的结果决定着“是否继续执行循环”。

10、任务

引入任务和函数的目的是为了对需要多次执行的语句进行描述,使之便于理解和调试,引入任务和函数还可以简化程序的结构,增强代码的易读性。

任务的定义:

语法格式如下:

Task<任务名>;

端口与类型说明

局部变量说明

Begin

行为语句

End

Endtask

其中<任务名>是为定义任务所取的一个名称。在<任务名>后面不能出现输入输出端口列表。在定义任务的时候,要注意以下几点:

(1)、在第一行“task”语句中不能列出端口名称表;

(2)、在任务定义结构中的“行为语句”部分可以有延时语句、敏感事件控制语句等时间控制语句的出现。

(3)、一个任务可以没有输出,输入和双向端口,也可以有一个或多个输出输入和双向端口。

(4)、一个任务刻意没有返回值,也可以通过输出端口或双向端口返回一个或多个返回值。

verilog基本语法

Verilog基本语法 【逻辑值】 逻辑0 表示低电平,GND 逻辑1 表示高电平,VCC 逻辑X 表示未知电平,可能是高电平,也可能是低电平 逻辑Z 表示高阻态,外部没有激励信号,是一个悬空状态 注:高阻态的实质:电路分析时高阻态可做开路理解。 可以把它看作输出(输入)电阻非常大,对下级电路无任何影响。 若为0、x、z则按照假处理;若为1,按真处理。 【进制】 二进制4'b0101 —4位二进制数0101 十进制数4’d2 —4位十进制数2 十六进制数4’ha —4位十六进制数a Verilog中若不指定位宽,默认32位;若不指定位宽不指定进制,默认32位宽的十进制数。 【标识符】 标识符可以是字母、数字、$和_(下划线)的组合,且开头必须是字母或下划线,区分大小写。不建议大小写混合使用。 【数据类型】 寄存器关键字reg,默认初始值位不定值X; reg[31:0] delay_cnt; //[31:0],指定寄存器位宽32位, reg key_reg; // 默认位宽为1. reg类型数据只能在always和initial语句中被赋值。 线网表示结构实体的物理连线,包括wire和tri类型 参数常量,用parameter定义。 parameter H_SYNC = 11'd41; 【运算符】 [条件操作符] ?: 例,a?b:c //如果a为真就选b,否则选择c。 result=(a>=b)?a:b; [逻辑运算符] !&& || [位运算符] ~ & | ^(按位异或) a&b; //自动将位宽小的数高位补零至较大数的位宽,然后按位与操作。[移位运算符] << >> 用0填补移出的空位。左移时位宽增加,右移位宽不变。 [位拼接运算符] {} 例,{a,b} //将a和b拼接起来,作为一个新信号,a为高位。 c={a,b[3:0]}; //a、b位宽均为8位,c为8+4=12位。

Verilog语言基础知识

Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例一个8位全加器的Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; @ assign {cout,sum}=ina+inb+cin; 模块的端口声明了模块的输人和输出口。其格式如下: module 模块名(口1,口2,口3,口4,……); 2.模块内容 模块内容包括I/O说明,信号类型声明和功能定义。 (1) I/O说明的格式如下: ; 输人口: input端口名1,端口名2,……端口名N; 输出口: output端口名l,端口名2,……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portl,input port2,…output portl,output port2,…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 ( reg[7:0] out; 数字 (1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 ) 完整的数字表达式为: <位宽>'<进制> <数字>, 位宽为对应二迸制数的宽度,如: 8'b nets型变量wire nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表。 这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下: & ⑴.定义宽度为1位的变量: wire 数据名1,数据名2,……数据名n; 例如:wire a,b; register型变量reg register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register

从Verilog到VHDL(上)基本语法

从Verilog 到VHDL(上)基本语法 16 六 从学校里开始,我所接触的就一直是VerilogHDL 而非更老牌的VHDL, 而且后续接触的项目中也多半是Verilog 的用户,坦白的讲,Verilog 的活力也确实更足一些,从 IEEE1800-2005 开始的SystemVerilog 的标准化,将 Verification 和Design 的一体化的尝试,我个人认为,是走在正确的道路上。 所以,我确实想不到,我竟然也要回头学起VHDL 来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL ,看来终究是绕不过去的了正如一个Design Verification 工程师在目前想完全的不和SpecmanE 打交道是很难的一样。 面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来 没有接触过VHDL ,当然会存在很多非常初级的东西。 而在本文之后,打算再写一篇简单阐述下结合Cadence 的IUS 工具,使用SystemVerilog 对VHDL 进行验证的基本方

法。 起手式从Verilog 撞进VHDL 的世界,有些东西要先搞清 楚,否则会一头雾水: 1. 大小写敏感:Verilog 是大小写敏感的,VHDL 则非; 2.注释:Verilog 的行注释为// ,块注释为/**/;VHDL 只 支持 行注释–;[1. 这个算是不方便的一个地方了,不过不 基本结构 论是在Vim 还是Emacs 当中,批量做行注释也很容易实现;] VHDL 被认为是要求更严格,更多讲究的语言,相比和 C 类 似的Verilog ,架构上更严谨一些: 1.基本结构:从上往下为 USE 定义区(调用库和包);Package 定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规 格); [2. Entity 感觉像是 C 的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module 里头一起完成 了。]Architecture 定义区(描述内部功能);[3. 同 上,相当于Verilog 的Module 内部实现。]Configuration 定义区(决定那个Architecture 被使用)[4. 这也许就是 之所以要分开 Arch 和Entity 的原因,类似的效果在Verilog 里实现,则

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

(完整word版)Verilog-A30分钟快速入门教程

?Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

Verilog语法入门,初学者必看

Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/*” 开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21 //32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3 //一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3 //一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110 // 增强可读性 4’b10?? //相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world” //是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。 reg value; //reg是关键字;value是标识符

Verilog-A 30分钟快速入门教程

?进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS L anguage Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog 基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的 简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(o ut)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(o ut)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如:

VerilogHDL语法基础

Verilog HDL语法基础(1) Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/ *”开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21//32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3//一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3//一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110// 增强可读性 4’b10??//相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world”//是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。

3.2.1 Verilog HDL程序入门[共2页]

║68 第3章 硬件描述语言Verilog HDL基础 3.2 Verilog HDL程序基本结构 Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL既是一种行为描述的语言,也是一种结构描述的语言。也就是说,既可以用电路的功能描述,也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下5种。 ?系统级(system):用高级语言结构实现设计模块的外部性能的模型。 ?算法级(algorithm):用高级语言结构实现设计算法的模型。 ?RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。 ?门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。 ?开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。 一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能。 ?可描述顺序执行或并行执行的程序结构。 ?用延迟表达式或事件表达式来明确地控制过程的启动时间。 ?通过命名的事件来触发其他过程里的激活行为或停止行为。 ?提供了条件、if-else、case、循环程序结构。 ?提供了可带参数且非零延续时间的任务(task)程序结构。 ?提供了可定义新的操作符的函数结构(function)。 ?提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 ? Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能。 —提供了完整的一套组合型原语(primitive); —提供了双向通路和电阻器件的原语; —可建立MOS器件的电荷分享和电荷衰减动态模型。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。 Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面将介绍Verilog

第二章Verilog基本知识

2.1 Verilog HDL的语言要素 Verilog HDL语法来源于C语言基本的语法,其基本此法约定与 C语言类似。 程序的语言要素称为语法,是由符号、数据类型、运算符和表达式构成的,其中符号包括空白符、注释符、和转义标示符、关键字、数值等。 2.1.1 空白符 空白符包括空格符(\b),制表符(\t)、换行符和换页符。空白符使代码看起来结构清晰,阅读起来更方便。在编译过程中,空白符被忽略。 2.1.2 注释符 Verilog HDL语言允许插入注释,标明程序代码功能、修改、版本等信息,以增强程序的可阅读性和帮助管理文档。 Verilog HDL有两种注释方式 1) 单行注释:单行注释以“ // ”开始,Verilog HDL 忽略从此处到行尾的内 容 2) 多行注释:多行注释以“ /* ”开始,到“ */ ”结束,Verilog 忽略 其中的注释内容

在Verilog HDL 中,标识符( Identifier )被用来命令信号名、模块名、参数名等。它可以使任意一组字母、数字、$符号和_符号的组合。应该注意的是,标识符的字符区分大小写,并且第一个字符必须是字母或者下划线 Verilog HDL规定了转义标识符(Escaped Identifie) 采用转义字符可以在一 条标识符中包含任何可打印的字符。转义标识符以“ ”(反斜线)符号开头,以 空白符结尾(空白可以是一个空格、一个制表符或者换行符) 2.1.4 关键字 Verilog HDL语言内部已经使用的词称为关键字或保留字,它是 Verilog HDL语言的内部专用词,是事先定义好的确认符,用来组织语言结构的。需要注意的是,在Verilog HDL中,保留字都是小写的。

有关Verilog 中的一些语法

有关Verilog 中的一些语法 位运算符 1) ~ //取反 2) & //按位与 3) | //按位或 4) ^ //按位异或 5) ^~ //按位同或(异或非) 逻辑运算符 在Verilog HDL语言中存在三种逻辑运算符: 1) &&逻辑与 2) || 逻辑或 3) !逻辑非 等式运算符 在Verilog HDL语言中存在四种等式运算符: 1) == (等于) 2) != (不等于) 3) === (等于) 4) !== (不等于) "=="和"!="又称为逻辑等式运算符。其结果由两个操作数的值决定。由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。

而"==="和"!=="运算符则不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数必需完全一致,其结果才是1,否则为0。"==="和"!=="运算符常用于case表达式的判别,所以又称为"case等式运算符"。 位移运算符 左移:右边的添0 右移:左边的添0,移除的位舍去 举例: 4’b1001<<1 = 5’b10010; 4’b1001<<2 = 6’b100100; 1<<6 = 32’b1000000; 4’b1001>>1 = 4’b0100; 4’b1001>>4 = 4’b0000; 位拼接运算符 1.{a,b[3:0],w,3’b101}也可以写成为 {a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1} 2.{4{w}} //这等同于{w,w,w,w} 3.{b,{3{a,b}}} //这等同于{b,a,b,a,b,a,b} 负数: 一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。见下例:-8'd5 //这个表达式代表5的补数(用八位二进制数表示) wire型变量通常是用来表示单个门驱动或连续赋值语句驱

Verilog-A 30分钟快速入门教程

Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

Verilog中的一些语法和技巧

1、. 2、. 3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但 是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。 4、在数据类型中?和Z均表示高阻态。 5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定 是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。 6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型 数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0]; 7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。 8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动 地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。 9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是 2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x。而 = = =和!= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0. 10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变 量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)赋值语句执行完后,块才结束 2 b的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果。 11、模块的描述方式:(RTL为寄存器传输级描述) “(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现。分为两种a、显式连续赋值语句;

verilog语法练习

1,八位数据通路控制器 `define ON 1?b1 `define OFF 1?b0 wire controlswitch; wire [7:0] in out; assign out = (controlswitch == `ON) ? in : 8?h00; 2,数据在寄存器中的暂时保存

module reg8(en ,clk, data,rst,out); input en,clk,rst; input [7:0] data; output [7:0] out; reg [7:0] out; always @ (posedge clk) begin if(!rst) out <= 0 else if (en) out <= data; else out <= 8?h00; end endmodule 3,状态机 module fsm(clk,rst,a,k1,k2); input clk,rst,a; output k1,k2; reg k1,k2; reg state; parameteter Idle = 2?b00, Start = 2?b01, Stop = 2?b10, Clear = 2?b11; always @ (posedge clk) begin if (!rst) begin state <= Idle; k2 <= 0; k1 <= 0;

end else case (state) Idle: begin If(a) begin state <= Start; k1 <= 0; end else state <= Idle; end Start : begin If(!a) state <= Stop; else state <= Start; end Stop :begin If (a) Begin state <= Clear; k2 <= 1; end else state <= Stop; end Clear : begin If (!a) begin state <= Idle; k2 <= 0; k1 <= 1; end else state <= Clear; end endcase endmodule 4,组合逻辑电路设计实例 8位带进位端的加法器的设计实例module adder_8 (cout, sum, a,b,cin); output [7:0] sum; output cout; input [7:0] a;

verilog_经验(适合初学者)

先记下来,後面會有進一步的解說: 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:forever,while等; 4、尽量采用同步方式设计电路; 5、尽量采用行为语句完成设计; 6、always过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号; 7、所有的内部寄存器都应该可以被复位; 8、用户自定义原件(UDP元件)是不能被综合的。 一:基本 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过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确

_Verilog_HDL的基本语法

第三章 Verilog HDL的基本语法 前言 Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种: ?系统级(system):用高级语言结构实现设计模块的外部性能的模型。 ?算法级(algorithm):用高级语言结构实现设计算法的模型。 ?RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。 ?门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。 ?开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。 一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能: ?可描述顺序执行或并行执行的程序结构。 ?用延迟表达式或事件表达式来明确地控制过程的启动时间。 ?通过命名的事件来触发其它过程里的激活行为或停止行为。 ?提供了条件、if-else、case、循环程序结构。 ?提供了可带参数且非零延续时间的任务(task)程序结构。 ?提供了可定义新的操作符的函数结构(function)。 ?提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 ?Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能: -提供了完整的一套组合型原语(primitive); -提供了双向通路和电阻器件的原语; -可建立MOS器件的电荷分享和电荷衰减动态模型。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强 度,可以通过设定宽范围的模糊值来降低不确定条件的影响。 Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,我们只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对Verilog HDL中的基本语法逐一加以介绍。 3.1.简单的Verilog HDL模块 3.1.1.简单的Verilog HDL程序介绍

Verilog HDL 入门教程(华为)

文档中心 文档编号 资源类别: HDL语言版本 1.0 密级 内部公开 共41页 Verilog HDL入门教程(仅供内部使用) 拟制: 批准: 批准: 中研基础 中研基础 日期:

日期: 日期: 2004.8.3 yyyy/mm/dd 版权所有不得复制 Verilog HDL 入门教程绝密请输入文档编号日期 2004.8.3 修订版本 1.00 描述 初稿完成 修订记录 作者

2004-08-16 第2页,共41页版权所有,侵权必究 Verilog HDL 入门教程 绝密请输入文档编号 目录 1 前 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 HDL设计方法学简 介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1 数字电路设计方 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 硬件描述语 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Verilog语法总结

Verilog语法总结 数电基础 能够存储1位二值信号的基本单元电路统称为触发器。 根据逻辑功能的不同特点,可以将数字电路分成两大类: 组合逻辑电路和时序逻辑电路。 组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。 时序逻辑电路中,任一时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态。或者说还与以前的输入有关,因此时序逻辑必须具备记忆功能。 组合逻辑电路时序逻辑电路 逻辑值 逻辑0:表示低电平,也就对应我们电路GND; 逻辑1:表示高电平,也就是对应我们电路的 VCC; 逻辑X:表示未知,有可能是高电平,也有可能 是低电平; 逻辑Z:表示高阻态,外部没有激励信号,是一 个悬空状态。 数字进制格式 Verilog数字进制格式包括二进制、八进制、十进

制和十六进制。 一般常用的为二进制、十进制和十六进制。 二进制表示如下:4’b0101 表示4位二进制数字0101 十进制表示如下:4’d2 表示4位十进制数字2(二进制0010) 十六进制表示如下:4’ha 表示4位十六进制数字a(二进制1010) 16’b1001_1010_1010_1001 = 16’h9AA9 第一个表示用几个二进制位可以表示、’为语法、b为二进制,d为十进制,h为16进制,后面则表示要输出输入的字。(括号内为二进制表示,因为最终在计算机中都会变为二进制表示) 标识符 标识符可以是任意一组字母、数字、$符号和_(下划线)符号的组合; 但标识符的第一个字符必须是字母或者下划线; 标识符是区分大小写的; 数据类型 在Verilog 语言中,主要有三大类数据类型:寄存器数据类型、线网数据类型和参数数据类型。 寄存器类型: 寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器储存的值寄存器数据类型的关键字是reg,reg 类型数据的默认初始值为不定值x reg类型的数据只能在always 语句和initial 语句中被赋值。 如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器; 如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线; 线网类型: 线网数据类型表示结构实体(例如门)之间的物理连线。线网类型的变量

相关主题