我是靠谱客的博主 阳光小伙,最近开发中收集的这篇文章主要介绍verilog 入门教程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

verilog 入门教程  


1.1 什么是Verilog HDL?

1.1 什么是Verilog HDL?

 Verilog HDL (Hardware Description Language) 是一种硬件描述语言,可以在算法级、门级到开关级的多种抽象设计层次上对数字系统建模。它可以描述设计的行为特性、数据流特性、结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。此外,verilog提供了编程语言接口,通过该接口用户可以在模拟、验证期间从外部访问设计,包括模拟的具体控制和运行。

1.2 Verilog的历史

Verilog HDL是由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得 Verilog HDL 迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得 Verilog HDL成为了该公司的独家专利。1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995. 

1.3 Verilog的主要描述能力

Verilog 是最佳的寄存器传输级设计语言和门级描述语言,这是Verilog成功的根本。

(1)基本逻辑门,例如 and、or 和 nand 等都内置在语言中。 

2.1 Verilog-模块

模块是Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中使用。

module module_name(port_list) ; 

...

endmodule



moduleHalfAdder (A, B, Sum, Carry) ; 

input A, B; //输入

output Sum, Carry;//输出

assign #2 Sum = A ^ B;//赋值

assign #5 Carry = A & B;//赋值

endmodule


2.2 Verilog-时延

Verilog HDL模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例。

assign #2 Sum = A ^ B;


`timescale 1ns /100ps


2.3 Verilog-assign语句

本节讲述连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。连续赋值语句的语法为: 

assign [delay] LHS_n e t = RHS_expression;

右边表达式使用的操作数无论何时发生变化, 右边表达式都重新计算, 并且在指定的时延后变化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值, 缺省时延为0。

图2 - 2显示了使用数据流描述方式对2 - 4解码器电路的建模的实例模型。

图2-2 2-4解码器电路

` timescale 1ns/ 1ns

module D e c o d e r 2 x 4 (A, B, EN, Z) ;

input A, B, EN;

output [ 0 :3] Z;

wire Abar, Bbar;

assign #1 Abar = ~ A; // 语句1。

assign #1 Bbar = ~ B; // 语句2。

assign #2 Z[0] = ~ (Abar & Bbar & EN ) ; // 语句3。

assign #2 Z[1] = ~ (Abar & B & EN) ; // 语句4。

assign #2 Z[2] = ~ (A & Bbar & EN) ; // 语句5。

assign #2 Z[3] = ~ ( A & B & EN) ; // 语句6。

endmodule

以反引号“ ` ”开始的第一条语句是编译器指令, 编译器指令` timescale 将模块中所有时延的单位设置为1 n s,时间精度为1 ns。例如,在连续赋值语句中时延值# 1和# 2分别对应时延1ns和2ns。

模块Decoder2x4有3个输入端口和1个4位输出端口。线网类型说明了两个连线型变量A b a r和B b a r (连线类型是线网类型的一种)。此外,模块包含6个连续赋值语句。

参见图2-3中的波形图。当E N在第5 ns变化时,语句3、4、5和6执行。这是因为E N是这些连续赋值语句中右边表达式的操作数。Z[ 0 ]在第7 ns时被赋予新值0。当A在第15 ns变化时, 语句1、5和6执行。执行语句5和6不影响Z[ 0 ]和Z[ 1 ]的取值。执行语句5导致Z[ 2 ]值在第17 ns变为0。执行语句1导致A b a r在第16 ns被重新赋值。由于A b a r的改变,反过来又导致Z[ 0 ]值在第18 n s变为1。

请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式是隐式而非显式的建模方式。此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。

图2-3 连续赋值语句实例


2.4 Verilog-initial语句

initial语句:在仿真中只执行一次,用于初始化变量,描述一次性行为,在仿真时刻0开始执行。

moduleTest(Pop,Pid);

outputPop,Pid;

regPop,Pid;

initial

begin

Pop=0;//语句1。

Pid=0;//语句2。

Pop=#51;//语句3。

Pid=#31;//语句4。

Pop=#60;//语句5。

Pid=#20;//语句6。

end

endmodule


2.5 Verilog-always语句

always语句总是循环执行,或者说此语句重复执行。

moduleFA_Seq(A,B,Cin,Sum,Cou)t;

inputA,B,Cin;

outputSum,Cout;

regSum,Cout;

regT1,T2,T3;

always

@(AorBorCin)begin

Sum=(A^B)^Cin;

T1=A&Cin;

T2=B&Cin;

T3=A&B;

Cout=(T1|T2)|T3;

end 

endmodule


Sum=(A^B)^Cin; 

#4T1=A&Cin;


Sum=#3(A^B)^Cin;


2.6 Verilog的结构化描述形式

在VerilogHDL中可使用如下方式描述结构:

parameterSIZE=4;

input[SIZE:1]FA,FB;

output[SIZE:1]FSum

inputFCin;

inputFCout;

wire[1:SIZE-1]FTemp;

FA_Str

FA1(.A(FA[1]),.B(FB[1]),.Cin(FCin),

.Sum(FSum[1]),.Cout(FTemp[2])),

FA2(.A(FA[2]),.B(FB[2]),.Cin(FTemp[1]),

.Sum(FSum[2]),.Cout(FTemp[2])),

