北工大学实验学院(论文)
5 系统仿真
5.1 8位RISC整体设计与仿真
Quartus II软件中的电路图:
图5.1 顶层模块电路图
5.2 系统软件仿真
为了验证所设计的可行性,需要向InstMem中加入一些指令,通过观察运行后的寄存器堆和数据存储器中的数据来判定系统是否正常运行。下面是本系统向InstMem中加入的指令代码。加载指令的方式是通过MIF文件为instmem提供相应的初始化值。下面是本文用到的MIF文件。
DEPTH = 256; -- The size of data in bits WIDTH = 16; -- The size of memory in words
ADDRESS_RADIX = HEX; -- The radix for address values DATA_RADIX = BIN; -- The radix for data values CONTENT -- start of (address : data pairs) BEGIN
00 : 1000000010000000; -- lw r1 r0 0 01 : 1000000100000001; -- lw r2 r0 1 02 : 0000000000000000; -- nop 03 : 0000010100110000; -- r3 = r1 + r2 04 : 1010000110000100; -- store r3 r0 4 END;
第一条代码为一条load指令,从内存中加载一个数据至寄存器。根据本CPU的指令集,第一条指令的含义是将地址为[r0+1]的内存储存的值取出来,并储存于寄存器r1中,由于CPU初始状态下,寄存器r0中值为0,因此[r0+1]表
21
北工大学实验学院(论文)
示地址1,第一条指令实际上为将地址1的数据加载到寄存器r1中,同理第二条指令为地址为2的数据加载到r2中。
完成加载后,利用一个加法运算测试一下ALU性能,第三条代码是一条空指令,用于测试CPU停止运行的状态。第四条指令用于测试CPU的运算能力,实际含义为将r1中的值和r2进行加法运算,将结果储存到r3中。最后测试一条store指令,把r3中的值储存至内存地址为[r0+4]的内存中。下面看内存中的初始化值。
DEPTH = 256; -- The size of data in bits WIDTH = 8; -- The size of memory in words
ADDRESS_RADIX = HEX; -- The radix for address values DATA_RADIX = BIN; -- The radix for data values CONTENT -- start of (address : data pairs) BEGIN
00 : 00000001; -- memory address : data 01 : 00000010; 02 : 00000011; 03 : 00000100; 04 : 00000101; 05 : 00000110; 06 : 00000111; 07 : 00001000; END;
根据以上分析,按照上诉内存初始化值,执行完后,寄存器堆中各寄存器的值如下:
R0 = 0;r1 = 1;r2 = 2;r3 = 3;r4 = 0;r5 = 0;r6 = 0;r7 = 0; 同时内存中的值为:
DMem[0] = 1;DMem[1] = 2; DMem[2] = 3;DMem[3] = 4; DMem[4] = 3;DMem[5] = 6; DMem[6] = 7;DMem[7] = 8;
如果程序运行完后,寄存器堆中的值和内存中的值与上诉情况一致,则说明CPU电路正确运行了。在QUARTUS II 15.0中,集成了Modelsim 的接口,可以直接在QUARTUS II 开发环境中打开Modelsim 。在调用之前需要进行相
22
北工大学实验学院(论文)
关设置。主要设置内容如下。
(1)在开发环境左下角task栏中将下拉列表选项选为RTL Simulation,如图所示:
图5-2 RTL Simulation菜单
(2) 完成后双击“Edit Settings”打开下图所示窗口。在“Tool name”下拉列表中选择Modelsim-SE工具,下方Comple test bench单选框中选中。
图5-3 仿真工具编辑菜单
(3)然后点击右边Test Benches按钮。打开如下图所示窗口。该窗口表示需要用户添加TestBench文件。
23
北工大学实验学院(论文)
图5-4 添加TestBench
(4) 点击“New”按钮选择添加一个新的TestBench文件,弹出以下窗口。
图5-5 设置TestBench
这里在Test Bench Name栏填入编写的TestBench文件名。在Design instance name in test bench中填入待测试的模块文件名。在下方File name栏选择TestBench的目录。完成以上设置后点击“OK”。回到开发环境主界面,完成设置。 设置完成后就可以开始正式的仿真工作,在主界面左下方Task栏中双击RTL Simulation,便可自动开始仿真。仿真结果如下图所示。下面具体分析该波形。首先看数据输入模块的仿真波形。 下面是仿真后的运行结果:
24
北工大学实验学院(论文)
该图是运行后的内存中的数据。可以看到地址为6的地方,被正确的存入了数据5,符合程序运行结果。从内存来看,程序运行正常。
该图是运行后的寄存器堆中的数据。寄存器r0到r7的值分别为0 1 2 3 0 0 0 0。同样符合程序运行结果。从以上两个图像中可以看出程序运行正确。
5.3 硬件实物验证
通过了软件仿真,还需要经过FPGA实物验证,才能最终说明代码的可行性。因此本设计最后在FPGA硬件上进行了测试。本文用的硬件为Altera Cyclone IV EP4CE15F17C8,利用QUARTUS的集成工具In-System Sources and Probes Editor在线查看硬件实物的内存信息,从而确定CPU是否正常运行。下图为CPU电路烧写至FPGA中后,内存中的数据,可以看到内存中数据地址为4的地方,正确的被改写为了3,与预测一致,说明程序正确运行。
5.4 本章小结
本章主要介绍利用Modelsim 软件对系统进行RTL级别的功能验证以及利用FPGA芯片对CPU进行了实物验证。从两个方面的验证结果可以看出,系统输出波形正确,CPU运行后,寄存堆和内存中的数据与程序运行的应有结果一致。验证结果表明系统功能达到设计预期,设计正确。
25