从零开始设计CPU

CPU,中文全称为中央处理单元,简称处理器,是现代电子计算机的核心器件。如果你想了解一台计算机是如何构建并工作的,那么深入了解CPU的设计非常有用。不过,这个美好的愿望是否会遭遇“骨感”的现实呢?毕竟一谈及CPU,大家马上想到的是英特尔(Intel)、超微半导体(AMD)、苹果(Apple)、安谋(ARM)、高通(Qualcomm)这些国际知名公司生产的产品,进而认为CPU设计是一件遥不可及的事情,普通学习者要想掌握它简直就是天方夜谭。

那么CPU设计到底难不难呢?实话说,要做出具有世界一流水平的产品确实不容易。别看CPU个头不大,它却是一个复杂度极高的系统。设计CPU挑战的是一个团队进行复杂系统工程研发的能力。不过,从20世纪60年代第一款CPU问世至今,CPU设计所涉及的基本技术已经很成熟了。同时,自动化设计工具的水平也有了大幅度提升。普通学习者想在CPU设计领域初窥堂奥,不再是无法实现的梦想。

本书作者在给新入行的工程师进行培训以及给高校学生授课的过程中,得到的反馈却并不乐观。对于大多数新手来说,设计一个入门级的CPU还是很有难度的。结合我们在研发工作中的成长经历,以及在培训和教学过程中获得的反馈,我们认为最大的难点在于设计一个CPU需要综合掌握多方面的知识,而初学者往往在“综合”这个环节遇到了困难。毫不夸张地说,对于设计一个入门级CPU所需要的各方面知识,我们都能找出很多优秀的教材、讲义、论文、代码。如果仅仅把这些资料交给一个初学者,让他通过自学这些资料来设计CPU,那么能把CPU设计出来的只有少数“悟性高”的人。我们都知道,一个国家要想提高某项体育运动的水平,关键的因素是从事该项运动的人数足够多。同理,要想在信息技术的核心领域做到世界一流,没有一大批“懂行”的技术开发人员是很难实现的。面对当前急需芯片开发人才的形势,要想在短时间内培养出大量行业急需的高素质人才,仅仅指望学习者自身“悟性高”是行不通的,需要找到行之有效的学习和训练方法。

本书作者所在的龙芯团队自主研发CPU产品近20年,在CPU设计方面积累了丰富的实战经验。在本书中,我们将结合自身的研发实践,尽可能深入浅出地介绍如何从零开始一步步设计出一个入门级的CPU,以及在这个过程中应该掌握哪些知识、遵守哪些设计原则、规避哪些设计风险、使用哪些开发技巧。我们希望这些从工程实践中总结的经验能作为高校课程教学中知识讲授环节的有益补充,帮助更多初学者更快、更扎实地掌握CPU设计的知识,具备CPU设计能力。

本书的内容安排

本书分为三个部分。

第1~3章为第一部分,介绍业界进行CPU研发的过程以及硬件/云端平台、FPGA设计、Verilog等CPU设计中必要的基础知识。

第4~10章为第二部分。

在第二部分,我们从设计一个简单的单周期CPU开始,逐步引入流水线设计,添加指令,增加例外和中断的支持,并完成AXI总线接口、TLB MMU和高速缓存(Cache)的设计与实现,最终完成一个入门级CPU的设计。这样一个处理器核已经不再是用来玩“过家家”游戏的玩具,而是一个能够满足绝大多数实际的嵌入式应用场景需求、可以运行教学用的操作系统的真实产品。

第11章为第三部分,在这里,我们会对一些进阶设计内容给出建议,例如会介绍如何在第二部分完成的产品基础上添加少量的指令和功能,再在CPU上运行Linux内核。

各章的内容简要介绍如下。

第1章介绍CPU芯片产品的研发过程,使读者对CPU产品开发的全过程有初步的认识和了解,为后续各章的学习奠定基础。

