VerilogHDL及Modelsim仿真范益波
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog HDL
及Modelsim仿真
范益波
Acknowledgment
• This slides is revised from “Verilog HDL基 础语法入门” by夏宇闻
Outline
• • • • • • Verilog 简介 简单的 Verilog HDL 模块 Verilog 语法要点 Verilog 的逻辑值和数据类型 存储器及有限状态机建模 可综合风格的Verilog
举例1
例[2.1.1]:
module adder ( count,sum,a,b,cin ); input [2:0] a,b; //声明输出信号equal input cin; //声明输入信号 output count; output [2:0] sum; assign {count,sum}=a+b+cin; endmodule 这个例子描述了一个三位的加法器。从例子中可以看 出 整 个 Verilog HDL 程 序 是 嵌 套 在 module 和 endmodule声明语句里的。
标识符
• 所谓标识别符就是用户为程序描述中的Verilog 对象所起的名字。 • 标识符必须以英语字母(a-z, A-Z)起头,或者 用下横线符( _ )起头。其中可以包含数字、$ 符和下横线符。 • 标识符最长可以达到1023个字符。 • 模块名、端口名和实例名都是标识符。 • Verilog语言是大小写敏感的,因此sel 和 SEL 是两个不同的标识符。
编译引导语句: `include
使用`include 编译引导,在编译时能把其指定的整 个文件包括进来一起处理
举例说明:
`include “global.v” `include “parts/counter.v” `include “../../library/mux.v”
合理地使用 `include 可以使程序简洁、清晰、条理 清楚、易于查错。
编译引导语句: `define
使用`define 编译引导能提供简单的文本替代功能 `define <宏名> <宏文本> 在编译时会用宏文本来替代源代码中的宏名。 合理地使用`define可以提高程序的可读性
举例说明:
`define on 1’b1 `define off 1’b0 `define and_delay #3 在程序中可以用有含义的文字来表示没有意思的数码提高了程序 的可读性,在程序中可以用 `on, `off, `and_delay 分别表 示 1,0,和 #3 。
Testedmd m (.in1(ina), .out2(outb) ); //被测模块的实例引用 initial begin ….; ….; …. endmodule end .in2(inb), .out1(outa),
//记录输出和响应
测试模块中常用的过程块
initial always 所有的过程块都 在0时刻同时启 动;它们是并行 的,在模块中不 分前后。 initial块 只 执行一次。一般 只在测试模块中 使用 always块 只 要符合触发条件 可以循环执行。
举例2
例[2.1.2]: module compare ( equal,a,b ); output equal; input [1:0] a,b; assign equal=(a==b)?1:0; /*如果两个输入信号相等,输出为1。否则为0*/ endmodule
这个程序描述了一个比较器.在这个程序中 ,/*........*/和//.........表示注释部分,注释只 是为了方便程序员理解程序,对编译是不起作用的。
上述程序例子通过另一种方法描述了一个三态门。 在这个例子中存在着两个模块:模块trist1调用模块 mytri 的实 例元件。通过这种结构性模块构造可构成特大型模块。
简单举例后的小结
• 整 个 Verilog HDL 程 序 是 嵌 套 在 module 和 endmodule声明语句里的。 • 每个模块要进行端口定义 , 并说明输入输出口 , 然 后对模块的功能进行行为逻辑描述。 • Verilog HDL程序是由模块构成的。模块是可以进 行层次嵌套的。 • 除了endmodule(及后面会学到的initial,end等 )语句外,每个语句和数据定义的最后必须有分号 • 可以用/*.....*/和//...对Verilog HDL程序的任 何部分作注释。
什么是verilog
• Verilog是一种硬件设计语言(Hardware Description Language, HDL) • 主要用于数字逻辑电路设计 • 跟VHDL类似
Verilog与C语言的关系
• Verilog HDL作为一种高级的硬件描述编程语言, 有着类似C语言的风格。其中有许多语句如:if语 句、case语句等和C语言中的对应语句十分相似。 如果读者已经掌握C语言编程的基础,那么学习 Verilog HDL并不困难,我们只要对Verilog HDL 某些语句的特殊方面着重理解,并加强上机练习 就能很好地掌握它,利用它的强大功能来设计复 杂的数字逻辑电路。 • 但是注意:Verilog是硬件设计语言,跟软件设计 有本质区别
• Cadence的NC-Verilog • Synopsys的VCS
Outline
• • • • • • Verilog 简介 简单的 Verilog HDL 模块 Verilog 语法要点 Verilog 的逻辑值和数据类型 存储器及有限状态机建模 可综合风格的Verilog
Verilog与C的主要不同点
模块的测试:基本概念
被测模块
激励和控 制信号
输出响应 和验证
测试模块的常见形式
module t; reg …; //被测模块输入/输出变量类型定义 wire…; //被测模块输入/输出变量类型定义 initial begin …; …; …; end … …//产生测试信号 always #delay begin …; end … …//产生测试信号
建立时钟
虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。 简单的对称方波时钟:
reg clk;
always begin
#period/2 clk=0; #period/2 clk=1;
end
仿真工具简介
• Mentor公司的ModleSim
– Learn from the ‘help’ manual of the software – Learn from some teaching books
门级/结构级:
用实例引用的Verilog模块表示
版图布局/物理级:
用几何形状来表示
综合后仿真
布局布线
Verilog的层次性架构
• 一个复杂电路的完整Verilog HDL模型是由若个 Verilog HDL 模块构成的,每一个模块又可以由 若干个子模块构成。
–利用Verilog HDL语言结构所提供的这种功能就可以构 造一个模块间的清晰层次结构来描述极其复杂的大型 设计。
特殊符号 “#”
特殊符号 “#” 常用来表示延迟:
在过程赋值语句时表示延迟。 例 : initial begin #10 rst=1; #50 rst=0; end 在门级实例引用时表示延迟。 例:not #1 not1(nsel, sel); and #2 and2(a1, a, nsel);
• Verilog HDL行为描述语言作为一种结构化和过程 性的语言,其语法结构非常适合于算法级和RTL 级的模型设计。
Outline
• • • • • • Verilog 简介 简单的 Verilog HDL 模块 Verilog 语法要点 Verilog 的逻辑值和数据类型 存储器及有限状态机建模 可综合风格的Verilog
• Verilog 有许多语法规则与 C 语言一致,但与 C 语言有根本的区别:
– 并行性 – 块的含义: initial 块 和 always块 – 两种赋值语句: 阻塞赋值 “=” 非阻塞赋值 “〈= ”
整数和实常数
整数可以标明位数也可以不标明位数,表示方法: 《位数》‘《基数》《值》 其中《位数》表明该数用二进制的几位来表示 《基数》可以是二(b)、八(O)、十(d)或 十六(h)进制 《数值》可以是所选基数的任何合法的值包括 不定值 x 位和高阻值 z。 如:64‘hff01 8’b1101_0001 ‘h83a 实常数可以用十进制表示也可以用科学浮点数表示,如: 32e-4 (表示0.0032) 4.1E3( 表示 4100)
-------------------------------------------------------
例: initial $monitor($time,,”a=%b, b=%b”, a, b);
//每当a 或b值变化时该系统任务都显示当前的仿真时刻并分别用二进制 和十六进制显示信号a和 b的值
如何描述激励信号
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 endmodule
举例3
例[2.1.3]:
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具有不同的抽象级别
• 系统级(system): 用高级语言结构实现设计模 块的外部性能的模型。
• 算法级(algorithmic): 用高级语言结构实现设计 算法的模型。 • RTL级(Register Transfer Level): 描述数据在 寄存器之间流动和如何处理这些数据的模型。
编译引导语句
编译引导语句用主键盘左上角小写键 “ ` ” 起头 用于指导仿真编译器在编译时采取一些特殊处理 编译引导语句一直保持有效,直到被取消或重写 `resetall 编译引导语句把所有设置的编译引导恢复到 缺省状态 常用的编译引导有: a) `define b) `include c) `timescale ……..
合法和非法标识符举例
• 合法的:
–shift_reg_a –busa_index –bus263
• 非法的:
– 34net //不能用数字开头 – a*b_net //不能含有非字母符号* – n@263 //不能含有非字母符号@
$<标识符>
‘$’ 符号表示 Verilog 的系统任务和函数 常用的系统任务和函数有下面几种: 1) $time //找到当前的仿真时间 2) $display, $monitor //显示和监视信号值的变化 3) $stop //暂停仿真 4) $finish //结束仿真
编译引导语句: `timescale
`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); …… endห้องสมุดไป่ตู้odule
• 可综合 • 相对高层的描述
• 门级(gate-level): 描述逻辑门以及逻辑门之间 的连接的模型。
模块的抽象及 数字电路的基本设计流程
技术指标:
用文字表示 用算法表示 用高级行为的Verilog模块表示
RTL design 综合前仿真 逻辑综合
RTL/功能级:
用可综合的Verilog模块表示
及Modelsim仿真
范益波
Acknowledgment
• This slides is revised from “Verilog HDL基 础语法入门” by夏宇闻
Outline
• • • • • • Verilog 简介 简单的 Verilog HDL 模块 Verilog 语法要点 Verilog 的逻辑值和数据类型 存储器及有限状态机建模 可综合风格的Verilog
举例1
例[2.1.1]:
module adder ( count,sum,a,b,cin ); input [2:0] a,b; //声明输出信号equal input cin; //声明输入信号 output count; output [2:0] sum; assign {count,sum}=a+b+cin; endmodule 这个例子描述了一个三位的加法器。从例子中可以看 出 整 个 Verilog HDL 程 序 是 嵌 套 在 module 和 endmodule声明语句里的。
标识符
• 所谓标识别符就是用户为程序描述中的Verilog 对象所起的名字。 • 标识符必须以英语字母(a-z, A-Z)起头,或者 用下横线符( _ )起头。其中可以包含数字、$ 符和下横线符。 • 标识符最长可以达到1023个字符。 • 模块名、端口名和实例名都是标识符。 • Verilog语言是大小写敏感的,因此sel 和 SEL 是两个不同的标识符。
编译引导语句: `include
使用`include 编译引导,在编译时能把其指定的整 个文件包括进来一起处理
举例说明:
`include “global.v” `include “parts/counter.v” `include “../../library/mux.v”
合理地使用 `include 可以使程序简洁、清晰、条理 清楚、易于查错。
编译引导语句: `define
使用`define 编译引导能提供简单的文本替代功能 `define <宏名> <宏文本> 在编译时会用宏文本来替代源代码中的宏名。 合理地使用`define可以提高程序的可读性
举例说明:
`define on 1’b1 `define off 1’b0 `define and_delay #3 在程序中可以用有含义的文字来表示没有意思的数码提高了程序 的可读性,在程序中可以用 `on, `off, `and_delay 分别表 示 1,0,和 #3 。
Testedmd m (.in1(ina), .out2(outb) ); //被测模块的实例引用 initial begin ….; ….; …. endmodule end .in2(inb), .out1(outa),
//记录输出和响应
测试模块中常用的过程块
initial always 所有的过程块都 在0时刻同时启 动;它们是并行 的,在模块中不 分前后。 initial块 只 执行一次。一般 只在测试模块中 使用 always块 只 要符合触发条件 可以循环执行。
举例2
例[2.1.2]: module compare ( equal,a,b ); output equal; input [1:0] a,b; assign equal=(a==b)?1:0; /*如果两个输入信号相等,输出为1。否则为0*/ endmodule
这个程序描述了一个比较器.在这个程序中 ,/*........*/和//.........表示注释部分,注释只 是为了方便程序员理解程序,对编译是不起作用的。
上述程序例子通过另一种方法描述了一个三态门。 在这个例子中存在着两个模块:模块trist1调用模块 mytri 的实 例元件。通过这种结构性模块构造可构成特大型模块。
简单举例后的小结
• 整 个 Verilog HDL 程 序 是 嵌 套 在 module 和 endmodule声明语句里的。 • 每个模块要进行端口定义 , 并说明输入输出口 , 然 后对模块的功能进行行为逻辑描述。 • Verilog HDL程序是由模块构成的。模块是可以进 行层次嵌套的。 • 除了endmodule(及后面会学到的initial,end等 )语句外,每个语句和数据定义的最后必须有分号 • 可以用/*.....*/和//...对Verilog HDL程序的任 何部分作注释。
什么是verilog
• Verilog是一种硬件设计语言(Hardware Description Language, HDL) • 主要用于数字逻辑电路设计 • 跟VHDL类似
Verilog与C语言的关系
• Verilog HDL作为一种高级的硬件描述编程语言, 有着类似C语言的风格。其中有许多语句如:if语 句、case语句等和C语言中的对应语句十分相似。 如果读者已经掌握C语言编程的基础,那么学习 Verilog HDL并不困难,我们只要对Verilog HDL 某些语句的特殊方面着重理解,并加强上机练习 就能很好地掌握它,利用它的强大功能来设计复 杂的数字逻辑电路。 • 但是注意:Verilog是硬件设计语言,跟软件设计 有本质区别
• Cadence的NC-Verilog • Synopsys的VCS
Outline
• • • • • • Verilog 简介 简单的 Verilog HDL 模块 Verilog 语法要点 Verilog 的逻辑值和数据类型 存储器及有限状态机建模 可综合风格的Verilog
Verilog与C的主要不同点
模块的测试:基本概念
被测模块
激励和控 制信号
输出响应 和验证
测试模块的常见形式
module t; reg …; //被测模块输入/输出变量类型定义 wire…; //被测模块输入/输出变量类型定义 initial begin …; …; …; end … …//产生测试信号 always #delay begin …; end … …//产生测试信号
建立时钟
虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。 简单的对称方波时钟:
reg clk;
always begin
#period/2 clk=0; #period/2 clk=1;
end
仿真工具简介
• Mentor公司的ModleSim
– Learn from the ‘help’ manual of the software – Learn from some teaching books
门级/结构级:
用实例引用的Verilog模块表示
版图布局/物理级:
用几何形状来表示
综合后仿真
布局布线
Verilog的层次性架构
• 一个复杂电路的完整Verilog HDL模型是由若个 Verilog HDL 模块构成的,每一个模块又可以由 若干个子模块构成。
–利用Verilog HDL语言结构所提供的这种功能就可以构 造一个模块间的清晰层次结构来描述极其复杂的大型 设计。
特殊符号 “#”
特殊符号 “#” 常用来表示延迟:
在过程赋值语句时表示延迟。 例 : initial begin #10 rst=1; #50 rst=0; end 在门级实例引用时表示延迟。 例:not #1 not1(nsel, sel); and #2 and2(a1, a, nsel);
• Verilog HDL行为描述语言作为一种结构化和过程 性的语言,其语法结构非常适合于算法级和RTL 级的模型设计。
Outline
• • • • • • Verilog 简介 简单的 Verilog HDL 模块 Verilog 语法要点 Verilog 的逻辑值和数据类型 存储器及有限状态机建模 可综合风格的Verilog
• Verilog 有许多语法规则与 C 语言一致,但与 C 语言有根本的区别:
– 并行性 – 块的含义: initial 块 和 always块 – 两种赋值语句: 阻塞赋值 “=” 非阻塞赋值 “〈= ”
整数和实常数
整数可以标明位数也可以不标明位数,表示方法: 《位数》‘《基数》《值》 其中《位数》表明该数用二进制的几位来表示 《基数》可以是二(b)、八(O)、十(d)或 十六(h)进制 《数值》可以是所选基数的任何合法的值包括 不定值 x 位和高阻值 z。 如:64‘hff01 8’b1101_0001 ‘h83a 实常数可以用十进制表示也可以用科学浮点数表示,如: 32e-4 (表示0.0032) 4.1E3( 表示 4100)
-------------------------------------------------------
例: initial $monitor($time,,”a=%b, b=%b”, a, b);
//每当a 或b值变化时该系统任务都显示当前的仿真时刻并分别用二进制 和十六进制显示信号a和 b的值
如何描述激励信号
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 endmodule
举例3
例[2.1.3]:
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具有不同的抽象级别
• 系统级(system): 用高级语言结构实现设计模 块的外部性能的模型。
• 算法级(algorithmic): 用高级语言结构实现设计 算法的模型。 • RTL级(Register Transfer Level): 描述数据在 寄存器之间流动和如何处理这些数据的模型。
编译引导语句
编译引导语句用主键盘左上角小写键 “ ` ” 起头 用于指导仿真编译器在编译时采取一些特殊处理 编译引导语句一直保持有效,直到被取消或重写 `resetall 编译引导语句把所有设置的编译引导恢复到 缺省状态 常用的编译引导有: a) `define b) `include c) `timescale ……..
合法和非法标识符举例
• 合法的:
–shift_reg_a –busa_index –bus263
• 非法的:
– 34net //不能用数字开头 – a*b_net //不能含有非字母符号* – n@263 //不能含有非字母符号@
$<标识符>
‘$’ 符号表示 Verilog 的系统任务和函数 常用的系统任务和函数有下面几种: 1) $time //找到当前的仿真时间 2) $display, $monitor //显示和监视信号值的变化 3) $stop //暂停仿真 4) $finish //结束仿真
编译引导语句: `timescale
`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); …… endห้องสมุดไป่ตู้odule
• 可综合 • 相对高层的描述
• 门级(gate-level): 描述逻辑门以及逻辑门之间 的连接的模型。
模块的抽象及 数字电路的基本设计流程
技术指标:
用文字表示 用算法表示 用高级行为的Verilog模块表示
RTL design 综合前仿真 逻辑综合
RTL/功能级:
用可综合的Verilog模块表示