VerilogHDL语法基础

VerilogHDL语法基础
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中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。

reg value; //reg是关键字;value是标识符

8转义标识符

转义标识符以“\”开始,以空白符结束。Verilog将反斜线和空白符之间的字符逐个进行处理。所有的可打印字符均可包含在转义字符中,而反斜线和表示结束的空白符不作为标识符的一部分。

Verilog语法基础(2)——系统函数

系统任务

Verilog为某些常用操作提供了标准的系统任务(也叫系统函数)这些操作包括屏幕显示、线网值动态监视、暂停和结束仿真等。所有的系统任务都具有$的形式。

显示信息$display(p1,p2,p3,…,pn);

$display会自动在字符串的结尾处插入一个换行符,因此如果参数列表为空,则di splay的效果是现实光标移动到下一行

监视信息$monitor(p1,p2,p3,…,pm);

系统函数$monitor对其参数列表中的变量值或者信号值进行不间断的监视,当其中任何一个发生变化的时候,显示所有参数的数值。$monitor只需调用一次即可在整个仿真过程中生效。

编译指令

Verilog提供了一些编译指令供用户使用,其使用方式为’

‘define用于定义verilog中的文本宏。类似于c中的#define.

‘define WORD_SIZE32

‘include在编译期间将一个verilog源文件包含在另一个verilog文件中,类似于c中的#i n clude结构。

‘include header.v

Verilog语法基础(2)——数据结构2

1整数、实数和时间寄存器类型

整数是一种通用的寄存器数据类型,用于对数量进行操作,使用integer进行声明。

integer counter; //一般用途的变量用作计数器

initial

counter = -1; //把-1存储到寄存器中

实数:实常量和实数寄存器数据类型使用关键字real来声明,可以用十进制或科学计数法来表示。实数声明不能带有范围,其默认值为0.如果将一个实数赋予一个整数,那么实数将会被取为最接近的整数。

real delta; //定义一个名为delta的实型变量

时间寄存器:仿真是按照仿真时间进行的,verilog使用一个特殊的时间寄存器数据类型来保存仿真时间。时间变量通过使用关键字time来声明,其宽度与具体实现无关,最小为64位。通过调用系统函数$time可以取得当前的仿真时间。

2数组

Verilog中允许声明reg、integer、time、real、realtime及其向量类型的数组,对数组的维数没有限制,即可声明任意维数的数组。线网数组也可用于连接实例的端口,数组中的每个元素都可以作为一个标量或者向量,以同样的方式来使用,形如<数组名>[<下标>]。

Integer count[0:7]; //由八位计数变量组成的数组

reg bool [31:0]; //由32个1位的布尔寄存器变量组成的数组

wire [7:0] w_array2 [5:0]; //声明8位向量的数组

注意:不要把数组和线网或寄存器向量混淆起来。向量是一个单独的元件,它的位宽是n,数组由多个元件组成,其中每个元件的位宽为n或1.

3存储器

Verilog中使用寄存器一维数组来表示存储器。数字的每个元素成为一个元素或一个字(word),由一个数组索引来指定。每个字的位宽为1位或者多位。

注意n个1位寄存器和一个n位寄存器是不同的。如果需要访问存储器中的一个特定的字,则可通过子的地址作为数组的下标来完成。

reg mem1bit[0:1023]; //1k的1位存储器

reg [7:0] membyte [0:1023]; //1k的字节(8位)存储器membyte

membyet[511] //取出membyte中地址511所处的字节

4参数

Verilog使用关键字parameter在模块内定义常数。参数代表常数,不能像变量那样赋值,但是每个模块实例的参数值可以在编译阶段被重载。通过参数重载使得用户可以对模块实例进行定制。除此之外还可以对参数的类型和范围进行定义。

parameter port_id = 5; //定义常数port_id 为5

5字符串

字符串保存在reg类型的变量中,每个字符占用8位(一个字节),因此寄存器变量的宽度应足够大,以保证容纳全部字符。如果寄存器变量的宽度大于字符串的大小,则verilog用0来填充左边的空余位。如果寄存器变来那个的宽度小于字符串的大小,则verilog截去字符串最左边的位。

Verilog语法基础(2)——数据结构1

Verilog的数据类型

1值的种类

四值电平逻辑

1逻辑1,条件为真

X逻辑值不确定

Z高阻,浮动状态

除了逻辑值外,Verilog还是用强度值来解决数字电路中不同强度的驱动源之间的赋值冲突。

强度等级类型程度

Pull驱动

Large存储

Weak驱动

Medium存储

Small存储

Highz高阻最弱

如果两个具有不同强度的信号驱动同一个线网,则竞争结果值为高强度信号的值。

如果两个强度相同的信号之间发生竞争,则结果为不确定值。

2线网