第2章介绍硬件实验平台及FPGA设计流程,包括“龙芯CPU设计与体系结构教学实验系统”硬件实验平台的介绍,以及FPGA的一般设计流程和基于Vivado工具的FPGA设计流程。

第3章介绍数字逻辑电路设计。这一章会结合CPU的实际设计开发工作,对如何使用Verilog代码进行数字逻辑电路设计给出建议,并给出CPU设计中常用的数字逻辑电路的可综合Verilog描述。此外,这一章还会介绍数字逻辑电路功能仿真中常见的错误及其调试方法。对于缺少电路仿真调试经验的初学者来说,这部分内容具有很好的指导作用。

第4章介绍简单流水线CPU设计。这一章将从一个支持19条指令的单周期CPU设计开始,先讨论如何将其改造成不考虑相关冲突的流水线,然后考虑用阻塞解决相关冲突,最后引入数据前递设计。在介绍设计方法的同时,这一章还对书中所采用的实验开发环境进行介绍,并讲解相关的仿真调试技术。

第5章介绍如何在流水线CPU中添加运算类指令。主要内容包括如何在第4章完成的简单流水线CPU基础之上添加算术逻辑运算类指令、乘除法运算类指令,以及乘除法配套的数据搬运指令。

第6章介绍如何在流水线CPU中添加转移指令和访存指令。主要内容包括如何在第5章完成的CPU基础之上添加条件分支、间接跳转和Link类转移三类转移指令,以及添加对齐与非对齐访存指令。

第7章介绍例外和中断。这一章首先对例外和中断的基本概念,以及MIPS指令系统中的例外和中断的定义进行简要的梳理,然后介绍如何在第6章完成的CPU基础之上添加对于例外和中断的支持。CPU有了这两部分的支持之后,就可以运行一些简单的嵌入式操作系统了。

第8章介绍AXI总线接口设计。这一章首先对完成CPU设计所需要的AXI总线协议的相关内容加以回顾,然后通过实现类SRAM总线接口、实现类SRAM-AXI转接桥、集成类SRAM-AXI转接桥三个阶段性任务来完成CPU中AXI总线接口的添加。

第9章介绍TLB MMU的设计。这一章首先对TLB相关的知识点进行梳理,然后通过TLB模块的设计实现、TLB相关CP0寄存器与指令的实现、将TLB模块集成到流水线中完成虚实地址转换功能并支持TLB例外这三个阶段性任务来完成整个TLB MMU的设计。

第10章介绍高速缓存(Cache)设计。这一章只介绍最简单的Cache设计,其设计任务同样被分解成Cache模块设计、Cache模块集成、CACHE指令支持三个循序渐进的阶段性任务。

第11章就一些进阶设计问题给出我们的建议,主要涉及启动内核需要补充哪些设计、如何进一步提升主频、如何进行超标量设计、如何设计动态调度机制、如何设计转移预测器、如何优化访存性能、如何设计动态调度机制以及如何添加多核支持。

本书的附录分别对本书案例相关的开发板、Vivado的安装与进阶使用、MIPS指令系统规范、在线调试等内容进行了补充介绍。

可以看到,本书主体内容是围绕着一系列进阶任务展开的。在第二部分的每一章中,都会给出有针对性的任务,同时给出与之对应的知识点与设计建议。完成本书各章“任务与实践”部分所需资源可登录华章网站(www.hzbook.com)下载。我们希望读者在时间和精力允许的情况下,先尝试根据自己的想法完成设计任务,有了自己的深入思考和亲身实践后,再来看书中给出的讲解,相信会有不一样的体会,正所谓“不愤不启,不悱不发”。之所以推荐这种比较“虐”自己的学习方式,源于作者在长期的研发工作中得到的一个感悟:好的工程师是bug“喂”出来的。对于CPU设计与开发这种工程性、实践性极强的工作来说,眼观千遍不如手过一遍。前辈们千叮咛、万嘱咐不要犯的错,非要自己错过一次才能刻骨铭心;教科书上、论文中已经写得清清楚楚的设计思路,只有自己在设计的路上碰壁无数次之后才会有如获至宝的欣喜。要想真正进入CPU设计的大门,仅仅靠坐在图书馆里看书几十个小时是远远不够的,它需要走路、吃饭甚至是睡觉的时候都在思考如何设计的那种“为伊消得人憔悴”,更需要通宵达旦调试的那份执着与坚持。

