当前位置: 首页 > news >正文

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

第一章

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

转载于:https://www.cnblogs.com/zhouliyan/p/9996750.html

相关文章:

  • etcd:从应用场景到实现原理的全方位解读
  • 一篇极好的Git 总结
  • java 实现 DES加密 解密算法
  • 卷积+池化+卷积+池化+全连接2
  • 【ABP框架系列学习】模块系统(4)
  • C++类的大小——sizeof(class)
  • 挑战练习12.3 更多对话框
  • php简单随机实现发红包程序
  • java变量学习
  • 增加索引
  • 关于梯度下降 - 线性回归的
  • ethereum Pet Shop
  • 事件机制
  • Hibernate 注解映射
  • Python基础4
  • 【node学习】协程
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • canvas 高仿 Apple Watch 表盘
  • ES6语法详解(一)
  • gulp 教程
  • HomeBrew常规使用教程
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JAVA_NIO系列——Channel和Buffer详解
  • Java读取Properties文件的六种方法
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Mysql数据库的条件查询语句
  • npx命令介绍
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 初识 beanstalkd
  • 回流、重绘及其优化
  • 利用DataURL技术在网页上显示图片
  • 目录与文件属性:编写ls
  • 如何在 Tornado 中实现 Middleware
  • 使用 Docker 部署 Spring Boot项目
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 通过git安装npm私有模块
  • 一些关于Rust在2019年的思考
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 白色的风信子
  • 选择阿里云数据库HBase版十大理由
  • ​Java并发新构件之Exchanger
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (2)Java 简介
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (八)Flask之app.route装饰器函数的参数
  • (力扣)循环队列的实现与详解(C语言)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)UDP基本编程步骤
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core与存储过程(一)
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded