设计示例一 用门级结构描述D触发器.ppt_第1页
设计示例一 用门级结构描述D触发器.ppt_第2页
设计示例一 用门级结构描述D触发器.ppt_第3页
设计示例一 用门级结构描述D触发器.ppt_第4页
设计示例一 用门级结构描述D触发器.ppt_第5页
已阅读5页,还剩513页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计示例一,用门级结构描述D触发器:,设计示例一,module flop(data,clock,clear,q,qb); input data,clock,clear; output q,qb; nand #10 nd1(a,data,clock,clear), nd2(b,ndata,clock), nd4(d,c,b,clear), nd5(e,c,nclock), nd6(f,d,nclock), nd8(qb,q,f,clear); nand #9 nd3(c,a,d), nd7(q,e,qb); not #10 iv1(ndata,data), iv2(nclock,clock); endmodule,设计示例二,由已设计的模块来构成高一级的模块,设计示例二,include “ flop.v ” module hardreg(d,clk,clrb,q); input clk,clrb; input3:0 d; output3:0 q; flop f1(d0,clk,clrb,q0,), f2(d1,clk,clrb,q1,), f3(d2,clk,clrb,q2,), f4(d3,clk,clrb,q3,); endmodule,设计示例三,编写测试模块通过仿真检查设计正确与否:,include “hardreg.v” module hardreg_top; reg clock, clearb; reg 3:0 data; wire 3:0 qout; define stim #100 data=4b /宏定义 stim,可使源程序简洁 event end_first_pass; /定义事件end_first_pass,设计示例三 (续),hardreg reg_4bit(.d(data),.clk(clock), .clrb(clearb), .q(qout); /*- 把本模块中产生的测试信号data、clock、clearb输入实例reg_4bit以观察输出信号qout.实例reg_4bit引用了hardreg -*/ initial begin clock = 0; clearb = 1; end always #50 clock = clock;,设计示例三 (续),/*- 宏定义stim引用,等同于 #100 data=4b 注意引用时要用 符号。-*/ stim 0000; stim 0001; . . . . . . stim 1111; end #200 end_first_pass; /*- 延迟200个单位时间,触发事件end_first_pass -*/ $finish; /结束仿真 end endmodule,Verilog HDL 设计示例四,有限状态机的设计,- 有限状态机是由寄存器组和组合逻辑构成的 硬件时序电路; - 其状态(即由寄存器组的1和0的组合状态所 构成的有限个状态)只能在同一时钟跳变沿 的 情况下才能从一个状态转向另一个状态; - 究竟转向哪一状态不但取决于各个输入值, 还取决于当前状态。 - 状态机可用于产生在时钟跳变沿时刻开关的 复杂的控制逻辑,是数字逻辑的控制核心。,设计示例四 (续),设计示例四 (续),module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; reg F,G; reg 1:0 state ; parameter Idle = 2b00, Start = 2b01, Stop = 2b10, Clear = 2b11; always (posedge Clock) if (!Reset) begin state = Idle; F=0; G=0; end else,设计示例四 (续),case (state) idle: begin if (A) state = Start; G=0; end start: if (!A) state = Stop; Stop: begin if (A) state = Clear; F = 1; end Clear: begin if (!A) state =Idle; F=0; G=1; end endcase endmodule,设计示例四 (续),还可以用另一个Verilog HDL模型来表示同一个有限状态,见下例: module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; reg F,G; reg 3:0 state ; parameter Idle = 4b1000, Start = 4b0100, Stop = 4b0010, Clear = 4b0001;,设计示例四 (续),always (posedge clock) if (!Reset) begin state = Idle; F=0; G=0; end else case (state) Idle: begin if (A) state = Start; G=0; end Start: if (!A) state = Stop; Stop: begin if (A) state = Clear;,设计示例四 (续),F = 1; end Clear: begin if (!A) state =Idle; F=0; G=1; end default: state =Idle; endcase endmodule,设计示例四 (续),我们还可以用另一种风格的Verilog HDL模型来表示同一个有限状态。在这个模型中,我们把用always语句在时钟沿触发条件下的状态变化放在一个独立的块中, 而把在状态控制下的两个开关分两个独立的组合逻辑always块来描述。见下例: module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; reg 1:0 state ; reg F,G; parameter Idle = 2b00, Start = 2b01, Stop = 2b10, Clear = 2b11;,设计示例四 (续),always (posedge Clock) if (!Reset) begin state = Idle; end else case (state) Idle: if (A) state = Start; Start: if (!A) state = Stop; Stop: if (A) state = Clear; Clear: if (!A) state = Idle; default: state = 2 bxx; endcase,设计示例四 (续),always (state or Reset or A) begin if ( !Reset) F = 0; else if (state = Stop) F = 1; end always (state or Reset or A) begin if (! Reset) G = 0; else if (state = Clear) G = 1; end endmodule,Verilog HDL 基础语法入门,第一部分 课程简介,目的: 简单介绍Verilog HDL语言和仿真工具 介绍讲课计划 介绍如何不断地学习新的有关知识,讲座中关于Verilog HDL的主要内容,讲课内容主要包括: Verilog 的应用 Verilog 语言的组成部件 结构级的建模与仿真 行为级的建模与仿真 延迟参数的表示 Verilog 的测试平台: 怎样产生激励信号和控制信号 输出响应的产生、记录和验证 任务和函数 用户定义的元器件(primitives) 可综合风格的Verilog 建模,讲座中关于Verilog仿真工具的主要内容,讲课内容主要包括: 如何对所做的设计进行编译和仿真 如何使用元器件库 如何用Verilog-XL命令行界面调试代码 如何用图形用户界面(GUI) 延迟的计算和标记 仿真性能建模 循环多次仿真,目的: 了解用HDL语言设计数字逻辑的优点 了解Verilog 主要应用领域 了解Verilog 的发展历史 了解电路系统的不同层次的Verilog抽象,第二部分:Verilog 的应用,Verilog HDL是一种用于数字逻辑电路设计的语言: - 用Verilog HDL描述的电路设计就是该电路 的 Verilog HDL模型。 - Verilog HDL 既是一种行为描述的语言也 是一种结构描述的语言。 这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:,Verilog 的应用,Verilog 的应用,系统级(system): 用高级语言结构实现设计模块的外部性能的模 算法级(algorithmic): 用高级语言结构实现设计算法的模型。 RTL级(Register Transfer Level): 描述数据在寄存器之间流动和如何处理这些数据的模型。 门级(gate-level): 描述逻辑门以及逻辑门之间的连接的模型。 开关级(switch-level): 描述器件中三极管和储存节点以及它们之间连接的模型。,Verilog 的应用,一个复杂电路的完整Verilog HDL模型是由若个 Verilog HDL 模块构成的,每一个模块又可以由若干个子模块构成。 利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。 Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下八项功能:,Verilog 的应用,可描述顺序执行或并行执行的程序结构。 用延迟表达式或事件表达式来明确地控制过程的启动时间。 通过命名的事件来触发其它过程里的激活行为或停止行为。 提供了条件、if-else、case、循环程序结构。 提供了可带参数且非零延续时间的任务(task)程序结构。 提供了可定义新的操作符的函数结构(function)。,Verilog 的应用,提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 Verilog HDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。,Verilog 的应用,Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习 Verilog HDL并不困难,我们只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对Verilog HDL中的基本语法逐一加以介绍。,模块的抽象,技术指标: 用文字表示 用算法表示 用高级行为的Verilog模块表示 RTL/功能级: 用可综合的Verilog模块表示 门级/结构级: 用实例引用的Verilog模块表示 版图布局/物理级: 用几何形状来表示,第三部分.简单的 Verilog HDL 模块,目的: 通过简单的例子了解Verilog模块的基本构成 了解Verilog模块的层次结构和行为模块 了解Verilog模块的测试,简单的 Verilog HDL 模块,下面先介绍几个简单的Verilog HDL程序,然后从中分析Verilog HDL程序的特性。 例2.1.1: module adder ( count,sum,a,b,cin ); input 2:0 a,b; input cin; output count; output 2:0 sum; assign count,sum=a+b+cin; endmodule 这个例子描述了一个三位的加法器。从例子中可以看出整个Verilog HDL程序是嵌套在module和endmodule声明语句里的。,简单的 Verilog HDL 模块,例2.1.2: module compare ( equal,a,b ); output equal; /声明输出信号equal input 1:0 a,b; /声明输入信号a,b assign equal=(a=b)?1:0; /*如果两个输入信号相等,输出为1。否则为0*/ endmodule 这个程序描述了一个比较器.在这个程序中,/*/和/.表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。,简单的 Verilog HDL 模块,例2.1.3: module trist2(out,in,enable); output out; input in, enable; bufif1 mybuf(out,in,enable); endmodule 这个程序描述了一个三态驱动器。程序通过调用一个实例元件bufif1来实现其功能。,简单的 Verilog HDL 模块,例2.1.4: module trist1(out,in,enable); output out; input in, enable; mytri tri_inst(out,in,enable); endmodule module mytri(out,in,enable); output out; input in, enable; assign out = enable? In : bz; endmodule,简单的 Verilog HDL 模块,上述程序例子通过另一种方法描述了一个三态门。 在这个例子中存在着两个模块:模块trist1 调用模块 mytri 的实例元件 tri_inst。 模块 trist1 是上层模块。模块 mytri 则被称为子模块。 通过这种结构性模块构造可构成特大型模块。,简单的 Verilog HDL 模块,通过上面的例子可以看到: Verilog HDL程序是由模块构成的。模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。 Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。 除了endmodule语句外,每个语句和数据定义的最后必须有分号 可以用/*.*/和/.对Verilog HDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。,模块的结构,Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的:一)描述接口;二)描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:,模块的结构,从上面的例子可以看出: - Verilog模块结构完全嵌在module和endmodule声明语句之间; - 每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。,模块的测试,如何检查上述例子其功能是否正确? 需要有测试激励信号输入到被测模块 需要记录被测模块的输出信号 需要把用功能和行为描述的Verilog模块 转换为门级电路互连的电路结构(综合)。 需要对已经转换为门级电路结构的逻辑 进行测试(门级电路仿真)。 需要对布局布线后的电路结构进行测试。 (布局布线后仿真)。,模块的测试,模块的测试,测试模块常见的形式: module t; reg ; /被测模块输入/输出变量类型定义 wire; /被测模块输入/输出变量类型定义 initial begin ; ; ; end /产生测试信号 always #delay begin ; end /产生测试信号 Testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) ); /被测模块的实例引用 initial begin .; .; . end /记录输出和响应 endmodule,模块的测试,测试模块中常用的过程块:,always,所有的过程块都在0时刻同时启动;它们是并行的,在模块中不分前后。 initial块 只执行一次。 always块 只要符合触发条件可以循环执行。,模块的测试,如何描述激励信号: module t; reg a, b, sel; wire out; /引用多路器实例 mux2_m (out, a, b, sel); /加入激励信号 initial begin a=0; b=1; sel=0; #10 b=0; #10 b=1; sel=1; #10 a=1; #10 $stop; end,模块的测试,如何观察被测模块的响应: 在initial 块中,用系统任务$time 和 $monitor $time 返回当前的仿真时刻 $monitor 只要在其变量列表中有某一个或某几个变 量值发生变化,便在仿真单位时间结束时显示其变 量列表中所有变量的值。 例: initial begin $monitor ($time, , “out=%b a=%b sel=%b”, out,a,b,sel); end,模块的测试,如何把被测模块的输出变化记录到数据库文件中? (文件格式为VCD,大多数的波形显示工具都能读取该格式) 可用以下七个系统任务: $dumpfile(“file.dump”); /打开记录数据变化的数据文件 $dumpvars(); /选择需要记录的变量 $dumpflush; /把记录在数据文件中的资料转送到硬盘保存 $dumpoff; /停止记录数据变化 $dumpon; /重新开始记录数据变化 $dumplimit(); /规定数据文件的大小(字节) $dumpall; /记录所有指定信号的变化值到数据文件中,模块的测试,如何把被测模块的响应变化记录到数据库文件中? 举例说明: $dumpvars; /记录各层次模块中所有信号的变化 $dumpvars(1,top); /只记录模块top中所有信号的变化 $dumpvars(2,top.u1); /记录top模块中实例u1和它以下一层子模块所有信号的变化 $dumpvars(0,top.u2,top.u1.u13.q); /记录top模块中实例u2和它本层所有信号的变化,还有top.u1.u13.q 信号的变化。 $dumpvars(3,top.u2,top.u1); /记录top模块中u2和u1所有信号的变化(包括其两层以下子模块的信号变化)。,模块的测试,如何把被测模块的响应变化记录到数据库文件中? 举例说明: 下面的 Verilog 代码段可以代替测试文件中的系统任务$monitor initial begin $dumpfile(“vlog.dump”); $dumpvars(0,top); end,语法详细讲解 第四部分. Verilog 语法要点,目标: 理解Verilog 语言的一些重要规定. 学会认识一些有关的重要语言符号. 掌握Verilog 中如何规定时间单位,语法详细讲解 Verilog 与 C 的主要不同点,Verilog 有许多语法规则与 C 语言一致。 但与 C 语言有根本的区别: - 并行性 - 块的含义: initial 块 和 always块 两种赋值语句: 阻塞 赋值 “ = ” 非阻塞赋值 “= ”,语法详细讲解 空格和注释,Verilog 是一种格式很自由的语言。 空格在文本中起一个分离符的作用, 别的没有其他用处。 单行注释符用 /* 与C 语言一致 多行注释符用 /* - */ 与C 语言一致,语法详细讲解 整数和实常数,Verilog 语言中常数可以是整数或实数: 整数可以标明位数也可以不标明位数,表示方法: 位数基数值 其中位数表明该数用二进制的几位来表示 基数可以是二(b)、八(O)、十(d)或 十六(h)进制 数值可以是所选基数的任何合法的值包括 不定值 x 位和高阻值 z。 如:64hff01 8b1101_0001 h83a 实常数可以用十进制表示也可以用科学浮点数表示,如:32e-4 (表示0.0032) 4.1E3( 表示 4100),语法详细讲解 字符串,Verilog 语言中,字符串常常用于表示命令内需要显示的信息。 用“ ”括起来的一行字符串,换新一行用 “n” 字符,与 C 语言一致。 在字符串中可以用 C 语言中的各种格式控制符,如t, ”, 在字符串中可以用 C 语言中的各种数值型式控制符(有些不同),如: %b(二进制), %o(八进制), %d(十进制), %h(十六进制), %t(时间类型),%s (字符串类型),语法详细讲解 标识符,所谓标识别符就是用户为程序描述中的Verilog 对象所起的名字。 标识符必须以英语字母(a-z, A-Z)起头,或者用下横线符( _ )起头。其中可以包含数字、$符和下横线符。 标识符最长可以达到1023个字符。 模块名、端口名和实例名都是标识符。 Verilog语言是大小写敏感的,因此sel 和 SEL 是两个不同的标识符。,语法详细讲解 合法和非法标识符,合法的: shift_reg_a busa_index bus263,非法的: 34net /不能用数字开头 a*b_net /不能含有非字母符号* n263 /不能含有非字母符号,Verilog 是大小写敏感的。所有的Verilog 关键词都是小写的。,语法详细讲解 特别的标识符,特别标识符是用 “” 符开始,以空格符结束的标 识符。它可以包含任何可打印的ASCII字符。 但“”符和空格并不算是标识符的一部分。 特别标识符往往是由RTL级源代码或电路图类型的 设计输入经过综合器自动综合生成的网表结构型 Verilog 语句中的标识符。 举例说明: #sel , bus+index , A,B , Top.3inst .net1 , /在层次模块中的标识名,语法详细讲解 系统任务和函数,$ $ 符号表示 Verilog 的系统任务和函数 常用的系统任务和函数有下面几种: $time /找到当前的仿真时间 $display, $monitor /显示和监视信号值的变化 $stop /暂停仿真 $finish /结束仿真 - 例: initial $monitor($time,”a=%b, b=%b”, a, b); /每当a 或b值变化时该系统任务都显示当前的仿真时刻并分别用二进制和十六进制显示信号a和 b的值,语法详细讲解 特殊符号 “#”,特殊符号 “#” 常用来表示延迟: 在过程赋值语句时表示延迟。 例:initial begin #10 rst=1; #50 rst=0; end 在门级实例引用时表示延迟。 例:not #1 not1(nsel, sel); and #2 and2(a1, a, nsel); 在模块实例引用时表示参数传递 介绍参数类型变量时再讲。,语法详细讲解 编译引导语句,编译引导语句用主键盘左上角小写键 “ ” 起头 用于指导仿真编译器在编译时采取一些特殊处理 编译引导语句一直保持有效,直到被取消或重写 resetall 编译引导语句把所有设置的编译引导恢复到缺省状态 常用的编译引导有: define include timescale uselib resetall ,语法详细讲解 编译引导语句,使用define 编译引导能提供简单的文本替代功能 define 在编译时会用宏文本来替代源代码中的宏名。 合理地使用define可以提高程序的可读性 举例说明: define on 1b1 define off 1b0 define and_delay #3 在程序中可以用有含义的文字来表示没有意思的数码提高了程序 的可读性,在程序中可以用 on, off, and_delay 分别表 示 1,0,和 #3 。,语法详细讲解 编译引导语句,使用include 编译引导,在编译时能把其指定的整个文件包括进来一起处理 举例说明: include “global.v” include “parts/counter.v” include “/library/mux.v” 合理地使用include 可以使程序简洁、清晰、条理清楚、易于查错。,语法详细讲解 编译引导语句,timescale 用于说明程序中的时间单位和仿真精度 举例说明: timescale 1ns/100ps timescale 语句必须放在模块边界前面 举例说明: timescale 1ns/100ps module MUX2_1(out,a,b,sel); not #1 not1(nsel, sel); and #2 and1(a1, a, nsel); endmodule 尽可能地使精度与时间单位接近,只要满足设计的实际需要就行。 举例说明:在上例中所有的时间单位都是1ns的整数倍,语法详细讲解 编译引导语句,仿真步长即仿真单位(STU) 是所有参加仿真模块中由timescale 指定的精度中最高(即时间最短)的那个决定的: (STU=100fs) 举例: timescale 1ns/10ps module M1(.); not #1.23 not1(nsel, sel); /1.23 ns中共有12300个STU(100fs) endmodule timescale 100ns/1ns module M2(.); not #1.23 not1(nsel, sel); /123 ns中共有1230000个STU(100fs) endmodule timescale 1ps/100fs module M3(.); not #1.23 not1(nsel, sel); /1.23 ps中共有12个STU(100fs) endmodule,语法详细讲解 编译引导语句,时间单位 : fs (呼秒)femptoseconds: 1.0E-15 秒 ps (皮秒) picoseconds: 1.0E-12 秒 ns (纳秒) nonoseconds: 1.0E-9 秒 us (微秒) microseconds: 1.0E-6 秒 ms (毫秒) milliseconds: 1.0E-3 秒 s ( 秒) seconds: 1.0 秒,语法详细讲解 编译引导语句,uselib 编译引导语句: 用于定义仿真器到哪里去找库元件 如果该引导语句启动的话,它就一直有效 直到遇到另外一个uselib的定义或resetall语句 比其他配置库搜索路径的命令选项作用大 如果仿真器在uselib定义的地点找不到器件库,它不会转向由编译命令行-v 和-y选项指定的器件库去找。,语法详细讲解 编译引导语句,使用 uselib 的语法: uselib 器件库1的地点 器件库2的地点 。 上面的器件库地点可用以下两种方法表示: 1) file = 库文件名的路径 2) dir = 库目录名的路径 libext = .文件扩展 例如: uselib dir =/lib/FAST_lib/ uselib dir =/lib/TTL_lib/ libext=.v file = /libs/TTL_U/udp.lib,语法详细讲解 第五部分 Verilog 的数据类型和逻辑值,目的: 掌握Verilog不同逻辑值的含义 学习Verilog不同的数据类型 理解如何使用和在什么场合下使用不同的数据类型 学习声明数据类型的语法,语法详细讲解 Verilog 的四种逻辑值,0、低、伪、逻辑低、地、VSS、负插入,1、高、真、逻辑高、电源、VDD、正插入,X、不确定:逻辑冲突无法确定其逻辑值,HiZ、高阻抗、三态、无驱动源,语法详细讲解 主要的数据类型,Verilog 有三种主要的数据类型: Nets 表示器件之间的物理连接, 称为网络连接类型 Register 表示抽象的储存单元,称为寄存器/变量类型 Parameter 表示运行时的常数,称为参数类型,语法详细讲解 主要的数据类型,Nets(网络连线): 由模块或门驱动的连线。 驱动端信号的改变会立刻 传递到输出的连线上。 例如:右图上,selb的改 变,会自动地立刻影响或 门的输出。,nets,语法详细讲解 主要的数据类型,连接(Nets) 类型变量的种类: 在为不同工艺的基本元件建立库模型的时候,常常需要用不同的 连接类型来与之对应,使其行为与实际器件一致。常见的有以下 几种。 类型 功能 wire, tri 对应于标准的互连线(缺省) supply1, supply2 对应于电源线或接地线 wor, trior 对应于有多个驱动源的线或逻辑连接 wand, triand 对应于有多个驱动源的线与逻辑连接 trireg 对应于有电容存在能暂时存储电平的连接 tri1, tri0 对应于需要上拉或下拉的连接 如果不明确地说明连接是何种类型,应该是指 wire 类型。,语法详细讲解 主要的数据类型,寄存器(register)类型变量 register 型变量能保持其值,直到它被赋于新的值。 register 型变量常用于行为建模,产生测试的激励信号。 常用行为语句结构来给寄存器类型的变量赋值。,语法详细讲解 主要的数据类型,寄存器(register)类型变量的数据类型 寄存器类型变量共有四种数据类型: 类型 功能 . reg 无符号整数变量,可以选择不同的位宽。 integer 有符号整数变量,32位宽,算术运算可产生2的 补码。 real 有符号的浮点数,双精度。 time 无符号整数变量,64位宽(Verilog-XL仿真 工具用64位的正数来记录仿真时刻),语法详细讲解 主要的数据类型,如何选择正确的数据类型? 输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 输出口 (output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。 输入/输出口(inout)只可以由网络连接驱动,但它本身只能驱动网络连接。 如果信号变量是在过程块 (initial块 或 always块)中被赋值的,必须把它声明为寄存器类型变量,语法详细讲解 主要的数据类型,举例说明数据类型的选择 module top; wire y; reg a, b; DUT u1(y,a,b); initial begin a = 0; b = 0; #10 a =1; . end endmodule,module DUT(Y, A, B_); output Y; input A,B: wire Y, A, B; and (Y, A, B); endmodule,语法详细讲解 主要的数据类型,选择数据类型时常犯的错误 在过程块中对变量赋值时,忘了把它定义为寄存器 类型(reg)或已把它定义为连接类型了(wire) 把实例的输出连接出去时,把它定义为寄存器类型了 把模块的输入信号定义为寄存器类型了。 这是经常犯的三个错误!,语法详细讲解 主要的数据类型,参数(parameters)类型 常用参数来声明运行时的常数。 可用字符串表示的任何地方,都可以用定义的参数来代替。 参数是本地的,其定义只在本模块内有效。 举例说明: module md1(out,in1,in2); parameter cycle=20, prop_del=3, setup=cycle/2-prop_del, p1=8, x_word=16bx, file = “/user1/jmdong/design/mem_file.dat”; wire p1:0 w1; /用参数来说明wire 的位宽 . initial begin $open(file); . #20000 display(“%s”,file); $stop end . endmodule,语法详细讲解 主要的数据类型,参数值的改写(方法之一) 举例说明: module mod ( out, ina, inb); parameter cycle = 8, real_constant=2.039, file = “/user1/jmdong/design/mem_file.dat”; endmodule module test; mod mk(out,ina,inb); defparam mk.cycle=6, mk.file=“/my_mem.dat”; endmodule,语法详细讲解 主要的数据类型,参数值的改写(方法之二) 举例说明: module mod ( out, ina, inb); parameter cycle = 8, real_constant=2.039, file = “/user1/jmdong/design/mem_file.dat”; endmodule module test; mod # (5, 3.20, “/my_mem.dat”) mk(out,ina,inb); endmodule,语法详细讲解 寄存器阵列,Verilog 语言支持寄存器阵列的声明: 举例说明: integer NUMS 7:0; / 8个整型变量的寄存器阵列 time t_vals 3:0; /4个时间变量的寄存器阵列 数据类型为 reg 的阵列常称为存储器(即 memory): reg 15:0 MEM 0:1023; / 1K x 16 位的存储器 reg 7:0 PREP hfffe : hffff; / 2 x 8 位的存储器 可以用参数来表示存储器的大小: parameter wordsize = 16; parameter memsize = 1024; reg wordsize-1:0 MEM3memsize-1:0;,语法详细讲解 第十一部分 用文本接口的调试,目的: 在本节中我们将学习如何用Verilog-XL提供的TUI(用户文本接口)来调试所设计的模块 进入交互方式的仿真模式 控制和观察仿真 浏览设计的各个层次 设置仿真的检查断点、退出仿真,语法详细讲解,语法详细讲解,语法详细讲解 第十四部分 Verilog测试模块的编写,目的: 复习如何编写较复杂的测试文件,对所做的设计 进行完整的测试和验证。 掌握组织模块测试的常用方法;学会编写常用的 测试代码。,语法详细讲解 用Verilog设计的步骤,注:虚线表示编译器能检查输入文件的可读性和是否存在以及是否允许生成输出文件,include 文件,设计文件,厂家元件 库文件,输入文件:激励和期望的输出信号,输出文件:激励和实际输出的信号,编译器,仿真器,仿真器,语法详细讲解 测试平台的组成,激励 信号,需要验证的 设计,激励信号 和用于验 证的结果 数据,需要验证的 设计,简单的测试平台,复杂的测试平台,语法详细讲解 并行块,在测试块中常用到forkjoin块。用并行块能表示以同一个时间起点算起的多个事 件的运行,并行地执行复杂的过程结构,如循环或任务。举例说明如下: module inline_tb; reg 7:0 data_bus; initial fork data_bus= 8b00; #10 data_bus = 8h45; #20 repeat (10) #10 data_bus = data_bus +1; #25 repeat (5) # 20 data_bus = data_bus 1; #140 data_bua = 8h0f; join endmodule,/这两个repeat开始执行时间不同,但能同时运行。,语法详细讲解 并行块,时间 data_bus 0 8b0000_0000 10 8b0100_0101 30 8b0100_0110 40 8b0100_0111 45 8b1000_1110 50 8b1000_1111 60 8b1001_0000 65 8b0010_0000 70 8b0010_0001,时间 data_bus 80 8b0010_0010 85 8b0100_0100 90 8b0100_0101 100 8b0010_0001 105 8b0100_0110 110 8b1000_1100 120 8b1000_1110 125 8b0001_1100 140 8b0000_1111,上面模块的仿真输出如下:,语法详细讲解,语法详细讲解 强制激励,在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值。 过程连续赋值往往是不可以综合的,通常用在测试模块中。 两种方式都有各自配套的命令来停止赋值过程。 两种不同方式均不允许赋值语句间的时间控制。 assign和deassign 适用于对寄存器类型的信号(例如:RTL级上 的节点或测试模块中在多个地方被赋值的信号)进行赋值。 initial begin #10 assign top.dut.fsml.state_reg = init_state;,#20 deassign top.dut.fsml.state_reg; end force 和 release 用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。 initial begin # 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; end 在以上两个例子中,在10到20 这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。 force的赋值优先级高于assign。 如果先使用assign,再使用force对同一信号赋值,则信号的值为force所赋 的值,,语法详细讲解 强制激励,语法详细讲解 字符串,语法详细讲解 强制激励,语法详细讲解 强制激励,当执行release后,则信号的值为assign所赋 的值。 如果用force对同一个信号赋了几次值,再执行release,则所有赋的值均不再存在。 可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用force和release赋值;但不能对信号的可变位使用force和release 来赋值。 不能对寄存器类型的信号某位或某些位使用 assign 和deassign 来赋值。,语法详细讲解 强制激励,语法详细讲解 建立时钟,虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面 三个例子分别说明如何在门级和行为级建立不同波形的时钟模型。 例1 简单的对称方波时钟:,语法详细讲解 建立时钟,reg clk; always begin #period/2 clk=0; #period/2 clk=1; end,reg go; wire clk; nand #(period/2) ul (clk,clk,go); initial begin go=0; #(period/2) go=1; end,注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟模型产生的,则仿真器的性能就能得到提高。,例2简单的带延迟的对称方波时钟:,语法详细讲解 建立时钟,reg clk; initial begin clk=0; #(period) forever #(period/2) clk=!clk end,reg go; wire clk; nand #(period/2) ul (clk,clk,go); initial begin go=0; #(period) go=1; end,注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,而门级描述的模型开始延迟有半个周期是不确定的。,语法详细讲解 建立时钟,例3. 带延迟、头一个脉冲不规则的、占空比不为1的时钟:,语法详细讲解 建立时钟,reg clk; initial begin #(period+1) clk=1; #(period/2-1) forever begin #(period/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论