一个能DIY的CPU逻辑设计
2009-04-25
读这本书最大的收获,原来设计一个“从内存中读取指令并执行”的电路并不如想象中那么复杂,用几十个D触发器加一堆逻辑门就能搞出来。
当然,要把这么多内容放到一本书里,必然有很多省略之处。
数字电路方面,模型比较理想化,要想真的用TTL或FPGA实现Hack还有一些现实的困难要克服,当然不能苛求这本书把数字电路讲得过细,那就喧宾夺主了。
CPU设计方面,虽然Hack很简单,但它是怎么一步一步设计出来的,为什么要这样设计,理由何在,设计过程中做了哪些权衡考虑,这些在书中并没有明显的说明。
硬件设计,特别是CPU的设计,是为软件服务的。具体地说,就是成为C语言的编译目标,CPU提供的指令应该能充分支持C语言的高效实现,毕竟C语言是使用最广泛的系统语言。这一点Hack并没有完全做到,甚至没有提到,比如它没有逻辑移位指令(C语言有移位操作符),也不能实现函数调用(因为PC的值不能压栈)。Hack的A寄存器可以用来作基址寄存器,即内存访问时的地址,等于是个指针。如果书中能把C语言的常见指针操作用Hack汇编语言翻译阐述一遍,就能相互映照,加深理解,但可惜没有。这方面, Patterson & Hennessy 那本《Computer Organization and Design: The Hardware/Software Interface》要好得多。不过,cod讲的CPU可就没那么容易实现了,那是一块类MIPS的32-bit RISC CPU。
CPU除了支持C语言,另外还得支持现代操作系统,具体说来,就是区分用户态和内核态,支持系统调用以便在两者之间转换,支持虚拟内存,让多个进程能有彼此独立的地址空间,等等。这方面我还没有找到一本特别好的书,很多操作系统教材以X86为例,但x86的内存管理机制复杂得一塌糊涂,补丁累补丁(8086->80286->80386->x64,一路补丁打下来,还得向下兼容),花精力在这上面实在不值。我希望能看到以MIPS或者ARM为平台的操作系统教材。
性能方面,书中也着墨不多。Hack造出来了,那么它的性能如何,够不够快,能不能更快,瓶颈在哪里?Hack CPU是一个同步时序逻辑电路,它的时钟频率能上到多少MHz,制约因素是啥,它能容忍的clock skew是多少ps,它在执行指令时各个信号的时序图如何,这些书里都没有提到。Hack是个单周期CPU,如果要提速,一般是流水化+cache,这又会引入一大堆的头疼问题。这方面,《Computer Systems: A Programmer's Perspective》讲得很好。
Hack的另外一个弱点是输入输出,它用内存映射方式的IO,这本身没问题,但是它不支持中断,也就是说只能用轮询的方式输入输出数据,这可不妙。中断是一个关键概念,不仅是输入输出,单CPU上能实现多任务,全靠操作系统在处理时钟中断时顺便切换当前任务(当然,也有其他切换任务的机会,比如从系统调用返回时)。要学这一块看似神奇的任务切换,不用劳烦复杂的操作系统教材,一本uC/OS-II的书就搞定了。
学Hack,好处是它简单,几天就能上手弄懂;坏处是它太简单,可以作为学习的起点,但不宜作为学习的全部。