




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Verilog的用途的用途 Verilog的主要应用包括:的主要应用包括: ASICASIC和和FPGAFPGA工程师编写可综合的工程师编写可综合的RTLRTL代码代码 高抽象级系统仿真进行系统结构开发高抽象级系统仿真进行系统结构开发 测试工程师用于编写各种层次的测试程序测试工程师用于编写各种层次的测试程序 用于用于ASICASIC和和FPGAFPGA单元或更高层次的模块的模型开发单元或更高层次的模块的模型开发抽象级抽象级(Levels of Abstraction) VerilogVerilog既是一种行为描述的语言也是一种结构描述语既是一种行为描述的语言也是一种结构描述语言。言。Veril
2、ogVerilog模型可以是实际电路的不同级别的抽象。模型可以是实际电路的不同级别的抽象。这些抽象的级别包括:这些抽象的级别包括:系统说明系统说明-设计文档设计文档/算法描述算法描述RTL/功能级功能级-Verilog门级门级/结构级结构级-Verilog版图版图/物理级物理级-几何图形几何图形行为综合行为综合综合前仿真综合前仿真逻辑综合逻辑综合综合后仿真综合后仿真版图版图抽象级抽象级(Levels of Abstraction) 在抽象级上需要进行折衷在抽象级上需要进行折衷系统说明系统说明-设计文档设计文档/算术描述算术描述RTL/功能级功能级-Verilog门级门级/结构级结构级-Veri
3、log版图版图/物理级物理级-几何图形几何图形详细程度详细程度 低低 高高输入输入/仿真速度仿真速度 高高 低低抽象级抽象级(Levels of Abstraction)VerilogVerilog可以在三种抽象级上进行描述可以在三种抽象级上进行描述行为级行为级 用功能块之间的数据流对系统进行描述用功能块之间的数据流对系统进行描述 在需要时在函数块之间进行调度赋值。在需要时在函数块之间进行调度赋值。RTL级级/功能级功能级用功能块内部或功能块之间的数据流和控制信号描述系统用功能块内部或功能块之间的数据流和控制信号描述系统基于一个已定义的时钟的周期来定义系统模型基于一个已定义的时钟的周期来定义系
4、统模型结构级结构级/门级门级用基本单元用基本单元(primitive)或低层元件或低层元件(component)的连接来描述系的连接来描述系统以得到更高的精确性,特别是时序方面。统以得到更高的精确性,特别是时序方面。在综合时用特定工艺和低层元件将在综合时用特定工艺和低层元件将RTL描述映射到门级网表描述映射到门级网表抽象级抽象级(Levels of Abstraction) 设计工程师在不同的设计阶段采用不同的抽象级设计工程师在不同的设计阶段采用不同的抽象级 首先在行为级描述各功能块,以降低描述难度,提高仿真速度。首先在行为级描述各功能块,以降低描述难度,提高仿真速度。 在综合前将各功能模块进
5、行在综合前将各功能模块进行RTL级描述。级描述。 用于综合的库中的大多数单元采用结构级描述。在本教程中的结用于综合的库中的大多数单元采用结构级描述。在本教程中的结构级描述部分将对结构级构级描述部分将对结构级(门级门级)描述进行更详细的说明。描述进行更详细的说明。 Verilog还有一定的晶体管级描述能力及算法级描述能力还有一定的晶体管级描述能力及算法级描述能力行为级和行为级和RTL级级MUX的行为可以描述为:只要信号的行为可以描述为:只要信号a或或b或或sel发生变化,如果发生变化,如果sel为为0则选择则选择a输出;否则选择输出;否则选择b输出。输出。module muxtwo (out,
6、a, b, sel); input a, b, sel; output out; reg out;always ( sel or a or b) if (! sel) out = a; else out = b;endmodule这个行为级这个行为级RTL描述不处理描述不处理X和和Z状态输入,并且没有延时。状态输入,并且没有延时。在行为级模型中,逻辑功能描述采用高级语言结构,如在行为级模型中,逻辑功能描述采用高级语言结构,如, while,wait,if, case。Testbench(test fixture)通常采用行为级描述。所有行为级结构在通常采用行为级描述。所有行为级结构在testb
7、ench描描述中都可以采用。述中都可以采用。RTL模型中数据流都是基于时钟的。任何时钟元件在时钟沿处的行为都要精模型中数据流都是基于时钟的。任何时钟元件在时钟沿处的行为都要精确描述。确描述。RTL级描述是行为级级描述是行为级Verilog的子集。的子集。结构级描述结构级描述结构级结构级Verilog适合开发小规模元件,如适合开发小规模元件,如ASIC和和FPGA的单元的单元 Verilog内部带有描述基本逻辑功能的基本单元内部带有描述基本逻辑功能的基本单元(primitive),如,如and门。门。 用户可以定义自己的基本单元用户可以定义自己的基本单元UDP(User Defined Priv
8、itives) 综合产生的结果网表通常是结构级的。用户可以用结构级描述粘接综合产生的结果网表通常是结构级的。用户可以用结构级描述粘接(glue)逻辑。逻辑。下面是下面是MUX的结构级描述,采用的结构级描述,采用Verilog基本单元基本单元(门门)描述。描述描述。描述中含有传输延时。中含有传输延时。module twomux (out, a, b, sl); input a, b, sl; output out; not u1 (nsl, sl ); and #1 u2 (sela, a, nsl); and #1 u3 (selb, b, sl); or #2 u4 (out, sela,
9、selb);endmodule综合不综合不支持支持!仅需一种语言仅需一种语言Verilog的一个主要特点是可应用于各种抽象级。建模时可采用门的一个主要特点是可应用于各种抽象级。建模时可采用门级和级和RTL级混合描述,在开发级混合描述,在开发testfixture时可以采用行为级描述。时可以采用行为级描述。复习复习什么是什么是Verilog ?Verilog是公开的吗是公开的吗?设计时什么时候采用设计时什么时候采用Verilog RTL级描述级描述?Verilog适合做什么样的设计适合做什么样的设计?解答:解答:Verilog是用于硬件描述的具有时间概念的并行编程语言是用于硬件描述的具有时间概念
10、的并行编程语言Verilog是一种公开语言,是一种公开语言, 由由OVI负责组织,有负责组织,有IEEE1394标准标准RTL描述用于综合,或用于必须精确到每个时钟周期的模型的建模。描述用于综合,或用于必须精确到每个时钟周期的模型的建模。Verilog适用于各种抽象级模型的开发及验证适用于各种抽象级模型的开发及验证第四章第四章 设计举例设计举例进一步学习Verilog的结构描述和行为描述Verilog混合(抽象)级仿真学习目标:学习目标:语言的主要特点语言的主要特点module(模块模块)module能够表示:能够表示:物理块,如物理块,如IC或或ASIC单元单元逻辑块,如一个逻辑块,如一个C
11、PU设计的设计的ALU部分部分整个系统整个系统每一个模块的描述从关键词每一个模块的描述从关键词module开始,有一个开始,有一个名称名称(如(如SN74LS74,DFF,ALU等等),由关键词等等),由关键词endmodule结束。结束。module是层是层次化设计的基次化设计的基本构件本构件逻辑描述放在逻辑描述放在module内部内部语言的主要特点语言的主要特点模块端口(module ports)端口在模块名字端口在模块名字后的括号中列出后的括号中列出端口可以说明为端口可以说明为input, output及及inout端口等价于硬件端口等价于硬件的引脚的引脚(pin)注意模块的名称DFF,
12、端口列表及说明模块通过端口与外部通信语言的主要特点语言的主要特点模块实例化模块实例化(module instances)module DFF (d, clk, clr, q, qb); .endmodulemodule REG4( d, clk, clr, q, qb); output 3: 0 q, qb; input 3: 0 d; input clk, clr; DFF d0 (d 0, clk, clr, q 0, qb 0); DFF d1 (d 1, clk, clr, q 1, qb 1); DFF d2 (d 2, clk, clr, q 2, qb 2); DFF d3 (d
13、 3, clk, clr, q 3, qb 3);endmodule语言的主要特点语言的主要特点可以将模块的实例通过端口连接起来构成一个大的系可以将模块的实例通过端口连接起来构成一个大的系统或元件。统或元件。在上面的例子中,在上面的例子中,REG4有模块有模块DFF的四个实例。注的四个实例。注意,每个实例都有自己的名字意,每个实例都有自己的名字(d0, d1, d2, d3)。实例。实例名是每个对象唯一的标记,通过这个标记可以查看每名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。个实例的内部。实例中端口的次序与模块定义的次序相同。实例中端口的次序与模块定义的次序相同。模块实例化与调
14、用程序不同。每个实例都是模块的一模块实例化与调用程序不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。个完全的拷贝,相互独立、并行。模块实例化模块实例化(module instances)DUT 被测器件 (device under test) module MUX2_1 (out, a, b, sel); / Port declarations output out; input a, b, sel; wire out, a, b, sel; wire sel_, a1, b1; / The netlist not (sel_, sel); and (a1, a, sel_); and
15、 (b1, b, sel); or (out, a1, b1);endmodule注释行注释行已定义的已定义的 Verilog基基本单元的本单元的实例实例a, b, sel是输入端口,是输入端口,out是输出是输出端口。所有信号通过这些端口从模端口。所有信号通过这些端口从模块输入块输入/输出。输出。另一个模块可以通过模块名及端口另一个模块可以通过模块名及端口说明使用多路器。实例化多路器时说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是模块的实现可以是行为级也可以是
16、门级,但并不影响高层次模块对它门级,但并不影响高层次模块对它的使用。的使用。多路器由关键多路器由关键词词module和和endmodule开始及结束。开始及结束。Test Fixture templatemodule testfixture; / Data type declaration / Instantiate modules / Apply stimulus / Display resultsendmodule为什么没为什么没有端口?有端口?由于由于testfixture是最顶层模块,不会是最顶层模块,不会被其它模块实例化。因此不需要有端被其它模块实例化。因此不需要有端口。口。Test
17、 Fixture 如何说明实例module testfixture; / Data type declaration / Instantiate modules MUX2_1 mux (out, a, b, sel); / Apply stimulus / Display resultsendmodule多路器实例化语句多路器实例化语句MUXMUX的实例化语句包括:的实例化语句包括: 模块名字:与引用模块相同模块名字:与引用模块相同 实例名字:任意,但要符合标记命名规则实例名字:任意,但要符合标记命名规则 端口列表:与引用模块的次序相同端口列表:与引用模块的次序相同Test Fixture 过
18、程(procedural block)所有过程在时间所有过程在时间0执行一次执行一次过程之间是并行执行的过程之间是并行执行的 过程语句有两种:过程语句有两种: initial :只执行一次:只执行一次 always :循环执行:循环执行Test Fixture 过程(procedural block)通常采用过程语句进行行为级描述。通常采用过程语句进行行为级描述。test fixture的激的激励信号在一个过程语句中描述。励信号在一个过程语句中描述。过程语句的活动与执行是有差别的过程语句的活动与执行是有差别的所有过程在时间所有过程在时间0处于活动状态,并根据用户定义的条件等待处于活动状态,并根
19、据用户定义的条件等待执行;执行;所有过程并行执行,以描述硬件内在的并行性;所有过程并行执行,以描述硬件内在的并行性;Test Fixture 过程(procedural block)通常采用过程语句进行行为级描述。通常采用过程语句进行行为级描述。test fixture的激的激励信号在一个过程语句中描述。励信号在一个过程语句中描述。过程语句的活动与执行是有差别的过程语句的活动与执行是有差别的所有过程在时间所有过程在时间0处于活动状态,并根据用户定义的条件等待处于活动状态,并根据用户定义的条件等待执行;执行;所有过程并行执行,以描述硬件内在的并行性;所有过程并行执行,以描述硬件内在的并行性;完整
20、的完整的Test Fixturemodule testfixture; / Data type declaration reg a, b, sel; wire out; / MUX instance MUX2_1 mux (out, a, b, sel); / Apply stimulus initial begin a = 0; b = 1; sel = 0; #5 b = 0; #5 b = 1; sel = 1; #5 a = 1; #5 $finish; end/ Display results initial $monitor($time, out=%b a=%b b=%b sel=
21、%b, out, a, b, sel);endmodule0 out= 0 a= 0 b= 1 sel= 05 out= 0 a= 0 b= 0 sel= 010 out= 1 a= 0 b= 1 sel= 115 out= 1 a= 1 b= 1 sel= 1结果输出结果输出时间单位末的概念时间单位末的概念timescale 1ns/1ns module testfixture; / Data type declaration reg a, b, sel; wire out; / MUX instance MUX2_1 mux (out, a, b, sel); / Apply stimul
22、us initial begin a = 0; b = 1; sel = 0; #5.7 b = 0; #5 b = 1; sel = 1; #5 a = 1; #5 $finish; end/ Display results initial $monitor($time, out=%b a=%b b=%b sel=%b, out, a, b, sel);endmodule0 out= 0 a= 0 b= 1 sel= 06 out= 0 a= 0 b= 0 sel= 011 out= 1 a= 0 b= 1 sel= 116 out= 1 a= 1 b= 1 sel= 1结果输出复习复习Ve
23、rilog的基本构建模块是什么?是如何构成一个系统的?的基本构建模块是什么?是如何构成一个系统的?module怎样与其它模块通信?怎样与其它模块通信?仿真时两个性质不同的模块是什么?仿真时两个性质不同的模块是什么?在在test fixture中两类不同的过程语句是什么?它们有什么不同?中两类不同的过程语句是什么?它们有什么不同?用什么方法能以文本格式显示仿真结果?用什么方法能以文本格式显示仿真结果?module是基本构建单元。在是基本构建单元。在module中实例化另一个中实例化另一个module可可以构成一个复杂的层次化系统。以构成一个复杂的层次化系统。module之间通过端口的连接进行互相
24、通信之间通过端口的连接进行互相通信两个模块是设计模块和激励模块。设计模块又称为两个模块是设计模块和激励模块。设计模块又称为DUT,激励,激励模块又称为模块又称为testbench或或test fixture。测试模块用于设计模块。测试模块用于设计模块验证验证在在testbench中用到的两类过程语句是中用到的两类过程语句是initial和和always。其不同。其不同处是处是initial只执行一次,而只执行一次,而always循环执行。循环执行。$monitor语句以文本格式显示仿真结果语句以文本格式显示仿真结果空白符和注释空白符和注释module MUX2_1 (out, a, b, se
25、l); / Port declarations output out; input sel, / control input b, /* data inputs */ a;/* The netlist logic selects input ”a” when sel = 0 and it selects ”b” when sel = 1.*/ not (sel_, sel); and (a1, a, sel_), (b1, b, sel); / What does this line do? or (out, a1, b1);endmodule格式自由格式自由使用空白符提高可读性及代码组使用空
26、白符提高可读性及代码组织。织。Verilog忽略空白符除非用于忽略空白符除非用于分开其它的语言标记。分开其它的语言标记。多行注释,在多行注释,在/* */内内单行注释单行注释到行末结束到行末结束整数常量和实数常量整数常量和实数常量整数的大小可以定义也可以不定义。整数表示为:整数的大小可以定义也可以不定义。整数表示为: 其中其中 size :大小,由十进制数表示的位数大小,由十进制数表示的位数(bit)表示。缺省为表示。缺省为32位位 base:数基,可为数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为进制。缺省为10进制进制 value:是所选数基内任意有效数字,包括是所选数基
27、内任意有效数字,包括X、Z。实数常量可以用十进制或科学表示法表示。实数常量可以用十进制或科学表示法表示。 Verilog中,常量中,常量(literals)可是整数也可以是实数可是整数也可以是实数12 unsized decimal (zero-extended to 32 bits)H83a unsized hexadecimal (zero- extended to 32 bits)8b1100_ 0001 8-bit binary64hff01 64-bit hexadecimal (zero- extended to 64 bits)9O17 9-bit octal32bz01x Z-
28、extended to 32 bits3b1010_ 1101 3-bit number, truncated to 3b1016.3 decimal notation32e- 4 scientific notation for 0.00324.1E3 scientific notation for 4100整数常量和实数常量整数常量和实数常量整数的大小可以定义也可以不定义。整数表示为:整数的大小可以定义也可以不定义。整数表示为:数字中(数字中(_)忽略,便于查看)忽略,便于查看没有定义大小没有定义大小(size)整数缺省为整数缺省为32位位缺省数基为十进制缺省数基为十进制数基数基(base)
29、和数字和数字(16进制进制)中的字母无大小写之分中的字母无大小写之分当数值当数值value大于指定的大小时,截去高位。如大于指定的大小时,截去高位。如 2b1101表表示的是示的是2b01实数常量实数常量实数可用科学表示法或十进制表示实数可用科学表示法或十进制表示科学表示法表示方式:科学表示法表示方式: , 表示:表示: 尾数尾数10指数指数字符串(字符串(string)字符串要在一行中用双引号括起来,也就是不能跨行。字符串要在一行中用双引号括起来,也就是不能跨行。字符串中可以使用一些字符串中可以使用一些C语言转义语言转义(escape)符,如符,如t n可以使用一些可以使用一些C语言格式符语
30、言格式符(如如%b)在仿真时产生格式在仿真时产生格式化输出:化输出: ”This is a normal string” ”This string has a t tab and ends with a new linen” ”This string formats a value: val = %b”Verilog中,字符串大多用于显示信息的命令中。中,字符串大多用于显示信息的命令中。Verilog没有字符串数据类型没有字符串数据类型字符串(字符串(string)转义符及格式符将在验证支持部分讨论转义符及格式符将在验证支持部分讨论 格式符格式符%h%o%d%b%c%s%v%m%thexoct
31、decbinACSIIstringstrengthmoduletime转义符tn”tab换行反斜杠双引号ASCII representation of above格式符%0d表示没有前导0的十进制数标识符标识符(identifiers)标识符是用户在描述时给标识符是用户在描述时给Verilog对象起的名字对象起的名字标识符必须以字母标识符必须以字母(a-z, A-Z)或或( _ )开头,后面可以是字母、数字、开头,后面可以是字母、数字、( $ )或或( _ )。最长可以是最长可以是1023个字符个字符标识符区分大小写,标识符区分大小写,sel和和SEL是不同的标识符是不同的标识符模块、端口和实
32、例的名字都是标识符模块、端口和实例的名字都是标识符module MUX2_1 (out, a, b, sel);output out;input a, b, sel; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1);endmoduleVerilog标识符标识符标识符标识符(identifiers)有效标识符举例:有效标识符举例: shift_reg_a busa_index _bus3无效标识符举例:无效标识符举例: 34net / 开头不是字母或开头不是字母或“
33、_” a*b_net / 包含了非字母或数字,包含了非字母或数字, “$” “_” n238 /包含了非字母或数字,包含了非字母或数字, “$” “_”Verilog区分大小写,所有区分大小写,所有Verilog关键词使用小写字母。关键词使用小写字母。转义标识符转义标识符( Escaped identifiers)可以包含任何可打印字符可以包含任何可打印字符反斜杠及空白符不是标识符的一部分反斜杠及空白符不是标识符的一部分module 2:1MUX (out, a, b, sel);output out;input a, b, sel; not not1(sel ,sel); and and1(
34、 a1, a, sel ); and and2( b1, b, sel); or or1( out, a1, b1);endmodule使用转义符可能会产生一些问题,并且不是所有工具都支持。使用转义符可能会产生一些问题,并且不是所有工具都支持。有时用转义符完成一些转换,如产生逻辑图的有时用转义符完成一些转换,如产生逻辑图的Verilog网表。综网表。综合工具输出综合网表时也使用转义符。合工具输出综合网表时也使用转义符。不建议使用转义符。不建议使用转义符。转义标识符由反斜杠“”开始,空白符结束Escaped Identifiers转义标识符转义标识符( Escaped identifiers)转
35、义标识符允许用户在标识符中使用非法字符。如: #sel busa+ index A,B top. 3inst .net1 / 在层次化名字中转义符 转义标识符必须以空格结束语言专用标记语言专用标记( tokens)系统任务及函数 $ $符号指示这是系统任务和函数符号指示这是系统任务和函数 系统函数有很多,如:系统函数有很多,如: 返回当前仿真时间返回当前仿真时间$time 显示显示/监视信号值监视信号值($display, $monitor) 停止仿真停止仿真$stop 结束仿真结束仿真$finish $monitor($time, “a = %b, b = %h”, a, b); 当信号当信
36、号a或或b的值发生变化时,系统任务的值发生变化时,系统任务$monitor显示当前仿真时显示当前仿真时间,信号间,信号a值值(二进制格式二进制格式), 信号信号b值(值(16进制格式)。进制格式)。语言专用标记语言专用标记( tokens)延时说明延时说明“#”用于说明过程用于说明过程(procedural)语句和门的实例的延时,但不能用语句和门的实例的延时,但不能用于模块的实例化。于模块的实例化。module MUX2_ 1 (out, a, b, sel) ;output out ;input a, b, sel ;not #1 not1( sel_, sel);and #2 and1(
37、a1, a, sel_);and #2 and2( b1, b, sel);or #1 or1( out, a1, b1);endmodule门延时有很多类名字:门延时门延时有很多类名字:门延时(gate delay),传输延时,传输延时(propagation delay),固有延时,固有延时(intrinsic delay),对象内在延时,对象内在延时(intra-object delay)复习复习Verilog中的空白符总是忽略的吗?中的空白符总是忽略的吗?在源代码中插入注释有哪两种方法?在源代码中插入注释有哪两种方法?整数常数的尺寸如何指定?缺省的尺寸及数基是多少?整数常数的尺寸如何指
38、定?缺省的尺寸及数基是多少?设置的编译指导如何解除?设置的编译指导如何解除?编译指导影响全局吗?编译指导影响全局吗?在仿真时为什么要用接近实际的最大在仿真时为什么要用接近实际的最大timescale精度?精度?是的。空白符用于隔开标识符及关键词,多余的忽略是的。空白符用于隔开标识符及关键词,多余的忽略/用于单行注释,用于单行注释,/* */用于多行注释用于多行注释整数常量的尺寸由整数常量的尺寸由10进制数表示的位数确定。缺省为进制数表示的位数确定。缺省为32位,缺位,缺省的数基为十进制。省的数基为十进制。使用使用resetall解除解除编译指导是全局的。编译时遇到编译指导后开始有效,直至复编译
39、指导是全局的。编译时遇到编译指导后开始有效,直至复位或被覆盖,可能影响多个文件。位或被覆盖,可能影响多个文件。使用尽可能大的精度。精度越小,仿真时间步越小,仿真时间使用尽可能大的精度。精度越小,仿真时间步越小,仿真时间越长。使用适当的精度,既达到必要的精度,又不会仿真太慢。越长。使用适当的精度,既达到必要的精度,又不会仿真太慢。主要数据类型主要数据类型Verilog主要有三类主要有三类(class)数据类型:数据类型: net (线网)(线网) : 表示器件之间的物理连接表示器件之间的物理连接 register (寄存器)(寄存器) :表示抽象存储元件:表示抽象存储元件 parameters(
40、参数参数) : 运行时的常数运行时的常数(run-time constants)net(线网)(线网)net需要被持续的驱动,驱动它的可以是门和模块。需要被持续的驱动,驱动它的可以是门和模块。 当当net驱动器的值发生变化时,驱动器的值发生变化时, Verilog自动的将新值传送到自动的将新值传送到net上。在例子中,线网上。在例子中,线网out由由or门驱动。当门驱动。当or门的输入信号置位时将门的输入信号置位时将传输到线网传输到线网net上。上。net类的类型(线网)类的类型(线网) 有多种有多种net类型用于设计类型用于设计(design-specific)建模和工艺建模和工艺(tech
41、nology-specific)建模建模 没有声明的没有声明的net的缺省类型为的缺省类型为 1 位位(标量标量)wire类型。但类型。但这个缺省类型可由下面的编译指导改变:这个缺省类型可由下面的编译指导改变: default_nettype net类型类型功功 能能wire, trisupply1, supply0wor, triorwand, triandtriregtri1, tri0标准内部连接线标准内部连接线(缺省缺省)电源和地电源和地多驱动源线或多驱动源线或多驱动源线与多驱动源线与能保存电荷的能保存电荷的net无驱动时上拉无驱动时上拉/下拉下拉综合编译综合编译器不支持器不支持的的n
42、et类型类型net类的类型(线网)类的类型(线网)wire类型是最常用的类型,只有连接功能。类型是最常用的类型,只有连接功能。wire和和tri类型有相同的功能。用户可根据需要将线网定义为类型有相同的功能。用户可根据需要将线网定义为wire或或tri以以提高可读性。例如,可以用提高可读性。例如,可以用tri类型表示一个类型表示一个net有多个驱动源。或者将一有多个驱动源。或者将一个个net声明为声明为tri以指示这个以指示这个net可以是高阻态可以是高阻态Z(hign-impedance)。可推广。可推广至至wand和和triand、wor和和triorwand、wor有线逻辑功能;与有线逻辑
43、功能;与wire的区别见下页的表。的区别见下页的表。trireg类型很象类型很象wire类型,但类型,但trireg类型在没有驱动时保持以前的值。这类型在没有驱动时保持以前的值。这个值的强度随时间减弱。个值的强度随时间减弱。修改修改net缺省类型的编译指导:缺省类型的编译指导: default_nettype nettype不能是不能是supply1和和类在发生逻辑冲突时的决断类在发生逻辑冲突时的决断 Verilog有预定义的决断函数有预定义的决断函数 支持与工艺无关的逻辑冲突决断支持与工艺无关的逻辑冲突决断 wire-and用于集电极开路电路用于集电极开路电路 wire
44、-or用于射极耦合电路用于射极耦合电路寄存器类寄存器类 (register)寄存器类型在赋新值以前保持原值寄存器类型在赋新值以前保持原值寄存器类型大量应用于行为模型描述及激励描述。在下面的例子寄存器类型大量应用于行为模型描述及激励描述。在下面的例子中,中,reg_a、reg_b、reg_sel用于施加激励给用于施加激励给2:1多路器。多路器。用行为描述结构给寄存器类型赋值。给用行为描述结构给寄存器类型赋值。给reg类型赋值是在过程块中。类型赋值是在过程块中。寄存器类的类型寄存器类的类型 寄存器类有四种数据类型寄存器类有四种数据类型寄存器类型 功能 reg 可定义的无符号整数变量,可以是标量(1
45、位)或矢量,是 最常用的寄存器类型 integer 32位有符号整数变量,算术操作产生二进制补码形式的 结果。通常用作不会由硬件实现的的数据处理。real 双精度的带符号浮点变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理realtime 与real内容一致,但可以用作实数仿真时间的保存与 处理 不要混淆寄存器数据类型与结构级存储元件,如不要混淆寄存器数据类型与结构级存储元件,如udp_dffVerilog中中net和和register声明语法声明语法 net声明声明 range delay , net_name;net_type: net类型类型ran
46、ge: 矢量范围,以矢量范围,以MSB:LSB格式格式delay: 定义与定义与net相关的延时相关的延时net_name: net名称,一次可定义多个名称,一次可定义多个net, 用逗号分开。用逗号分开。 寄存器声明寄存器声明 range , reg_name;reg_type:寄存器类型:寄存器类型range: 矢量范围,以矢量范围,以MSB:LSB格式。只对格式。只对reg类型有效类型有效reg_name :寄存器名称,一次可定义多个寄存器,用逗号分开:寄存器名称,一次可定义多个寄存器,用逗号分开Verilog中中net和和register声明语法声明语法 举例:举例:reg a; /一
47、个标量寄存器一个标量寄存器wand w; / 一个标量一个标量wand类型类型netreg 3: 0 v; / 从从MSB到到LSB的的4位寄存器向量位寄存器向量reg 7: 0 m, n; / 两个两个8位寄存器位寄存器tri 15: 0 busa; / 16位三态总线位三态总线wire 0: 31 w1, w2; / 两个两个32位位wire,MSB为为bit0选择正确的数据类型选择正确的数据类型module top;wire y; reg a, b;DUT u1 (y, a, b) ;initial begina = 0; b = 0; #5 a = 1; endendmodulemod
48、ule DUT (Y, A, B);output Y;input A, B;wire Y, A, B;and (Y, A, B) ;endmodule输入端口可以由输入端口可以由net/register驱动,但驱动,但输入端口只能是输入端口只能是net输出端口可以是输出端口可以是net/register类型,输类型,输出端口只能驱动出端口只能驱动net在过程块中只能给在过程块中只能给register类型赋值类型赋值若若Y,A,B说明为说明为reg则会产生错误。则会产生错误。in1in2OABY双向端口输入双向端口输入/输出输出只能是只能是net类型类型选择数据类型时常犯的错误选择数据类型时常犯
49、的错误用过程语句给一个用过程语句给一个net类型的或忘记声明类型的信号赋值。类型的或忘记声明类型的信号赋值。 信息:信息:illegal assignment.将实例的输出连接到声明为将实例的输出连接到声明为register类型的信号上。类型的信号上。 信息:信息: has illegal output port specification.将模块的输入信号声明为将模块的输入信号声明为register类型。类型。 信息:信息:incompatible declaration, 下面所列是常出的错误及相应的错误信息下面所列是常出的错误及相应的错误信息(error message)信号可以分为端口
50、信号和内部信号。出现在端口列表中的信号是端口信号,其它的信信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。号为内部信号。对于端口信号,输入端口只能是对于端口信号,输入端口只能是net类型。输出端口可以是类型。输出端口可以是net类型,也可以是类型,也可以是register类型。若输出端口在过程块中赋值则为类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值类型;若在过程块外赋值(包括实例化语包括实例化语句),则为句),则为net类型。类型。内部信号类型与输出端口相同,可以是内部信号类型与输出端口相同,可以是net或或register类
51、型。判断方法也与输出端口相同。类型。判断方法也与输出端口相同。若在过程块中赋值,则为若在过程块中赋值,则为register类型;若在过程块外赋值,则为类型;若在过程块外赋值,则为net类型。类型。若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,如决断信号。这时需要一个中间信号转换。如决断信号。这时需要一个中间信号转换。信号类型确定方法总结如下:信号类型确定方法总结如下:选择数据类型时常犯的错误举例选择数据类型时常犯的错误举例修改前:修改前:module example(o1, o2, a, b,
52、 c, d); input a, b, c, d; output o1, o2; reg c, d; reg o2 and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0;endmodule修改后:修改后:module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2;/ reg c, d;/ reg o2 reg o1; and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0;endmodu
53、leexample.v选择数据类型时常犯的错误举例选择数据类型时常犯的错误举例Compiling source file example.vError! Illegal left-hand-side assignment Verilog-ILHSA example.v, 11: o1 = b;Error! Illegal left-hand-side assignment Verilog-ILHSA example.v, 12: o1 = 0;2 errors第一次编译信息第一次编译信息verilog c example.v第二次编译信息第二次编译信息Compiling source file
54、 example.vError! Incompatible declaration, (c) defined as input at line 2 Verilog-IDDIL example.v, 5: Error! Incompatible declaration, (d) defined as input at line 2 Verilog-IDDIL example.v, 5: Error! Gate (u1) has illegal output specification Verilog-GHIOS example.v, 8: 3 errors参数(参数(parameters)用参数
55、声明一个可变常量,常用于定义延时及宽度变量。用参数声明一个可变常量,常用于定义延时及宽度变量。参数定义的语法:参数定义的语法:parameter ;可一次定义多个参数,用逗号隔开。可一次定义多个参数,用逗号隔开。在使用文字在使用文字(literal)的地方都可以使用参数。的地方都可以使用参数。参数的定义是局部的,只在当前模块中有效。参数的定义是局部的,只在当前模块中有效。参数定义可使用以前定义的整数和实数参数。参数定义可使用以前定义的整数和实数参数。module mod1( out, in1, in2); . . .parameter cycle = 20, prop_ del = 3, se
56、tup = cycle/2 - prop_del, p1 = 8, x_ word = 16bx, file = / usr1/ jdough/ design/ mem_ file. dat; . . . wire p1: 0 w1; / A wire declaration using parameter . . .endmodule注意注意:参数:参数file不是不是string,而是一个整数,其值是所而是一个整数,其值是所有字母的扩展有字母的扩展ASCII值。值。若若file=“AB”,则,则file值为值为8h4142。用法:。用法:$fopen(file);$display(“%s”
57、, file);参数重载(参数重载(overriding)可用可用defparam语句在编译时重载参数值。语句在编译时重载参数值。defparam语句引用参数的层次化名称语句引用参数的层次化名称使用使用defparam语句可单独重载任何参数值。语句可单独重载任何参数值。Defparam语句语句(现在综合工具还不支持)(现在综合工具还不支持)module mod1( out, in1, in2); . . . parameter p1 = 8, real_constant = 2.039, x_word = 16bx, file = /usr1/jdough/design/mem_file.da
58、t; . . .endmodulemodule test;. . . mod1 I1( out, in1, in2); defparam I1. p1 = 6, I1. file = ./ my_mem.dat;. . .endmodule参数重载(参数重载(overriding)module mod1( out, in1, in2); . . . parameter p1 = 8, real_constant = 2.039, x_word = 16bx, file = /usr1/jdough/design/mem_file.dat;. . .endmodulemodule top; .
59、. . mod1 #( 5, 3.0, 16bx, ./ my_mem. dat) I1( out, in1, in2); . . .endmodule模块实例化时参数重载模块实例化时参数重载使用#次序与原说明相同不需要给所有参数赋新值,但不能跳跃赋值,假设模块MOD顺序定义三个参数a, b, c,则:MOD u1 #( a, b) (.); MOD u2 #(a) (.);MOD u3 #(a, ,c) (.); MOD u4 #(, b, c) (.); 为什么编译器为什么编译器认为这是参数认为这是参数而不是延时呢?而不是延时呢?因为因为# #说明延时的时候只能说明延时的时候只能用于用于g
60、ategate或过程语句,不能或过程语句,不能用于模块实例。用于模块实例。gategate(primitives)primitives)在实例化时在实例化时只能有延时,不能有模块只能有延时,不能有模块参数。参数。寄存器数组寄存器数组(Register Arrays) 在在Verilog中可以说明一个寄存器数组。中可以说明一个寄存器数组。 integer NUMS 7: 0; / 包含包含8个整数数组变量个整数数组变量 time t_vals 3: 0; / 4个时间数组变量个时间数组变量 reg类型的数组通常用于描述存储器类型的数组通常用于描述存储器 其语法为:其语法为: reg MSB:LS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 空间符号的家族构建-洞察及研究
- 社会保障体系的再分配效应-洞察及研究
- 2025广西高考单招试题及答案
- 2.4.1 依据生物的特征进行分类教学设计 -济南版生物七年级上册
- 《第一单元 信息交流与安全 3 防范病毒保安全》(教学设计)-闽教版信息技术五年级上册
- 2025各地教师招聘试题及答案
- 借款合同模板怎么找到的(3篇)
- 陵川货运从业资格考试及答案解析
- 2025年免规专项培训试题及答案
- 空间应用数学考研资料(3篇)
- 初中数学分层作业设计举例-有理数
- 给小学生科普化学
- 驾照体检表完整版本
- 成都中医药大学药学院毕业实习鉴定表
- 磁保持继电器基础知识课件
- 安全生产区域管理办法范本
- 镇墩稳定计算
- 2023-2024学年辽宁省沈阳市郊联体高二上学期10月月考物理试题(解析版)
- 设备保管协议
- 中石油职称英语通用教材
- 焊接质量手册
评论
0/150
提交评论