线网(net)表示硬件单元之间的连接。线网一般使用关键字wire进行声明。如果没有显式的说明为向量,则默认线网的位宽为1。线网的默认值为Z,(trireg类型线网例外,其默认值为X)。其值由驱动源确定,如果没有驱动源则线网的值为Z

Net并不是一个关键字,它代表了一组数据类型,包括wire,wand,wor,tri,triand,trior以及trireg等。

3寄存器

寄存器用来表示存储元件,它保持原有的数值,直到被改写。注意:不要将这里的寄存器和实际电路中由边沿触发器构成的硬件寄存器混淆。在Verilog中,术语register仅意味着一个保持数值的变量。与线网不同,寄存器不需要驱动源,而且也不像硬件寄存器那样需要时钟信号。在仿真过程中的任意时刻,寄存器的值都可以通过赋值来改变。

寄存器的数据类型通过关键字reg来声明,默认值为X。

4向量

线网和寄存器类型的数据均可声明为向量(位宽大于1)。如果在声明中没有指定位宽,则默认为标量(1位)

wire a; //标量线网变量,默认

wire [7:0] bus; //8位的总线

reg clock ; //标量寄存器,默认

reg [0:40] virtual_addr; //向量寄存器,41位宽的虚拟地址

向量通过[high#:low#]进行说明,方括号中左边的数总是代表向量的最高有效位。

向量域选择

对于上面例子中声明的向量,我们可以指定它的某一位或者若干个相邻位。

Verilog基础(3)——模块端口

模块

模块的定义以关键字module开始,模块名、端口列表、端口声明和可选的参数声明必须出现在其他部分的前面,endmodule语句必须为模块的最后一条语句。端口是模块与外部环境交互的通道,只有在模块有端口的情况下才需要有端口列表和端口声明。模块内部的5个组成部分是:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数。

端口

端口是模块与外界环境交互的接口。对外部环境来讲,模块内部是不可见的,对模块的调用只能通过其端口进行。这种特点为设计者提供了很大的灵活性:只要接口保持不变,模块内部的修改并不会影响到外部环境。常将端口成为终端。(t erminal)

端口列表:

在模块的定义中包括一个可选的端口列表。如果模块和外部环境没有交换任何信号,则可以没有端口列表。

端口声明

端口列表中的所有端口必须在模块中进行声明,verilog中的端口具有以下三种了类型:input、output、和inout。在verilog中,所有的端口隐含地声明为wire类型,因此如果希望端口具有wire数据类型,将其声明为三种类型之一即可:如果输出类型的端口需要保存数值,则必须将其显式的声明为reg数据类型。

不能将input和inout类型的端口声明为reg数据类型,这是因为reg类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化,并不能保存这些信号的值。

注意,在verilog中,也可以使用ANSI C风格进行端口声明。这种风格的声明的优点是避免了端口名在端口列表和端口声明语句中的重复。如果声明中未指明端口的数据类型,那么默认端口具有wire数据类型。

如:

module fulladd4(output reg [3:0] sum,

output reg c_out,

input [3:0] a,b,

input c_in);

……

……

endmodule

端口连接规则

将一个端口看成由相互链接的两个部分组成,一部分位于模块内部,另一部分位于模块外部。当在一个模块中调用(实例引用)另一个模块时,端口之间的连接必须遵守一些规则。

输入端口:从模块内部来讲,输入端口必须为线网数据类型,从模块外部来看,输入端口可以连接到线网或者reg数据类型的变量。

输出端口:从模块内部来讲,输出端口可以是线网或者reg数据类型,从模块外部来看,输出必须连接到线网类型的变量,而不能连接到reg类型的变量。

输入/输出端口

从模块内部来讲,输入/输出端口必须为线网数据类型;从模块外部来看,输入/输出端口也必须连接到线网类型的变量。

位宽匹配

在对模块进行调用的时候,verilog允许端口的内、外两个部分具有不同的位宽。一般情况下,verilog仿真器会对此警告。

未连接端口

Verilog允许模块实例的端口保持未连接的状态。例如,如果模块的某些输出端口只用于调试,那么这些端口可以不与外部信号连接。

端口与外部信号的连接

在对模块调用的时候,可以使用两种方法将模块定义的端口与外部环境中的信号连接起来:按顺序连接以及按名字连接。但两种方法不能混合在一起使用。

顺序端口连接:

需要连接到模块实例的信号必须与模块声明时目标端口在端口列表中的位置保持一致。

Verilog基础(4)——门级建模

门级建模

门的类型:(1)与/或门类(and/or)(2)缓冲器/非门类(buf/not)

与门(and)和或门(or):

与门、或门都有一个标量输出端和多个标量输入端。门的端口列表中的第一个端口必是输出端口,其后为输入端口。当任意一个输入端口的值发生变化时,输出端的值立即重新计算。

verilog中可以使用的属于与/或门类的术语包括:

and nand or nor xor xnor

例:与门/或门的实例引用

wire OUT,IN1,IN2;

and a1(OUT,IN1,IN2); //基本门的实例引用

nand na1_3inp(OUT,IN1,IN2,IN3); //输入端超过两个,三输入与非门

and (OUT,IN1,IN2); //合法的门实例引用,不给实例命名

缓冲器/非门

与and/or门相反,buf/not门具有一个标量输入和多个标量输出。端口列表中的最后一个终端连接至输入端口,其他终端连接至输出端口。对于多个输出端的buf/not门,所有输出端的值都是相同的。

verilog提供了两种基本的门:buf not

在verilog中可以实例引用这些门,注意:buf和not门可以具有多个输出端口,但只能具有一个输入端口,这个输入端口必须是实例端口列表的最后一个。例:

buf b1(OUT1,IN); //基本门的实例引用

not n1(OUT1,IN);

buf b1_2out(OUT1,OUT2,IN); //输出端多于两个

not (OUT1,IN); //实例引用门时,不给实例命名

带控制端的缓冲器/非门(bufif/notif)

bufif1 bufif0 notif1 notif0

这四类门只有在控制信号有效的情况下才能传递数据;如果控制信号无效,则输出为高阻抗Z。

bufif1 b0(out,in,ctrl);

在控制信号有效的情况下,这些门才能传递信号。在某些情况下,例如当一个信号由多个驱动源驱动时,这样设计驱动源:让它们的控制信号的有效时间相互错开,从而避免一条信号线同时被两个源驱动,这时就需要用带控制端的缓冲器/非门来搭建电路。

门延迟

Verilog中允许用户通过门延迟来说明逻辑电路中的延迟,此外用户还可以指定端到端的延迟。

在Verilog门级原语中,有三种从输入到输出的延迟。

1 上升延迟:在门的输入发生变化的情况下,门的输出从0,x,z变化到1所需的时间成为上升延迟。

2 下降延迟:下降延迟是指门的输出从1,x,z变化到0所需的时间。

3 关断延迟:门的输出从0,1,x变化为高阻Z所需的时间。

另外,如果值变化到不确定值x,则所需的时间可以看成是以上三种延迟值中最小的那个。

Verilog中有三种不同的方法来说明门的延迟。如果用户只确定了一个延迟值,那么所有类型的延迟都是用这个延迟值,如果用户指定了两个延迟值,则他们分别代表上升延迟和下降延迟,两者中小者为关断延迟,如果用户指定了三个延迟值,则他们分别代表上升延迟、下降延迟和关断延迟。如果为制定延迟值,那么默认延迟值为0.

延迟声明的例子

and #(3,4,5) b1 (out,in,control); //上升延迟为3,下降延迟为4,关断延迟为5

最小/典型/最大延迟

Verilog中,用户除可以指定上面所述的三种类型的延迟以外,对每种类型的延迟还可以指定其最小值、最大值和典型值。

?最小值设计者预期逻辑门所具有的最小延迟

?典型值设计者预期逻辑门所具有的典型延迟

?最大值设计者预期逻辑门所具有的最大延迟

VerilogHDL复习题与答案

VerilogHDL硬件描述语言复习 一、 1.VerilogHDL是在哪一年首次被IEEE标准化的? 答:VerilogHDL是在1995年首次被IEEE标准化的。 2.VerilogHDL支持哪三种基本描述方式? 答:VerilogHDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程 化结 构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述 建模 3.VerilogHDL是由哪个公司最先开发的? 答:VerilogHDL是由GatewayDesignAutomation公司最先开发的 4.VerilogHDL中的两类主要数据类型什么? 答:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示 抽象的数据存储元件。 5.UDP代表什么? 答:UDP代表用户定义原语 6.写出两个开关级基本门的名称。答: pmosnmos 7.写出两个基本逻辑门的名称。答: andor 8.在数据流描述方式中使用什么语句描述一个设计? 答:设计的数据流行为使用连续赋值语句进行描述 9.采用结构描述方式描述1位全加器。 答: modulefull_add(a,b,cin,s,co); inputa,b,cin; outputs,co; wireS1,T1,T2,T3; xor X1(S1,a,b), X2(s,S1,cin); and A1(T3,a,b), A2(T2,b,cin), A3(T1,a,cin); or O1(co,T1,T2,T3); endmodule 10.initial语句与always语句的关键区别是什么? 答:1)initial语句:此语句只执行一次。 2)always语句:此语句总是循环执行,或者说此语句重复执行。 11.采用数据流方式描述2-4译码器。 答: 'timescale1ns/ns moduleDecoder2×4(A,B,EN,Z); inputA,B,EN; output[0:3]Z; 1

