verilog简明教程文档格式.docx

上传人:b****6 文档编号:16786604 上传时间:2022-11-26 格式:DOCX 页数:39 大小:49.77KB
下载 相关 举报
verilog简明教程文档格式.docx_第1页
第1页 / 共39页
verilog简明教程文档格式.docx_第2页
第2页 / 共39页
verilog简明教程文档格式.docx_第3页
第3页 / 共39页
verilog简明教程文档格式.docx_第4页
第4页 / 共39页
verilog简明教程文档格式.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

verilog简明教程文档格式.docx

《verilog简明教程文档格式.docx》由会员分享,可在线阅读,更多相关《verilog简明教程文档格式.docx(39页珍藏版)》请在冰豆网上搜索。

verilog简明教程文档格式.docx

用户定义原语(UDP)创建的灵活性。

用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。

开关级基本结构模型,例如pmos 

和nmos等也被内置在语言中。

提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查。

可采用三种不同方式或混合方式对设计建模。

这些方式包括:

行为描述方式—使用过程化结构建模;

数据流方式—使用连续赋值语句方式建模;

结构化方式—使用门和模块实例语句描述建模。

HDL中有两类数据类型:

线网数据类型和寄存器数据类型。

线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。

能够描述层次设计,可使用模块实例结构描述任何层次。

设计的规模可以是任意的;

语言不对设计的规模(大小)施加任何限制。

HDL不再是某些公司的专有语言而是IEEE标准。

人和机器都可阅读Verilog 

语言,因此它可作为EDA的工具和设计者之间的交互语言。

HDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。

PLI是允许外部函数访问Verilog 

模块内信息、允许设计者与模拟器交互的例程集合。

设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级。

能够使用内置开关级原语在开关级对设计完整建模。

同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。

能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。

这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。

在行为级描述中,Verilog 

HDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。

能够使用门和模块实例化语句在结构级进行结构描述。

的混合方式建模能力,即在一个设计中每个模块均可以在不同设计层次上建模。

还具有内置逻辑函数,例如&

(按位与)和|(按位或)。

对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。

可以显式地对并发和定时进行建模。

提供强有力的文件读写能力。

语言在特定情况下是非确定性的,即在不同的模拟器上模型可以产生不同的结果;

例如,事件队列上的事件顺序在标准中没有定义。

习题

1. 

是在哪一年首次被IEEE标准化的?

2. 

HDL支持哪三种基本描述方式?

3. 

可以使用Verilog 

HDL描述一个设计的时序吗?

4. 

语言中的什么特性能够用于描述参数化设计?

5. 

能够使用Verilog 

编写测试验证程序吗?

6. 

是由哪个公司最先开发的?

7. 

HDL中的两类主要数据类型什么?

8. 

UDP代表什么?

9. 

写出两个开关级基本门的名称。

10. 

写出两个基本逻辑门的名称。

======================================

第2章 

HDL指南 

  本章提供HDL语言的速成指南。

2.1 

模块

  模块是Verilog 

的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。

一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述;

设计的数据流行为使用连续赋值语句进行描述;

时序行为使用过程结构描述。

一个模块可以在另一个模块中使用。

  一个模块的基本语法如下:

module 

module_name 

(port_list);

Declarations:

reg, 

wire, 

parameter, 

input, 

output, 

inout, 

function, 

task, 

Statements:

Initial 

statement

Always 

Module 

instantiation

Gate 

UDP 

Continuous 

assignment

endmodule

  说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。

语句定义设计的功能和结构。

说明部分和语句可以散布在模块中的任何地方;

但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。

为了使模块描述清晰和具有良好的可读性, 

最好将所有的说明部分放在语句前。

本书中的所有实例都遵守这一规范。

  以下为建模一个半加器电路的模块的简单实例。

HalfAdder 

(A, 

B, 

Sum, 

Carry);

input 

A, 

B;

output 

Carry;

assign 

#2 

Sum 

#5 

Carry 

&

  模块的名字是HalfAdder。

模块有4个端口:

两个输入端口A和B,两个输出端口Sum和Carry。

由于没有定义端口的位数, 

所有端口大小都为1位;

同时, 

由于没有各端口的数据类型说明, 

这四个端口都是线网数据类型。

模块包含两条描述半加器数据流行为的连续赋值语句。

从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的。

每条语句的执行顺序依赖于发生在变量A和B上的事件。

  在模块中,可用下述方式描述一个设计:

  1) 

数据流方式;

  2) 

行为方式;

  3) 

结构方式;

  4) 

上述描述方式的混合。

  下面几节通过实例讲述这些设计描述方式。

不过有必要首先对Verilog 

HDL的时延作简要介绍。

2.2 

时延

HDL模型中的所有时延都根据时间单位定义。

下面是带时延的连续赋值语句实例。

  assign 

#2指2个时间单位。

  使用编译指令将时间单位与物理时间相关联。