FA3(FA[3],FB[3],FTemp[2],FSum[3],FTemp[3],

FA4(FA[4],FB[4],FTemp[3],FSum[4],FCout);

endmodule


2.7 Verilog-混合设计描述方式

在模块中,结构的和行为的结构可以自由混合。也就是说,模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及always语句和initial语句的混合。它们之间可以相互包含。来自always语句和initial语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。

下面是混合设计方式的1位全加器实例。

module FA_Mix (A, B, Cin, Sum, Cout); 

input A,B, Cin;

output Sum, Cout;

reg Cout;

reg T1, T2, T3;

wire S1;

xor X1(S1, A, B); // 门实例语句。

always

@ ( A or B or Cin ) begin // always 语句。

T1 = A & Cin;

T2 = B & Cin;

T3 = A & B;

Cout = (T1| T2) | T3;

end

assign Sum = S1 ^ Cin; // 连续赋值语句。

endmodule


2.8 Verilog-设计模拟

Verilog HDL不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。激励和控制可用初始化语句产生。验证运行过程中的响应可以作为“变化时保存”或作为选通的数据存储。最后,设计验证可以通过在初始化语句中写入相应的语句自动与期望的响应值比较完成。

下面是测试模块To p的例子。该例子测试2 . 3节中讲到的FA S e q模块。

m o d u l e T o p; // 一个模块可以有一个空的端口列表。

r e g PA, PB, PCi;

w i r e PCo, PSum;

// 正在测试的实例化模块:

FA_Seq F1(PA, PB, PCi, PSum, PC)o; // 定位。

i n i t i a l

b e g i n: O N L Y_O N C E

r e g [3:0] P a l;

/ /需要4位, Pal才能取值8。

f o r (P a l = 0; P al < 8; P a l = Pal + 1)

b e g i n

{PA, PB, PCi} = P a l;

#5 $d i s p l a y (“PA, PB, PCi = %b%b%”b, PA, PB, PCi,

“ : : : PCo, PSum=%b%b ”, PCo, PSum) ;

e n d

e n d

e n d m o d u l e


系统任务$ d i s p l a y调用中的时延控制规定$d i s p l a y任务在5个时间单位后执行。这5个时间单位基本上代表了逻辑处理时间。即是输入向量的加载至观察到模块在测试条件下输出之间的延迟时间。

这一模型中还有另外一个细微差别。P a l在初始化语句内被局部定义。为完成这一功能,初始化语句中的顺序过程( b e g i n - e n d)必须标记。在这种情况下, ONLY O N C E是顺序过程标记。如果在顺序过程内没有局部声明的变量,就不需要该标记。测试模块产生的波形如图2 - 7显示。下面是测试模块产生的输出。

PA, PB, PCi = 000 ::: PCo, PSum = 00

图2-7 测试模块To p执行产生的波形

图2-8 交叉连接的与非门

验证与非门交叉连接构成的R S F F模块的测试模块如图2 - 8所示。

` t i m e s c a l e 1 0 n s / 1 n s 

m o d u l e R S F F (Q, Qbar, R, S) ;

o u t p u t Q, Qbar;

i n p u t R, S;

n a n d #1 (Q, R, Qbar) ;

nand #1 (Qbar, S, Q,) ;

/ /在门实例语句中,实例名称是可选的。

e n d m o d u l e

m o d u l e T e s t;

r e g TS, TR;

w i r e TQ, TQb;

/ /测试模块的实例语句:

RS_FF NSTA ( .Q(T Q), .S(T S), .R(T R), .Q b a r(T Q b));

/ /采用端口名相关联的连接方式。

// 加载激励:

i n i t i a l

b e g i n:

T R = 0;

T S = 0;

#5 T S = 1;

#5 T S = 0;

T R = 1;

#5 T S = 1;

T R = 0;

#5 T S = 0;

#5 T R = 1;

e n d

/ /输出显示:

i n i t i a l

$m o n i t o r ("At time %t ," , $ t i m e,

"TR = %b, TS=%b, TQ=%b, TQb= %b"T,R , TS, TQ, TQ)b ;

e n d m o d u l e

RS_FF模块描述了设计的结构。在门实例语句中使用门时延;例如,第一个实例语句中的门时延为1个时间单位。该门时延意味着如果R或Qbar假定在T时刻变化,Q将在T+ 1时刻获得计算结果值。

模块Te s t是一个测试模块。测试模块中的R S F F用实例语句说明其端口用端口名关联方式连接。在这一模块中有两条初始化语句。第一个初始化语句只简单地产生T S和T R上的波形。这一初始化语句包含带有语句间时延的程序块过程赋值语句。

第二条初始化语句调用系统任务$m o n i t o r。这一系统任务调用的功能是只要参数表中指定的变量值发生变化就打印指定的字符串。产生的相应波形如图2 - 9所示。下面是测试模块产生的输出。请注意` t i m e s c a l e指令在时延上的影响。

图2-9 Te s t模块产生的波形

At time 0, TR=0, TS=0, TQ=x, TQb= x

后面的章节将更详细地讲述这些主题。

3.1 Verilog HDL中的标识符

Verilog HDL中的标识符(identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下是标识符的几个例子:

Verilog HDL定义了一系列保留字,叫做关键词,它仅用于某些上下文中。附录A列出了语言中的所有保留字。注意只有小写的关键词才是保留字。例如,标识符always (这是个关键词)与标识符A LWAY S(非关键词)是不同的。

最后

以上就是阳光小伙为你收集整理的verilog 入门教程的全部内容,希望文章能够帮你解决verilog 入门教程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部