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 ...
随机推荐
- 初识EPC
一.EPC定义 EPC=Event-driven Process Chain(事件驱动过程链) EPC建模方法最初由Keller, N¨uttgens和Scheer博士在1992年发表的Ereigni ...
- PHP 调用微信JS-SDK 开发详解 [网摘]
一:准备文件,并将文件置于网站根目录下 access_token.json {"access_token":"","expire_time" ...
- 模板专业化和模板偏特样片(template specialization and partial template specialization)
测试环境: win7 64 g++ 4.8.1 /*************************************************************************** ...
- elasticsearch集群搭建实例
elasticsearch集群搭建实例 下个月又开始搞搜索了,几个月没动这块还好没有落下. 晚上在自己虚拟机上搭建了一个简易搜索集群,分享一下. 操作系统环境: Red Hat 4.8.2-16 el ...
- [DevExpress]利用LookUpEdit实现类似自动提示效果
原文:[DevExpress]利用LookUpEdit实现类似自动提示效果 关键代码: public static void BindWithAutoCompletion(this LookUpEdi ...
- 关于 js 中的 call 和 apply使用理解
关于 js 中的 call 和 apply使用理解 在学习新的东西时候,碰到以前看过而又不理解,或则记忆不深的地方不妨回头看看书里知识点,有助于加深理解.正所谓--温故而知新. 废话不多说,直接上代码 ...
- DynamicResource与StaticResource的区别
原文:DynamicResource与StaticResource的区别 2008-06-20 12:16:12 静态资源在第一次编译后即确定其对象或值,之后不能对其进行修改.动态资源则是在运行时决定 ...
- postal邮件发送(三):以附件形式显示图片
前言 上篇提到如果邮件中有图片的话,可以使用 @Html.EmbedImage("~/Content/postal.png") 这种方式,但是经过测试发现,在outlook中如果有 ...
- idea中ajax中文乱码
case:@RequestMapping中添加 produces= "text/plain;charset=UTF-8", @RequestMapping(method = Req ...
- Visual Studio 当前不会命中断点的问题
这个问题一般有两个版本 1.当前不会命中断点,还没有为该文档加载任何符号. 2.当前不会命中断点,源代码与原始版本不同. 要解决第一个问题,就要了解一种文件格式“PDB(Program DataBas ...