Verilog HDL语言的描述语句

第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);

endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块

Verilog HDL常用的行为仿真描述语句(一)

Verilog HDL常用的行为仿真描述语句(一) 一、循环语句 1、forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形。 2、利用for、while循环语句完成遍历 for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:[c-sharp:nogutter] view plaincopy? parameter mode_num = 5; initial begin // 各种不同模式的参数配置部分 for(i=0; i<mode_num-1; i=i+1) begin case (i) 0: begin . . end

1: begin . . end . . endcase end // 各种模式共同的测试参数 . . end 3、利用repeat语句来实现有次数控制的事件,其典型示例如下: [c-sharp] view plaincopy? initial begin

// 初始化 in_data = 0; wr = 0; // 利用repeat语句将下面的代码执行10次 repeat(10) begin wr = 1; in_data = in_data + 1; #10; wr = 0; #200; end end 4、用disable实现循环语句的异常处理,其典型示例如下:[c-sharp] view plaincopy? begin : one_branch for(i=0; i<n; i=i+1) begin : two_branch if (a==0) disable one_branch; if (a==b)

veriloghdl的行为语句

Verilog HDL的行为语句 Verilog HDL有许多的行为语句,使其成为结构化和行为性的语言。Verilog HDL语句包括:赋值语句、过程语句、块语句、条件语句、循环语句、编译预处理等,如表5-14 所示。符号“√”表示该语句能够为综合工具所支持,是可综合的。 5.3.1 赋值语句 赋值语句包括持续赋值语句与过程赋值语句。 1. 持续赋值语句assign为持续赋值语句,主要用于对wire 型(连线型)变量赋值。例如:assign c=~(a&b); 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b 信号的任何变化,都将随时反映到c上来。 2. 过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。 a. 非阻塞赋值方式非阻塞赋值符号为“<=”,如:b<=a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。 b. 阻塞赋值方式阻塞赋值符号为“=”,如:b=a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该语句结束时立刻改变。如果在一个块语句中(例如always块语句),有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。

5.3.2 过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initial及always。在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。1. initial过程语句initial过程语句使用格式如下:initial begin 语句1; 语句2; | 语句n; end intial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。 2. aIways过程语句always 过程语句使用格式如下:always @ (<敏感信号表达式>) begin //过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环 //task,function调用end always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中。只有当触发条件满足敏感信号表达式时,其后的“begin-end”块语句才能被执行。 3. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信

VerilogHDL及其Testbench编写方法

Verilog HDL及其Testbench总结 (欢迎批评指正:jackhuan@https://www.360docs.net/doc/87932105.html,) 1 Verilog HDL的基本观点 1) 观点1:module内每个基本模块之间是并行运行的。 2) 观点2:每个模块相当于一个连续赋值的过程。 3) 观点3:方程和任务是共享代码的最基本方式。 4) 观点4:同语言可用于生成模拟激励和指定测试的验证约束条件。 5) 观点5:库的概念相当于Visual C++中的DLL概念。 6) 观点6:文件与文件之间的关系可以使用C++中的*.h和*.cpp之关系理解。 2 设计建模的三种方式 1) 行为描述方式。过程化结构,每个结构之间是并行的。 2) 数据流方式。连续赋值语句方式,每个赋值语句之间是并行的,且赋值语 句和结构之间是并行的。 3) 结构化方式。门和模块实例化语句。 3 两者数据类型 1) 线网数据类型wire:表示构件间的物理连线; 2) 寄存器数据类型reg:表示抽象的数据存储元件。 4 几个概念 1) 模块(module)。模块是Verilog HDL的基本描述耽误,用于描述某个设计 的功能或结构及其与其它模块通信的外部端口。一个设计的结构可以使用开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用连续赋值语句进行描述;时序行为使用过程结构描述。模块的声明部分和语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必须在使用前出现。 2) 只有寄存器类型数据(reg/integer)能够在initial和always语句中被赋值。 3) 阻塞性和非阻塞性赋值。理解这两个概念在学习verilog HDL中非常重要。 决定了时序的正确与否。阻塞性赋值的概念是在该条赋值语句执行完成后再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。而非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类似于并行语句,稍有处理不当,会引发多驱动源问题。关于多驱动源问题,在我的VHDL总结中有所表述,此处不在费墨。 4) 用户定义原语(UDP)。UDP的定义不依赖于模块定义,因此出现在模块定 义之外,也可以在单独的文本文件中定义UDP。UDP只能有一个输出或一个/多个输入端口。UDP的行为以真值表的形式描述。 5) 并行语句块和顺序语句块。并行语句块中的各语句并行执行。当并行语句 块中的最后动作执行完成是,顺序语句块的语句继续执行。也就是说,并行语句块中的所有语句必须在控制转出语句块之前完成执行。并行语句块

相关文档
最新文档