直播预告:

4月29日晚20:00—21:00本书作者龙芯中科技术股份有限公司首席工程师汪文祥老师讲解《CPU设计实战》,带你从零开始设计自己的CPU,并与北京航空航天大学教授高小鹏老师深度对话CPU的未来与发展,敬请关注~

欢迎加入本书读者群交流

第一时间获取直播资讯、优惠活动等信息!

想获取这本书籍的同学,在评论区留言,留言点赞前5名获取纸质书籍一本!2021-4-30号20:00截止


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

点击阅读原文查看专题链接:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式OS入门笔记-以RTX为案例:一.简介

嵌入式OS入门笔记-以RTX为案例:一.简介 最近在做OS相关的项目,一方面涉及到大量(通用)操作系统的概念和理解,另一方面要深入到一个小实时操作系统的源代码中,并在此操作系统上开发应用。虽然说内容上并不难…

Linux进程O(1)调度算法,面试必考哦

进程调度有很多方法,这里只讨论Linux下的进程调度,先说下,这个是高端面试必考题,既然我发文了,大家最好看看,而且目前看到的写得最好的文章,推荐给大家。Linux是一个支持多任务的操作系统&#…

让Visual Studio 也支持JS代码折叠 —— 续 [ Visual Studio | Js | ScriptOutline | SmallOutline ]...

前言 上文让JS代码折叠的功能能用了,本文将对代码继续改进以期更好用、更实用,随后有介绍Visual Studio JS方面的几个插件。 文章 1. VS2003折叠代码的Micro 2. MSDN 3. Document Outline for Client Script in Visual Studio 2005 正文 …

嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX

嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX本篇笔记将简单介绍RTX,包括基本架构,如何在Keil中配置。需要安装ARM-MDK和一块硬件板,笔记以STM32F4Discovery为例子。1.为什么要用RTOS?尽管把所有程序放在一个大的循…

再解析下内核自旋锁和优先级翻转问题

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?Linux内核自旋锁之前写的自旋锁的文章,现在再加一篇,可能单纯的一两次说明不能把问题说清楚。所以再写一篇文…

ios 逆向编程(环境搭建)

