OpenRisc-37-OpenRISC的CPU&core的整体架构分析
引言
前面我们分析了ORPSoC的整体架构,并对其子系统进行了深入的分析和了解。但对于ORPSoC的核心模块or1200_top及其内部的core--or1200_cpu模块却鲜有涉及,算是ORPSoC分析的盲区,也是蒙在我心里的一片乌云。
本小结就对这两个模块的整体架构进行分析,扫除这块所谓的‘盲区’和‘乌云’。
1,a general picture
按照惯例,还是先对这两个模块有一个感性认识。下面就是or1200_top和or1200_cpu的模块连接图。
CPU模块:or1200_top
core模块:or1200_cpu
2,CPU整体架构
1>模块接口
下面就是CPU的实际模块接口图,从中我们可以清晰的看到一个CPU的外部接口。
2>模块整体架构图
上面我们了解了CPU的模块接口,但是其接口比较多,我们需要对这些接口进行分类,画出其接口简图,如下:
从中我们可以看出CPU与外部进行数据交换和控制的接口,以及其模块组成。
经过分析对应的RTL代码,我们可以知道:默认配置下,具有一个一路直接映射的8KB数据cache和一个一路直接映射的8KB指令cache,Cache line长度为16-byte,两个cache都是物理索引(physically tagged)。默认配置下支持MMU,其由一个64-entry hash,1-way direct-mapped的数据TLB和指令TLB组成。此外,用调式单元可实现实时调试,tick timer,PIC,和电源管理。
3>深入分析
1》数据流图
上面介绍的只是CPU的概要情况,为了便于理解,我们需要弄清楚CPU的数据流向,掌握了数据在CPU内部的流动情况,我们就会有更清晰的认识,毕竟CPU还是数据驱动的东西。经过阅读or1200_top模块相关RTL的code,我画了or1200_top模块的逻辑上的数据流图,如下:
2》分析
仔细分析上图。整个流向就是箭头的方向(自下而上)。下面我就以load/stor指令的执行过程来说明:
假如core要执行load指令,就以bootrom.S中的最后一条指令为例:l.lbz r3,r4,0x2
a,指令含义
我先说一下这条指令的含义。通过查手册,可知,这条指令的format是:
l.lbz rD,I(rA)
其含义是:
EA ← exts(Immediate) + rA[31:0]
rD[7:0] ← (EA)[7:0]
rD[31:8] ← 0
总体含义是将内存的一个字节的数据load到通用寄存器中,其具体操作过程是,将立即数0x02先进行0扩展,再与r4里面的值相加得到有效地址EA(注:这个地址就是虚拟内存地址,注意这个地址是虚拟地址,不是物理地址),然后将内存地址为EA[7:0]处的数据load到寄存器r3的低8位中,高位补0。
b,执行过程
core取得这条指令后,计算出虚拟地址,经dmmu模块,得到物理地址,根据物理地址从qmem(相当于一级cache)读取数据,如果出现miss,就是cache miss异常,异常处理会从内存中读取数据放到stor buff(相当于三级cache)和data cache(相当于二级cache),异常处理完成后,再重新执行这条指令,就能读到数据。
当然,如果dmmu中没有对应的物理地址,就是TLB miss,产生一个TLB miss异常,core jump到异常入口处取指,这个过程我之前介绍过,具体过程,这里就不展开阐述。
c,stor
stor指令与load指令执行过程类似。
3,core整体架构
上面我们分析了CPU的架构,并介绍了其数据流向,下面我说一下core的整体架构。
OpenRISC 1200 是OpenRISC 1000 处理器家族的一个实现版本。
OR1200是 32-bit 标量 RISC架构,Harvard 结构, 5级 integer流水线, 支持MMU,还具有DSP能力。
关于architecture是john von neumann,还是harvard,还是modify harvard,还是princeton ,我觉得争论这个的意义不大,其实在一个现实的core的实现中,没有一个明显的界线,一切以提高性能,降低功耗,减小面积等等这些更实际的指标为基准。所以还是那句话“不管是黑猫,白猫,只要能抓住老鼠,就是好猫”。
1>模块接口
下面是core的接口,从中我们可以了解其具体的接口的名称,从名称中我们可以大概了解其与外部的数据及控制交换通路。
2>整体架构
说到core的架构,首先必须要把官方的架构图放到这里,如下:
3>分析
1》架构图
上面的图我就不说什么了,可以阅读相关的文档了解其大概情况。上面的图太粗糙了,为了介绍core的工作机制,我们需要更深入的分析,这就需要阅读其对应的RTL代码。
经分析,or1200_cpu这个核心中的核心的结构图,如下:
2》分析
上图是一个标准的computer architecture结构图。上面一部分是控制通路,下面一部分是数据通路。
一目了然。
4,小结
终于扫除了最后的盲区!
本小节分析了CPU和core的架构,自此,我们对整个ORPSoC的project有了一个初步的,完整的了解,对整个系统(APP+linux/eCos+FPGA+SoC+IPcore+CPU+core)都一一作了分析,不仅如此,我们还写了属于自己的IPCORE和其driver并作了验证,此外我们还测试验证了vga等ORPSoC之外的开源ipcore。
现在再返回头来看ORPSoC的整体模块连接图,我想,就没有‘乱七八糟’的感觉了吧,代替的应该是是‘一览众山小’吧。
“千里之行始于足下”,路还很远,move on.
5,参考文献
1,arch-manual-1.0
2,ORPSoC RTL code
OpenRisc-37-OpenRISC的CPU&core的整体架构分析的更多相关文章
- WebRTC音视频引擎研究(1)--整体架构分析
WebRTC技术交流群:234795279 原文地址:http://blog.csdn.net/temotemo/article/details/7530504 1.WebRTC目的 ...
- 转: WebRTC音视频引擎研究(1)--整体架构分析
转自: http://blog.csdn.net/temotemo/article/details/7530504 目录(?)[+] WebRTC技术交流群:234795279 原文地址:ht ...
- Tomcat整体架构分析
下面让我们来看看Tomcat容器的整体结构: 本文的目的是覆盖这张图中所涉及的主要请求处理组件.而上图中的一些高级主题如集群和安全则不是在本文讨论的范围之内. 本图中,Service, Host, C ...
- Spark系列(四)整体架构分析
架构流程图 说明 Driver端流程说明(Standalone模式) 使用spark-submit提交Spark应用程序Application. 通过反射的方式创建和构造一个DriverActor进 ...
- MapReduce整体架构分析
继前段时间分析Redis源代码一段时间之后.我即将開始接下来的一段技术学习的征程.研究的技术就是当前很火热的Hadoop,可是一个Hadoop生态圈是很庞大的.所以首先我的打算是挑选当中的一部分模块, ...
- 一步步去阅读koa源码,整体架构分析
阅读好的框架的源码有很多好处,从大神的视角去理解整个框架的设计思想.大到架构设计,小到可取的命名风格,还有设计模式.实现某类功能使用到的数据结构和算法等等. 使用koa 其实某个框架阅读源码的时候,首 ...
- 使用performance monitor 查看 每一个cpu core的cpu time
使用performance monitor 查看 每一个cpu core的cpu time: 打开performance monitor,添加 counter 如下 运行一段cpu bound 的代码 ...
- Linux上获取CPU Core个数的实现
Linux上获取CPU Core个数的实现 可以通过多种手段取得CPU Core的个数,如: 1) 调用系统提供的函数get_nprocs(),可以在头文件sys/sysinfo.h中发现它 2) 借 ...
- PULPino datasheet中文翻译并给了部分论文注释(前四章:Overview、Memory Map、CPU Core、Advanced Debug Unit)
参考: (1).PULPino datasheet:https://github.com/pulp-platform/pulpino/blob/master/doc/datasheet/datashe ...
随机推荐
- 优秀个人免费私有云OwnCloud 8.0终于发布 - 亮眼新功能初探简介
OwnCloud是一个基于Linux的私有云开源项目,用户可以免费使用它来搭建自己的私有云来进行文件和多媒体等的分享. 本人有幸在大概一年多前因为项目需要而接触和使用到OwnCloud,但不幸的是当时 ...
- 快速构建Windows 8风格应用24-App Bar构建
原文:快速构建Windows 8风格应用24-App Bar构建 本篇博文主要介绍构建AppBar基本步骤.如何构建AppBar.如何在AppBar中构建上下文命令.如何在AppBar中构建菜单.如何 ...
- linuxsocket通信recv研究缓存机制
曾有过这样一个小疑问.当一个进程注册的插座后,,假设插座没有被调用recv函数接受包.能接受到数据包吗? 或者这样说,假设我的程序注冊了一个套接字去接受数据包,可是每收到一个数据包都须要非常长 ...
- CentOS上部署Apache、MySQL和PHP
centos上yum安装很方便,下面介绍编译安装的方式. 第一步要在CentOS上安装gcc.g++等开发工具 可以从系统光盘上安装,或者 #yum groupinstall "Develo ...
- 邮箱自动完成(jquary效果)
邮箱自动完成的效果在网站上大多都看过,但是质量参差不齐,今天突然在网上看到一篇博客,感觉这个插件很好,就想来写一下分享给大家! 效果图如下! 完整demo代码如下: <!DOCTYPE html ...
- Linux Shell脚本入门--Uniq命令
uniq uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用.也就是说,为了使uniq起作用,所有的重复行必须是相邻的. uniq语法 [root@www ~]# uniq [ ...
- ps入门教程:裁剪工具、修复画笔工具、图章工具的使用
本节课程主要内容:学习裁剪工具.污点修复画笔工具.修复画笔工具.修补工具.套索工具.红眼工具.仿制图章工具和图案图 章工具的应用.----------------------------------- ...
- 云优化的概念、Entity Framework 7.0、简单吞吐量压力测试
云优化的概念.Entity Framework 7.0.简单吞吐量压力测试 继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之 ...
- 一键部署mono 免费空间
一键部署mono 免费空间支持c# 再也不担心伙食费换空间了 一直以来 部署mono 都是很头疼的事情 因为是我在是不熟悉非win环境,今天偶然发现这个项目,挺好的,分享下 https://githu ...
- 多线程中lock用法的经典实例
多线程中lock用法的经典实例 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...