第6章Verilog设计验证和简单组合逻辑电路设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
则所有赋的值均不再存在。 可以对信号的某(确定)位、某些(确定)位或拼接的 信号,使用force和release赋值;但不能对信号的可变位 使用force和release 来赋值。 不能对寄存器类型的信号某位或某些位使用 assign 和 deassign 来赋值。
2018/10/16
www.cuit.edu.cn
Mentor公司产品,业界最优秀的HDL语言仿真器 唯一单核支持VHDL&Verilog混合仿真的仿真器,
是FPGA/ASIC设计的RTL&门级电路仿真首选
编译仿真速度快,编译与平台无关,便于保护IP
核
全面支持VHDL&Verilog语言的IEEE标准,支持
c/c++功能调用和调试
公司网站http://www.model.com/
的节点或测试模块中在多个地方被赋值的信号)进行赋值。 initial begin #10 assign top.dut.fsml.state_reg = `init_state;
2018/10/16 www.cuit.edu.cn 9
强制激励 字符串
#20 deassign top.dut.fsml.state_reg; end force 和 release 用于寄存器类型和网络连接类型(例如:门级扫 描寄存器的输出)的强制赋值,强制改写其它地方的赋值。
2018/10/16
www.cuit.edu.cn
4
模块的测试
测试模块中常用的过程块:
initial always
所有的过程块都 在0时刻同时启 动;它们是并行 的,在模块中不 分前后。 initial块 只 执行一次。 always块 只 要符合触发条件 可以循环执行。
2018/10/16
www.cuit.edu.cn
5
模块的测试
如何描述激励信号: 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
#10 data_bus = 8’h45;
#20 repeat (10) #10 data_bus = data_bus +1; #25 repeat (5) # 20 data_bus = data_bus <<1; #140 data_bua = 8’h0f; join
2018/10/16
endmodule
//这两个repeat开始执行时间不同,但能同时运行。
www.cuit.edu.cn 7
并行块
上面模块的仿真输出如下:
时间
0 10 30 40 45 50 60 65 70 2018/10/16
data_bus
8’b0000_0000 8’b0100_0101 8’b0100_0110 8’b0100_0111 8’b1000_1110 8’b1000_1111 8’b1001_0000 8’b0010_0000
www.cuit.edu.cn 14
end
2018/10/16
怎样使用任务 怎样使用任务
举例说明如何使用任务:
module bus_ctrl_tb; reg [7:0] data; reg data_valid, data_rd; cpu ul(data_valid,data,data_rd); initial begin cpu_driver (8’b0000_0000); cpu_driver (8’b1010_1010);
建立时钟
[例2]简单的带延迟的对称方波时钟:
reg clk; initial begin reg go; wire clk; nand #(period/2) ul (clk,clk,go);
clk=0;
#(period) forever
initial begin
go=0; #(period) go=1;
#(period+1) clk=1;
#(period/2-1) forever begin
initial begin
#(period/4+1) go=0; #(5*period/4-1) go=1;
#(period/4) clk=0;
#(3*period/4) clk=1; end
end
注:这两个时钟模型也有些不同,行为描述的模 型一开始就有确定的电平,而门级描述的模型有 延迟, 开始时电平是不确定的。
激励 信号
需要验证的 设计
简单的测试平台
激励信号
和用于验
证的结果 数据
2018/10/16
需要验证的 设计 复杂的测试平台
www.cuit.edu.cn
3
模块的测试
测试模块常见的形式: module t; reg …; //被测模块输入/输出变量类型定义 wire…; //被测模块输入/输出变量类型定义 initial begin …; …; …; end … …//产生测试信号 always #delay begin …; end … …//产生测试信号 Testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) ); //被测模块的实例引用 initial begin ….; ….; …. endmodule end //记录输出和响应
region或signal in design
• 在主窗口、波形窗口单击运行,默认运行100ns • Wave波形窗口中,在信号名称上面单击右键,
选择radix可选显示数据的进制
• 观察结果,完成仿真
2018/10/16 www.cuit.edu.cn 22
3.窗口功能简介
Main窗口 Structure窗口
nand #(period/2) ul (clk,clk,go);
initial begin go=0;
end
#(period/2) go=1;
end
注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟 模型产生的,则仿真器的性能就能得到提高。
2018/10/16 www.cuit.edu.cn 12
语法详细讲解
cpu_driver (8’b0101_0101);
end
2018/10/16 www.cuit.edu.cn 15
怎样使用任务
task cpu_driver;
input [7:0] data_in; begin
#源自文库0 data_valid=1;
wait(data_rd==1); #20 data=data_in;
8
8’b0010_0001 www.cuit.edu.cn
强制激励 在一个过程块中,可以用两种不同的方式对信号变量或表达式进行 连续赋值。 过程连续赋值往往是不可以综合的,通常用在测试模块中。 两种方式都有各自配套的命令来停止赋值过程。 两种不同方式均不允许赋值语句间的时间控制。
assign和deassign 适用于对寄存器类型的信号(例如:RTL级上
2018/10/16 www.cuit.edu.cn 18
2.基本仿真步骤
支持单个文件仿真和工程仿真 建立modelsim库,版本不同有区别 • 启动modelsim • 主窗口file/change Directory更改路径 • 创建工作库,默认为work
• 创建资源库
2018/10/16 www.cuit.edu.cn 19
语法详细讲解
cpu_data clk data_valid data_rd read_cpu_state
wait wait data1 data2 wait data3 data4 wait
2018/10/16
www.cuit.edu.cn
17
二、modelsim仿真软件使用简介 1.modelsim简介
编译源代码 • 默认被编译到work库
• 对verilog语言编译器支持增量编译模式,也就是
上次编译后修改过的部分会被编译,其他保持不 变,对大型设计来说可减少编译时间
• 主窗口compile/compile • 注意优化选项的设置
2018/10/16
www.cuit.edu.cn
20
启动仿真器 • 必须把激励源文件和设计的顶层文件放在
第6讲 Verilog设计验证及简 单组合逻辑电路设计
授课教师:邹兴平
电邮地址:zou_xingping@163.com
一、verilog设计的仿真验证 占据整个设计的60~70%的工作量,需要 很高的代码覆盖率,并不比设计可综合代 码简单
2018/10/16
www.cuit.edu.cn
2
测试平台的组成
显示当前设计的层次,颜色不同
Source窗口
主要用来显示和编辑源代码,提供了模板
Signals窗口
用来选择需要查看的当前层次的信号,监控仿真 时信号的变化,可手动强制改变信号的值
2018/10/16 www.cuit.edu.cn 23
Process窗口
2018/10/16 www.cuit.edu.cn 6
并行块
在测试块中常用到fork…join块。用并行块能表示以同一个时间起点算起的多个事
件的运行,并行地执行复杂的过程结构,如循环或任务。举例说明如下:
module inline_tb;
reg [7:0] data_bus;
initial fork data_bus= 8’b00;
wait(data_rd==0);
#20 data=8’hzz; #30 data_valid=0;
end
endtask
2018/10/16 endmodule www.cuit.edu.cn 16
怎样使用任务 怎样使用任务
在测试模块中使用任务可以提高程序代码的效率,可以用 任务把多次重复的操作包装起来。
initial begin
# 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q;
end
在以上两个例子中,在10到20 这个时间段内,网络或寄存器类 型的信号被强制赋值,而别处对该变量的赋值均无效。 force的赋值优先级高于assign。
11
建立时钟
虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面
三个例子分别说明如何在门级和行为级建立不同波形的时钟模型。 [例1] 简单的对称方波时钟: reg clk; reg go; wire clk;
always begin
#period/2 clk=0; #period/2 clk=1;
时间
80 85
data_bus
8’b0010_0010 8’b0100_0100
90
100 105 110 120 125 140
8’b0100_0101
8’b0010_0001 8’b0100_0110 8’b1000_1100 8’b1000_1110 8’b0001_1100 8’b0000_1111
同一个目录,并且都编译到WORK库中
• 双击work库中的激励文件,在工作取产生
一个sim标签和file标签,可以看到设计的 层次
2018/10/16
www.cuit.edu.cn
21
执行仿真 • 在主窗口选择view菜单,可以选择需要的窗口,
一般选择object和wave
• 在object中,右键选择add/wave/signal in
如果先使用assign,再使用force对同一信号赋值,则信号的值
2018/10/16
为force所赋 的值,www.cuit.edu.cn
10
语法详细讲解
强制激励 强制激励 当执行release后,则信号的值为assign所赋 的值。
如果用force对同一个信号赋了几次值,再执行release,
#(period/2) clk=!clk
end
end
注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平, 而门级描述的模型开始延迟有半个周期是不确定的。
2018/10/16 www.cuit.edu.cn 13
建立时钟
[例3]. 带延迟、头一个脉冲不规则的、占空比不为1的时钟:
reg clk; initial begin reg go; wire clk; nand #(3*period/4,period/4) ul(clk,clk,go);