首先如果你想要逆向其他的APP 动态的查看 或者修改人家APP里面的东西 1, 首先要有一台越狱的手机 最好是9.1以下的,因为9.2以上(包括9.2)就不能完美越狱了 2,手机也要5s以上的(因为从5S开始支持arm64架构&…

最大、最小堆的实现

最大最小堆 堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左子节点和右子节点的值。 最大堆和最小堆是二叉堆的两种形式。 最大堆:根结点的键值是所有堆结点键值中最大者。 最小堆:根…

嵌入式OS入门笔记-以RTX为案例:四.简单的时间管理

嵌入式OS入门笔记-以RTX为案例:四.简单的时间管理 上一节简单记录了进程task。有了进程以后,我们需要关心怎么样分配CPU资源(或者运行时间)给每个进程。那么就要引入排程(scheduling)的概念。排程一般都是O…

我等这个含蓄的技术男当上了CEO

大家好,祝大家五一节日快乐!今天没有写技术文章,今天想吹一个人,他是我的朋友,他做公众号很久了,技术文章写的也不错,但是阅读和关注量一直没有上来,我之前好几次在公众号上转发了他…

广东总冠军

lets go tiger 看这篇文章之前,先看看我们看球的视频 恭喜广东拿下总冠军! 恭喜胡明轩夺得FMVP! 我当时预测的是周鹏或者胡明轩拿下FMVP,最后是胡明轩,广东后场三条枪表现都非常亮眼。如果是上一场广东夺冠&#xff0c…

每日一题(1) —— 数组计算

判断下面代码是否可执行&#xff1f;如果可执行&#xff0c;执行结果是多少&#xff1f; #include <stdio.h>int main(void) {int array[10] {0, 2, 3, 4, 5, 6, 7, 8, 9, 10};0[array] 1;printf("%d\n", (-1)[array 5]);return 0; } 分析&#xff1a; C语…

内存文章汇总,并剖析mmap

在看这篇文章之前&#xff0c;可以先看看下面这几篇文章Linux内存&#xff0c;先看这篇文章Linux内存寻址方式Linux虚拟内存TLBLinux物理内存初始化Linux io内存存在的意义~修改cmdline 把内存改成512MB用mtrace定位内存泄漏什么是内存泄漏&#xff1f;Linux内存管理slub分配器…

[综述泛读] A survey on web services composition (IJWGS, 2005)

Time: 2.5 hours Dustdar S, Schreiner W. "A survey on web services composition." International Journal of Web and Grid Services: 1-30. 2005 (30 pages, 单栏) (gs:169) Schahram Dustdar (维也纳技术大学, full prof) Dusdar是Distributed Systems Group的老…

韦老师的开发板和嵌入式书籍赠送

大家五一快乐&#xff01;我知道这个时候大家都没有什么心思学习&#xff0c;所以找了联合了几个朋友一起给大家送点东西。这几个技术号主都非常用心的给大家分享技术文章&#xff0c;我相信&#xff0c;跟他们一起&#xff0c;你们也能变得更加优秀。奖品包括&#xff1a;1. 韦…

每日一题(2)—— -2与2的比较

分析下面的代码&#xff0c;求运行结果。 #include <stdio.h>int main(void) {if(-2 > 2){printf("11111\r\n");}else{printf("22222\r\n");}return 0; }分析&#xff1a; -2和2都没有声明存储类型&#xff0c;编译器默认按int存储&#xff0c;所…

truffle unbox react 出坑指南

最近几天差点就被这鬼东西给逼疯了&#xff0c;truffle init 、truffle unbox webpack 不管我怎么运行都是对的&#xff0c;唯独truffle unbox react 不管在哪个windows都会报错&#xff0c;换了好几台电脑&#xff0c;心都累完了&#xff0c;还好我坚持了下来&#xff0c;找了…

单片机6年想转嵌入式Linux ,不知如何下手?

刷知乎看到下面这个提问。单片机6年想转嵌入式Linux &#xff0c;不知如何下手&#xff1f;现在挺尴尬&#xff0c;做的单片机产品总是感觉重复重复再重复&#xff0c;想学习点新东西&#xff0c;不知道如何转。说实话&#xff0c;这个问题自己关注了很久。今天就借题主这个问题…

每日一题(3)—— -2与2的比较(二)

分析下面的代码&#xff0c;求运行结果。 #include <stdio.h>int main(void) {if(-2L > 2UL){printf("11111\r\n");}else{printf("22222\r\n");}return 0; }分析&#xff1a; 常量后面接L表示long型存储&#xff0c;UL表示unsigned long型存储&a…

嵌入式技术面试时的10大潜规则

编排 | strongerHuang微信公众号 | 嵌入式专栏找工作也是一门技能&#xff0c;有的人很快就找到自己喜欢的工作&#xff0c;有的人找了很久也没找到合适的工作。下面给大家分享几点找工作过程中存在的“潜规则”内容。嵌入式专栏1面试的本质不是考试&#xff0c;而是告诉面试官…

每日一题(4)—— (a ^ b 2)

分析下面的代码&#xff0c;求运算结果。 #include <stdio.h>int main(void) {int a 6, b 4;printf("%d\n", a ^ b << 2);return 0; }分析&#xff1a; 主要是考的是“优先级”和按位“异或”&#xff0c; 左移运算符优先级高于按位异或运算符&#…