这样的编译器指令需在模块描述前定义,如下所示:

  ` 

timescale 

1ns 

/100ps

此语句说明时延时间单位为1ns并且时间精度为100ps 

(时间精度是指所有的时延必须被限定在0.1ns内)。

如果此编译器指令所在的模块包含上面的连续赋值语句, 

代表2ns。

  如果没有这样的编译器指令, 

模拟器会指定一个缺省时间单位。

IEEE 

标准中没有规定缺省时间单位。

2.3 

数据流描述方式

  用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。

在连续赋值语句中,某个值被指派给线网变量。

连续赋值语句的语法为:

[delay] 

LHS_net 

RHS_ 

expression;

右边表达式使用的操作数无论何时发生变化, 

右边表达式都重新计算, 

并且在指定的时延后变化值被赋予左边表达式的线网变量。

时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。

如果没有定义时延值, 

缺省时延为0。

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

`timescale 

1ns/ 

1ns

Decoder2x4 

EN, 

Z);

EN;

:

3] 

Z;

wire 

Abar, 

Bbar;

#1 

Abar 

A;

语句 

1。

Bbar 

2。

Z[0] 

(Abar 

EN) 

;

3。

Z[1] 

4。

Z[2] 

(A 

5。

Z[3] 

6。

  以反引号“ 

”开始的第一条语句是编译器指令, 

编译器指令`timescale 

将模块中所有时延的单位设置为1 

ns,时间精度为1 

ns。

例如,在连续赋值语句中时延值#1和#2分别对应时延1 

ns和2 

  模块Decoder2x4有3个输入端口和1个4位输出端口。

线网类型说明了两个连线型变量Abar和Bbar 

(连线类型是线网类型的一种)。

此外,模块包含6个连续赋值语句。

  当EN在第5 

ns变化时,语句3、4、5和6执行。

这是因为EN是这些连续赋值语句中右边表达式的操作数。

Z[0]在第7 

ns时被赋予新值0。

当A在第15 

ns变化时, 

语句1、5和6执行。

执行语句5和6不影响Z[0]和Z[1]的取值。

执行语句5导致Z[2]值在第17 

ns变为0。

执行语句1导致Abar在第16 

ns被重新赋值。

由于Abar的改变,反过来又导致Z[0]值在第18 

ns变为1。

  请注意连续赋值语句是如何对电路的数据流行为建模的;

这种建模方式是隐式而非显式的建模方式。

此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。

2.4 

行为描述方式

  设计的行为功能使用下述过程语句结构描述:

initial语句:

此语句只执行一次。

always语句:

此语句总是循环执行, 

或者说此语句重复执行。

  只有寄存器类型数据能够在这两种语句中被赋值。

寄存器类型数据在被赋新值前保持原有值不变。

所有的初始化语句和always语句在0时刻并发执行。

  下例为always语句对1位全加器电路建模的示例。

FA_Seq 

Cin, 

Cout);

Cin;

Cout;

reg 

T1, 

T2, 

T3;

always

( 

or 

Cin 

) 

begin

B) 

T1 

T2 

T3 

Cout 

(T1| 

T2) 

end

  模块FA_Seq 

有三个输入和两个输出。

由于Sum、Cout、T1、T2和T3在always 

语句中被赋值,它们被说明为 

类型(reg 

是寄存器数据类型的一种)。

always 

语句中有一个与事件控制(紧跟在字符@ 

后面的表达式)。

相关联的顺序过程(begin-end对)。

这意味着只要A、B或Cin 

上发生事件,即A、B或Cin之一的值发生变化,顺序过程就执行。

在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。

顺序过程执行完成后,always 

语句再次等待A、B或Cin上发生的事件。

  在顺序过程中出现的语句是过程赋值模块化的实例。

模块化过程赋值在下一条语句执行前完成执行。

过程赋值可以有一个可选的时延。

  时延可以细分为两种类型:

语句间时延:

这是时延语句执行的时延。

语句内时延:

这是右边表达式数值计算与左边表达式赋值间的时延。

  下面是语句间时延的示例:

#4 

  在第二条语句中的时延规定赋值延迟4个时间单位执行。

就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。

下面是语句内时延的示例。

#3 

(A^ 

  这个赋值中的时延意味着首先计算右边表达式的值, 

等待3个时间单位,然后赋值给Sum。

  如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。

这种形式以及在always 

语句中指定语句的其他形式将在第8章中详细讨论。

  下面是initial语句的示例:

Test 

(Pop, 

Pid);

Pop, 

Pid;

initial 

Pop 

0;

// 

Pid 

1;

#6 

  initial语句包含一个顺序过程。

这一顺序过程在0 

ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, 

initial语句永远挂起。

这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。

语句1和2在0 

ns时执行。

第三条语句也在0时刻执行,导致Pop 

在第5 

ns时被赋值。

语句4在第5 

ns执行,并且Pid 

在第8 

ns被赋值。

同样,Pop在14 

ns被赋值0,Pid在第16 

ns被赋值0。

第6条语句执行后,initial语句永远被挂起。

2.5 

结构化描述形式

  在Verilog 

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

内置门原语(在门级);

开关级原语(在晶体管级);

用户定义的原语(在门级);

模块实例 

(创建层次结构)。

  通过使用线网来相互连接。

下面的结构描述形式使用内置门原语描述的全加器电路实例。

FA_Str 

S1, 

xor

X1 

(S1, 

B),

X2 

(Sum, 

Cin);

and

A1 

(T3, 

A2 

(T2, 

Cin),

A3 

(T1, 

or

O1 

(Cout, 

T3);

  在这一实例中,模块包含门的实例语句,也就是说包含内置门xor、and和or 

的实例语句。

门实例由线网类型变量S1、T1、T2和T3互连。

由于没有指定的顺序, 

门实例语句可以以任何顺序出现;

图中显示了纯结构;

xor、and和or是内置门原语;

X1、X2、A1等是实例名称。

紧跟在每个门后的信号列表是它的互连;

列表中的第一个是门输出,余下的是输入。

例如,S1与xor 

门实例X1的输出连接,而A和B与实例X1的输入连接。

4位全加器可以使用4个1位全加器模块描述。

下面是4位全加器的结构描述形式。

FourBitFA 

(FA, 

FB, 

FCin, 

FSum, 

FCout 

);

parameter 

SIZE 

4;

[SIZE:

1] 

FA, 

FB;

FSum

FCin;

FCout;

1:

SIZE-1] 

FTemp;

FA_Str

FA1( 

.A 

(FA[1]), 

.B(FB[1]), 

.Cin(FCin),

.Sum(FSum[1]), 

.Cout(FTemp[2])),

FA2( 

(FA[2]), 

.B(FB[2]), 

.Cin(FTemp[1]),

.Sum(FSum[2]), 

FA3(FA[3], 

FB[3], 

FTemp[2], 

FSum[3], 

FTemp[3],

FA4(FA[4], 

FB[4], 

FTemp[3], 

FSum[4], 

FCout);

  在这一实例中,模块实例用于建模4位全加器。

在模块实例语句中,端口可以与名称或位置关联。

前两个实例FA1和FA2使用命名关联方式,也就是说,端口的名称和它连接的线网被显式描述(每一个的形式都为“.port_name 

(net_name))。

最后两个实例语句,实例FA3和FA4使用位置关联方式将端口与线网关联。

这里关联的顺序很重要,例如,在实例FA4中,第一个FA[4]与FA_Str 

的端口A连接,第二个FB[4]与FA_Str 

的端口B连接,余下的由此类推。

2.6 

混合设计描述方式

  在模块中,结构的和行为的结构可以自由混合。

也就是说,模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及always语句和initial语句的混合。

它们之间可以相互包含。

来自always语句和initial语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。

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

FA_Mix 

A,B, 

S1;

xor 

X1(S1, 

B);

门实例语句。

begin 

语句。

S1 

连续赋值语句。

  只要A或B上有事件发生,门实例语句即被执行。

只要A、B或Cin上有事件发生,就执行always 

语句,并且只要S1或Cin上有事件发生,就执行连续赋值语句。

2.7 

设计模拟

HDL不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。

激励和控制可用初始化语句产生。

验证运行过程中的响应可以作为“变化时保存”或作为选通的数据存储。

最后,设计验证可以通过在初始化语句中写入相应的语句自动与期望的响应值比较完成。

下面是测试模块Top的例子。

该例子测试2.3节中讲到的FA_Seq模块。

‘timescale 

1ns/1ns

Top;

一个模块可以有一个空的端口列表。

PA, 

PB, 

PCi;

PCo, 

PSum;

正在测试的实例化模块:

F1(PA, 

PCi, 

PSum, 

PCo);

定位。

initial

begin:

ONLY_ONCE

[3:

0] 

Pal;

//需要4位, 

Pal才能取值8。

for 

(Pal 

Pal 

<

8;

1)

{PA, 

PCi} 

$display 

(“PA, 

PCi 

%b%b%b”, 

PCi,

“ 

PSum=%b%b”, 

PSum);

  在测试模块描述中使用位置关联方式将模块实例语句中的信号与模块中的端口相连接。

也就是说,PA连接到模块FA_Seq的端口A,PB连接到模块FA_Seq的端口B,依此类推。

注意初始化语句中使用了一个for循环语句,在PA、PB和PCi上产生波形。

循环中的第一条赋值语句用于表示合并的目标。

自右向左,右端各相应的位赋给左端的参数。

初始化语句还包含有一个预先定义好的系统任务。

系统任务$display将输入以特定的格式打印输出。

  系统任务$display调用中的时延控制规定$display任务在5个时间单位后执行。

这5个时间单位基本上代表了逻辑处理时间。

即是输入向量的加载至观察到模块在测试条件下输出之间的延迟时间。

  这一模型中还有另外一个细微差别。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1