1 / 35

VLSI 系统设计

Verilog HDL 介绍 天津大学计算机学院 郭炜. VLSI 系统设计. 内容. Verilog HDL 语言要素(续) Modelsim 仿真. Register (寄存器)与 Latch( 锁存器 ). clk. data. q. clk. data. q. RTL for Register and Latch. Register —— Edge Triggered (寄存器). D 寄存器:. always @(posedge clk ) q <= data ;. Latch —— Level Sensitive ( 锁存器 ).

agatha
Télécharger la présentation

VLSI 系统设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VerilogHDL介绍 天津大学计算机学院 郭炜 VLSI系统设计

  2. 内容 • Verilog HDL语言要素(续) • Modelsim仿真

  3. Register (寄存器)与 Latch(锁存器)

  4. clk data q clk data q RTL for Register and Latch Register —— Edge Triggered(寄存器) D寄存器: always @(posedge clk) q <= data; Latch —— Level Sensitive (锁存器) D锁存器: always @(clk or data ) if (clk) q = data;

  5. 应避免使用锁存器 • 锁存器和触发器实现的逻辑功能基本相同,都是暂存数据,但锁存器存在一些缺点,尽量避免使用 • 没有时钟端,不受同步时钟的控制,无法实现同步操作。 • 毛刺敏感,受布线延迟影响较大,很难保证输出没有毛刺产生。 • 会使静态时序分析变得复杂。 • 可测性不好,也使得DFT设计复杂。 • FPGA器件中有大量的D触发器结构而没有锁存器这种现成的结构,使用锁存器会更耗资源

  6. 可能生成锁存器的其它情况 • 在if-else或者case语句中必须说明各种可能的条件分支,否则可能产生电平敏感的锁存器

  7. reg [2:0] z; 但左边的例子综合出来的是连线,右边的例子综合出来的是锁存器 • reg类型是抽象的数据存储单元。不要将reg类型的变量与实际电路中由边沿触发的触发器构成的硬件寄存器混淆。可被综合工具综合为连线、寄存器、锁存器。

  8. ASIC/FPGA设计方法与RTL代码 • 考虑到静态时序分析(STA)、可测试性设计等EDA工具的支持, • 在VLSI设计中,应避免使用锁存器(Latch)。 • Be certain not to inadvertently imply latches. Check synthesis reports for warnings such as: • (Synopsys) Warning: Latch inferred in design ….. • (Synplicity) @W: ... Latch generated from always block for signal…

  9. 带复位的上升沿触发的 D触发器 always @(posedge clk) q <= data; 异步复位 (Asynchronous) always @(posedge clk or negedge reset) if (~reset) q <= 0; else q <= data; 同步复位 (Synchronous) always @(posedge clk) if (~reset) q <= 0; else q <= data;

  10. 条件操作符:? 条件操作符根据条件表达式的值选择相应的表达式,形式如下: 条件表达式?表达式1:表达式2; 其执行过程是首先对条件表达式进行判断,如果其为真(即值为1),选择表达式1,否则选择表达式2。

  11. 例题:总线选择电路 module sel4_1(bus_a,bus_b,bus_c,bus_d,sel, dout); input [3:0] bus_a; input [3:0] bus_b; input [3:0] bus_c; input [3:0] bus_d; input [1:0] sel; output [3:0] dout; assign dout= (sel==2’b00)?bus_a: (sel==2’b01)?bus_b: (sel==2’b10)?bus_c:bus_d; endmodule 这里的assign语句右侧表达式的含义是首先判断(sel==2’b00)是 否成立,如果成立那么dout就等于bus_a;否则判断(sel==2’b01)是 否成立,如果成立那么dout就等于bus_b,依次类推。

  12. 条件语句和循环语句 • If语句用于条件选择,其语法如下 if (条件表达式1) begin ……. end else if(条件表达式2) begin ……. end else ……….

  13. if-else 语句 if-else语句流程图

  14. if语句的嵌套 if(Ctrl) begin if(~Ctrl2) Mux=4'd2; else Mux=4'd1; end else begin if(~Ctrl2) Mux=4'd8; else Mux=4'd4; end

  15. case、casez和casex语句 case语句执行流程

  16. module ALU(A, B, OpCode, Z); input [3:0] A,B; input [1:2] OpCode; output [7:0] Z; reg [7:0] Z; parameter ADD_INSTR=2'b10, SUB_INSTR=2'b11, MULT_INSTR=2'b01, DIV_INSTR=2'b00; always @(A or B or OpCode) case(OpCode) ADD_INSTR: Z=A+B; SUB_INSTR: Z=A-B; MULT_INSTR: Z=A*B; DIV_INSTR: Z=A/B; default : Z=A+B; endcase endmodule case 语句实例

  17. case语句与综合电路

  18. Casez 和casex 语句 • Verilog HDL针对电路的特性提供了case语句的其它两种形式,即casez和casex,用来处理分支项中存在z和x的情况。 • casez语句用来处理分支项中存在高阻值z的情况 • casex语句则用来处理分支项中包括高阻值z或不定值x的情况。

  19. case语句中的无关位(casez, casex) • 在casez语句中,出现在case表达式和任意分支项表达式中的值z被认为是无关值,即那个位被忽略(不比较)。 • 在casex语句中,值x和z都被认为是无关位。 casex( Mask ) 4'b1??? : Dbus[4] = 0; 4'b01?? : Dbus[3] = 0; 4'b001? : Dbus[2] = 0; 4'b0001 : Dbus[1] = 0; defalut : Dbus=4’hf; endcase

  20. 条件语句的优先级 • case语句和if…else嵌套描述结构就有很大的区别。在Verilog语法中,if…else if…else语句是有优先级的 • 一般来说第一个if的优先级最高,最后一个else的优先级最低。 • case语句是“平行”的结构,所有的case的条件和执行都没有“优先级”。 • 建立优先级结构(优先级树)会消耗大量的组合逻辑,所以如果能够使用case语句的地方,尽量用case替换if...else结构。 Casez 和casex 语句

  21. 循环语句 • Verilog HDL中有四类循环语句,它们是: • forever循环 • repeat循环 • while循环 • for 循环

  22. forever循环 forever 语句; forever begin 多条语句 end 它用于“永久”反复执行某些语句,它与always块的不同之处在于它不能独立出现在代码中,必须在initial块中。

  23. Forever例子 • forever循环语句连续执行过程语句。为跳出这样的循环,中止语句可以与过程语句共同使用。 • 同时,在过程语句中必须使用某种形式的时序控制,否则, forever循环将在0时延后永远循环下去。 initial begin Clock = 0; # 5; forever #10 Clock = ~Clock; end

  24. for 循环 for(表达式1,表达式2,表达式3) 语句; for(表达式1,表达式2,表达式3) begin 多条语句 end; • for(initial_assignment ; condition ; step_assign) • procedural_statement • 一个for循环语句按照指定的次数重复执行过程赋值语句若干次。 • 初始赋值initial_assignment给出循环变量的初始值。 • condition条件表达式指定循环条件; • step_assign给出要修改的赋值,通常为增加或减少循环变量计数。

  25. for循环例子 moduleram(addr, din, nrw, dout); input [6:0] addr; input [7:0] din; //数据宽度8位 input nrw; output [7:0] dout; reg [7:0] dout; parameter mem_size=128; //数据深度128位 reg [7:0] mem[mem_size-1:0]; integer I; initial //只执行一次 for (i=0; i<mem_size; i=i+1) //for循环 mem[i]=i; //为mem中的每一个存储单元赋初始值 //通常用在测试代码中 always @(addr,nrw) if (nrw) mem[addr]=din; else dout=mem[addr]; endmodule

  26. 编译预处理语句 与C语言类似,编译(compile)就是把Verilog语言编写的代码变成计算机可以识别的二进制代码的过程。常规的编译过程可以分为五个阶段:词法分析、语法分析、中间代码生成、代码优化和目标代码生成。 对电路模块进行仿真时,对于诸如modelsim这类仿真器,首先都需要对Verilog代码进行编译,生成目标代码,然后才能执行具体的仿真操作。 Verilog语言的编译分为编译预处理和正式编译两个阶段,编译系统中的编译预处理模块根据Verilog代码中的预处理命令对源代码进行适当的处理(例如根据编译条件而舍弃对部分内容的编译),然后才对源代码进行的正式编译,将源代码转换为目标代码。  Verilog语言可以提供多个预编译命令,常用的包括宏定义、文件包含、条件编译三种编译预处理命令。

  27. 预编译指令 • (`)符号(对应的是键盘左上角第二行第一个键)说明一个编译指令 • 编译指令一直保持有效指导被覆盖或解除 • `resetall复位所有的编译指令为缺省值,应该在其他编译指令前使用

  28. 宏定义`define Verilog中的宏定义是用一指定的标识符(即宏名)来代表一个字符串,它的一般形式为: `define 标识符 字符串 例如: `define DWORDSIZE 32 module … reg [`DWORDSIZE-1:0] data; … 编译预处理过程中,凡是出现DWORDSIZE的地方都用常量32替换。如果DWORDSIZE的值有所变化,只需修改宏定义语句即可,这样有助于程序的调试和移植。

  29. 【例题9.7】简单算术逻辑单元ALU 下面是一个简单的算术逻辑单元,采用define进行了宏定义,增强了代码的可读性。 `define add 3'd0 `define minus 3'd1 `define band 3'd2 `define bor 3'd3 `define bnot 3'd4 module alu(out,opcode,a,b); output[7:0] out; reg[7:0] out; input[2:0] opcode; input[7:0] a,b; always@(opcode or a or b) begin case(opcode) `add: out = a+b; `minus: out = a-b; `band: out = a&b; `bor: out = a|b; `bnot: out=~a; default: out=8'hx; endcase end endmodule

  30. 9.3.2 文件包含处理`include 文件包含是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另一个Verilog语言的源代码文件嵌入正在进行预处理的源程序中的相应位置上,一般形式为: `include “文件名”

  31. 【例题9.8】 `include的应用 在模块cnt.v中定义了一个3位二进制计数器,模块clk_div.v中定义了名为一个clk_div的模块,它的功能是将输入时钟进行8分频,它调用了cnt.v中定义的计数器。 仿真器对clk_div.v进行编译后可以得到如下的代码: 文件cnt.v中的代码: module cnt(clk, rst, dout); input clk,rst; output [2:0] dout; reg [2:0] dout; always@(posedge clk or negedge reset) if(!reset) dout<=0; else if(dout==7) dout<=0; else dout<=dout+1; Endmodule 文件clk_div.v中的代码: `include “cnt.v” module clk_div(clk,reset,clk_out); input clk,reset; output clk_out; wire [2:0] dout; assign clk_out=dout[2]; cnt u1(clk,reset,dout); endmodule module cnt8(clk, rst, dout); input clk,rst; output [2:0] dout; reg [2:0] dout; always@(posedge clk or negedge reset) if(!reset) dout<=0; else if(dout==7) dout<=0; else dout<=dout+1; endmodule module clk_div(clk,reset,clk_out); input clk,reset; output clk_out; wire [2:0] dout; assign clk_out=dout[2]; cnt u1(clk,reset,dout); endmodule

  32. 作业及实验二 • 任务:设计并/串变换电路 (书中10.3) • 编写RTL代码,仿真,查看波形。(作业,实验前请做好,4月18日前emailto weiguo@tju.edu.cn, 并带到实验室。) • FPGA及其开发板NEXY3(实验主要内容) • 电路功能说明 采用同步电路结构、同步复位方式。信号定义如下: • din :8位并行输入数据 • dout :1位串行输出数据 • clk : 时钟,上升沿触发。 • reset : 同步复位 • en: 使能 • load: 并行输入控制 在clk 上升沿到来时,en&load = 1, 并行写入数据 在clk 上升沿到来时,en= 1,load = 0, 串行输出数据

  33. 实验二: 基于FPGA的设计实现 • Lab 1: 2输入逻辑门的设计与实现 • Lab 2: 并/串变换电路 • 实验目标: • 使用ISE软件设计 • 学会程序下载

More Related