第一章
1.软核处理器概念:
2.部分开源软核处理器:
①OR1200
......
第二章 实验环境搭建
本章做了两个实验:
1.在Linux环境下编写一个汇编文件Example.S,程序功能是将两个寄存器的值相加并存到被加寄存器中。将该汇编程序编译、链接成可执行文件,在OR1200模拟器OR1KSim中运行该可执行代码,观察结果。
2.创建一个OR1200运行的最小系统,在该系统中执行1中的可执行文件,使用仿真软件ModelSim观察结果。
【笔者决定暂不纠结于工具,因为有些太老了已经下载不了了,重要的是搞清楚实验步骤和原理】
2.1实验一
Step1.搭建实验环境。安装虚拟机工具并挂载ubuntu镜像,在ubuntu下安装针对目标平台的GNU工具链。
安装软件:VitualBox虚拟机工具和OR1200 Ubuntu镜像
Step2.编写Example.S汇编程序
Step3.编译Example.S得到Example.o。我们编写的汇编程序放置在Example.o的Section.text中。
Step4.建立链接描述脚本ram.ld,使得Section.text从地址0x100处开始放置,因为执行的第一条指令就是此地址的。执行下面的链接命令,得到可执行文件Example.or32。
Step5.编写makefile文件,规范化对源程序的编译链接过程。[makefile文件的编写方法见前几篇博客]
Step6.使用OR1KSim模拟器运行程序。
跟踪程序的执行信息并对其进行剖析,如下图
可以发现,执行完这段程序后,r1寄存器和r2寄存器的值都是0xa。
总结:该实验的目的是了解程序如何能在硬件上执行。过程是:将一段汇编代码在OR1200(的模拟器)中编译、链接并执行,跟踪执行过程和结果。实验环境是ubuntu,所需工具是gnu工具链。
2.2实验二
1.创建最小系统如下:
Step1.在ModleSim中建立工程min_or1200。将OR1200的所有Verilog文件加入其中。
Step2.新建测试平台(test bench)文件or1200_tb.v。只令时钟、复位信号有效,其余接口输入信号置0。
Step3.修改OR1200配置。通过注释和取消注释配置文件or1200_defines.v中的宏定义,保留需要的模块,去掉不需要的模块,以构建最小系统。
Step4.修改or1200_qmem.v。OR1200将从QMEM中读取指令、加载存储数据。
2.运行仿真
Step1.初始化QMEM,将可执行代码存入其中。修改文件or1200_spram_2048x32.v,在611行添加如下代码initial $readmemh(“mem.data”,mem); 表示从mem.data中读取数据初始化mem(QMEM)。
注意:mem.data不能是Example.or32的内容,因为后者是一个ELF格式的文件,需要操作系统来解释该文件。而上述1过程构建的最小系统是一个硬件裸机,也就是说当加电复位的时候CPU只知道从0x100处读入指令开始执行,其余什么也不知道。所以我们要手动把Example.or32中的可执行代码放到0x100处。
mem.data内容如下:
Step2.将mem.data复制到min_or1200工程的根目录,单击Simulate,选择or1200_tb作为测试平台,观察下面四个信号的波形(Add to wave)。
选择菜单Simulate->Run->Run-All开始仿真。显示波形如下:
3.自动化生成mem.data
如上2中所述的mem.data是我们手工编写的。实际该过程可由makefile自动完成。步骤为将Example.or32中的内容转化为二进制,再写入memdata即可。
总结:该实验通过配置创建了一个OR1200的最小系统,然后将实验1可执行代码存入cpu启动后首先读取的地址处,观察仿真结果。
思考心得:一段汇编程序,先编译成.o文件,将汇编码变成十六进制代码,然后链接成.or32文件,安排程序在内存中的存放位置,就可以执行了(但需要操作系统或加载器,因为.or32是一个ELF文件)。如果想在裸机上执行,要先知道该cpu加电后最先取哪个存储体的哪个地址的指令开始执行,然后把程序的十六进制代码放到该地址处即可。