• 《步步惊“芯”——软核处理器内部设计分析》前两章读书笔记


    第一章

    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.oSection.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.vOR1200将从QMEM中读取指令、加载存储数据。

    2.运行仿真

    Step1.初始化QMEM,将可执行代码存入其中。修改文件or1200_spram_2048x32.v,在611行添加如下代码initial $readmemh(“mem.data”,mem); 表示从mem.data中读取数据初始化memQMEM)。

    注意: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加电后最先取哪个存储体的哪个地址的指令开始执行,然后把程序的十六进制代码放到该地址处即可。

  • 相关阅读:
    JSP标准标签库(JSTL)--JSTL简介与安装
    JSP标签编程--简单标签
    Tomcat数据源
    Linux 更新vim
    perl 函数
    js 使用a标签 下载资源
    js arrayBuffer 字节序问题,小端法,大端法
    js 的 ArrayBuffer 和 dataView
    ajax 获取服务器返回的XML字符串
    遍历form表单里面的表单元素,取其value
  • 原文地址:https://www.cnblogs.com/zhouliyan/p/9996750.html
Copyright © 2020-2023  润新知