您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > 第2讲VerilogHDL层次建模.
主讲陈付龙f=ab…安徽师范大学2015第2讲VerilogHDL层次建模层次建模基本语法模块和接口2.1层次建模理解数字电路设计中的自底向上和自顶向下设计方法。解释Verilog中模块和模块实例之间的区别。学习从4种不同的抽象角度来描述同一个模块。解释数字电路仿真中的各个组成部分,定义激励块和功能块,说明两种使用激励进行仿真的方法。2.1.1设计方法学自底向上设计方法:首先定义顶层功能块,进而分析需要哪些必要的子模块;然后进一步对各个子模块进行,直到达到无法进一步分解的底层功能块自顶向下设计方法:首先对现有的功能块进行分析,然后使用这些模块来搭建规模大一些的功能块,如此继续直至顶层模块两种基本的设计方法:自底向上和自顶向下设计方法2.1.2设计示例:四位脉动进位计数器脉动进位计数器是由下降沿触发的T触发器组成的。每个T触发器可以由下降沿触发的D触发器和反相器构成计数器的功能。使用自顶向下的方法进行设计,首先需要说明脉动进位在使用T触发器搭建起顶层模块之后,进一步使用D触发器和反相门来实现T触发器。将较大的功能块分解为较小的功能块,直到无法继续分解。在自底向上的设计方法恰好与此相反:我们不断地使用较小的功能块来搭建大一些的模块。首先使用与门和或门搭建D触发器,或者使用晶体管搭建一个自定义的D触发器,使自底向上和自顶向下的方法在D触发器这个层次上会合。2.1.3模块Verilog使用模块(module)的概念来代表一个基本的功能块。一个模块可以是一个元件,也可以是低层次模块的组合。常用的设计方法是使用元件构建在设计中多个地方使用的功能块,以便进行代码重用。模块通过接口(输入和输出)被高层的模块调用,但隐藏了内部的实现细节。这样就使得设计者可以方便地对某个模块进行修改,而不影响设计的其他部分。在Verilog中,模块声明由关键字module开始,关键字endmodule则必须出现在模块定义的结尾。每个模块必须具有一个模块名,由它惟一地标识这个模块。模块的端口列表则描述这个模块的输入和输出端口。一个模块的示例VerilogHDL的四种描述方式行为或算法级:Verilog所支持的最高抽象层次。设计者只注重其实现的算法,而不关心其具体的硬件实现细节。在这个层次上进行的设计与C语言编程非常类似。数据流级:通过说明数据的流程对模块进行描述。设计者关心的是数据如何在各个寄存器之间流动,以及如何处理这些数据。门级:从组成电路的逻辑门及其相互之间的互连关系的角度来设计模块。这个层次的设计类似于使用门级逻辑简图来完成设计。开关级:Verilog所支持的最低抽象层次。通过使用开关、存储节点及其互连关系来设计模块。在这个层次进行设计需要了解开关级的实现细节。Verilog允许设计者在一个模块中混合使用多个抽象层次。在数字电路设计中,术语寄存器传输级(RTL)描述在很多情况下是指能够被逻辑综合工具接受的行为级和数据流级的混合描述。假设一个设计中包含4个模块,Verilog允许设计者使用4种不同的抽象层次对各个模块进行描述。在经过综合工具综合之后,综合结果一般都是门级结构的描述。一般来说,抽象的层次越高,那么设计的灵活性和工艺无关性就越强;随着抽象层次的降低,灵活性和工艺无关性逐渐变差,微小的调整可能会导致对设计的多处修改。2.1.4模块实例例2.1模块调用例2.2非法模块嵌套定义2.1.5逻辑仿真的构成设计完成之后,还必须对设计的正确性进行测试。我们可以对设计模块施加激励,通过检查其输出来检验功能的正确性。我们称完成测试功能的块为激励块。将激励块和设计块分开设计是一种良好的设计风格。激励块一般均称为测试台(testbench)。可以使用不同的测试台对设计块进测试,以全面验证设计的正确性。激励块的设计有两种模式:有反馈的和无反馈的无反馈的模式这种模式是在激励块中调用(实例引用)并直接驱动设计块。如下图所示,顶层块为激励块,由它控制clk和reset信号,检查并显示输出信号q。有反馈的模式这种模式是在一个虚拟的顶层模块中调用(实例引用)激励块和设计块。激励块和设计块之间通过接口进行交互,如下图所示。激励块驱动信号d_clk和d_reset,这两个信号则连接到设计块的clk和reset输入端口。激励块同时检查和显示信号c_q,这个信号连接到设计块的输出端口q。顶层模块的作用只是调用(实例引用)设计块和激励块。2.1.6自顶向下的设计实例例2.3脉动进位计数器顶层模块例2.4触发器T_FF例2.5带异步复位的D触发器D_FF例2.6激励模块激励信号和波形输出2.1.7小结用于数字电路设计的两种方法:自顶向下方法和自底向上方法。在当今的数字电路设计中,这两种方法经常组合使用。随着设计复杂性的增加,使用这些结构化的方法来进行设计管理变得越来越重要。模块是Verilog中的基本功能单元。模块通过调用(实例引用)来使用,模块的每个实例都被惟一标识,以区别于同一模块的其他实例。每个实例都拥有其模板模块的不同副本。读者需要将模块和模块实例区别开来。仿真有两个不同的组成部分:设计块和激励块,激励块用于测试设计块。激励块通常是顶层模块。对设计块施加激励有两种不同的模式。以脉动进位计数器为例,一步步地解释了为各个部分创建仿真的过程。2.2基本语法理解操作符、注释、空白符、数字、字符串和标识符的词法约定。定义逻辑值集合和数据类型,包括线网、寄存器、向量、数字、仿真时间、数组、参数、存储器和字符串。学习使用用于显示和监视信息、暂停和结束仿真的系统任务。学习用于宏定义、文件包含的基本编译指令。2.2.1词法约定Verilog中的基本词法约定与C语言类似。Verilog描述包含一个“单词”流,这里的单词可以是注释、分隔符、数字、字符串、标识符和关键字。Verilog是大小写相关的,其中的关键字全部为小写。列出如下:空白符空白符由空格(\b)、制表符(\t)和换行符组成。除了字符串中的空白符,Verilog中的空白符仅仅用于分隔标识符,在编译阶段被忽略。注释有两种书写注释的方法:单行注释和多行注释。单行注释以“//”开始,Verilog将忽略从此处到行尾的内容。多行注释以“/*”开始,结束于“*/”。多行注释不允许嵌套,但是单行注释可以嵌套在多行注释中。操作符操作符有三种类型:单目操作符、双目操作符和三目操作符,单目操作符的优先级高于操作数。三目操作符包括两个单独的操作符,用来分隔三个操作数。数字声明Verilog中包括两种数字声明:指明位数的数字和不指明位数的数字指明位数的数字的表示形式为:size'baseformatnumbersize用于指明数字的位宽度,只能用十进制数表示。合法的基数格式包括十进制(‘d或’D)、十六进制(‘h或’H)、二进制(‘b或’B)和八进制(‘o或’O)。数字用连续的阿拉伯数字0,1,2,3,4,5,6,7,8,9,10,a,b,c,d,e,f来表示。但是,对于不同的基数,只能相应地使用其中的一部分,并且允许使用大写字母。例如:4'b1111,16'h3a6f等如果在数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽度,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)X和Z值Verilog用两个符号分别表示不确定值和高阻值,这两个符号在实际电路的建模中是非常重要的,不确定值用x表示,高阻值用z表示。在以十六进制为基数的表示中x或z代表4位,在八进制的情况下x或z代表3位,在二进制的情况下x或z代表1位。如果某数的最高位为0,x或z,Verilog语言约定将分别使用0,x或z自动对这个数进行扩展,以填满余下的更高位。负数对于常数,我们可以通过在表示位宽的数字前面增加一个减号来表示它是一个负数,因为表示大小的常数总是正的。将减号放在基数和数字之间是非法的。对于带符号的算术运算,可以增加一个可选的带符号说明符来表示负数下划线符号和问号除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段将被忽略掉。如8'b1101_1010在Verilog语言约定的常数表示中,问号“?”是z的另一种表示。使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”(即高阻抗)表示“不必关心”的情况。例如:4`b10??字符串字符串是由双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不能书写在多行中,即不能包含回车符。标识符和关键字关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中的关键字全部小写,附录C中列出了Verilog中的全部关键字的清单,包括关键字、系统任务和编译指令。标识符是程序代码中对象的名字。Verilog中的标识符由字母数字字符、下划线_和美元符$组成。标识符是区分大小写的。Verilog标识符的第一个字符必须是字母数字字符或下划线,不能以数字或美元符开始。以美元符开始的标识符是为系统函数保留的。转义标识符转义标识符以反斜线“\”开始,以空白符(空格、制表符和换行符)结束。Verilog将反斜线和空白符之间的字符逐个进行处理。所有的可打印字符均可包含在转义字符中,而反斜线和表示结束的空白符不作为标识符的一部分。如:\a+b-c//与a+b-c等同2.2.2数据类型值的种类线网寄存器向量整数、实数和时间寄存器数据类型数组存储器参数字符串2.2.2.1值的种类Verilog使用四值逻辑和八种信号强度来对实际的硬件电路建模。逻辑值0和1可以拥有下表中列出的8种强度值如果两个具有不同强度的信号驱动同一个线网,则竞争结果值为高强度信号的值。例如,如果在两个强度分别为strong1和weak0的信号之间发生竞争,则结果值服从strong1如果两个强度相同的信号之间发生竞争,则结果为不确定值。例如两个强度为strong1和strong0的信号之间发生竞争,则结果为x。对于信号竞争、MOS器件、动态MOS和其他底层器件的精确建模,强度等级具有很大的作用。在各种类型的线网中,只有trireg类型的线网可以具有存储强度,强度分为large,medium和small三个等级。2.2.2.2线网(net:wire,wand,wor,tri,triand,trior,trireg)线网(net)表示硬件单元之间的连接。就像在真实的电路中一样,线网由其连接器件的输出端连续驱动。如下图所示,线网a连接到与门g1的输出端,它将连续地拥有与门g1的输出值:b&c线网一般使用关键字wire进行声明。如果没有显式地说明为向量,则默认线网的位宽为1。线网的默认值为z(trireg类型的线网例外,其默认值为x)。线网的值由其驱动源确定,如果没有驱动源,则线网的值为z。2.2.2.3寄存器(reg,integer,real,time)寄存器用来表示存储元件,它保持原有的数值,直到被改写。寄存器数据类型一般通过使用关键字reg来声明,默认值为x。例3.1给出了如何使用寄存器的例子。例3.1寄存器的声明和使用例3.2带符号寄存器的声明2.2.2.4向量线网和寄存器类型的数据均可以声明为向量(位宽大于1)。如果在声明中没有指定位宽,则默认为标量(1位)。向量通过[high#:low#]或[low#:high#]进行说明,方括号中左边的数总是代表向量的最高有效位。对向量,我们可以指定其中的一位或几位,如:除了用常量指定向量域以外,VerilogHDL还允许指定可变的向量域选择。这样就使得设计者可以通过for循环来动态地选取向量的各个域。下面是动态域选择的两个专用操作符:[starting_bit+:width]:从起始位开始递增,位宽为width。[starting_bit-:width]:从起始位开始递减,位宽为width。2.2.2.5整数、实数和时间寄存器数据类型除reg类型之外,Veril
本文标题:第2讲VerilogHDL层次建模.
链接地址:https://www.777doc.com/doc-2155323 .html