食堂里撑着

<自己动手写CPU>章七至章九总结

0
阅读(1159)

章七至章九总结

1.这几章多为具体指令的实现,基本的原理没有什么变化,重复性很强,属于一通百通型.

2.涉及到的一些概念:

乘加器: 在数字信号处理的滤波器、FFT、卷积及各种矢量运算中,由于要执行

Σb(n)*x(n - k) 一类的运算,这类运算的乘法和加法总是同时出现,因此DSP中就希望将乘法器和加法器相结合,在一个时钟周期完成一次乘、加运算,并且累加乘法运算的结果。这样的运算单元称为乘法累加器

流水线暂停机制:由于某些阶段的指令需要不止一个时钟周期来完成运算,这时候就需要暂停流水线,以等待指令完成.

3.实现除法:

试商法.移位和减法相结合.书上的方法和用笔算十进制除法的方式很相像.这一段我看了好几遍.最后发现正确的理解思路是动手写,把理论,流程图理解下来,知道每一步为什么这样做,然后去看代码,就容易理解了.在其他地方,也叫作基于减法的除法器.

参见http://blog.csdn.net/rill_zhen/article/details/7961937

最简单的方法:移位除法.

4.延迟槽.

这个概念已经很老了,有了分支预测之后,它的用处不大.

5.精确/非精确异常

在多发射乱序执行的流水线 CPU 上,从指令进入流水线到异常事件的发生,期间要经过若干流水级,此时 PC 的值已指向其后的某条指令,在实现非精确异常的 CPU 上就把此时的 PC 值作为引起异常指令的所在(为了表达的方便,记为 eptr)。

简单地说就是 eptr 的指向,并非真正的引起异常的指令之所在,而是其后面的某条指令所在。

引用:

简单地说就是 eptr 的指向就是真正引起异常的指令之所在

而实现精确异常的 CPU,则在最后指令提交时 (commit) 按指令流的顺序提交,异常的产生也在该指令提交时,这样就能精确计算出引起异常的指令相对于当前 PC 的偏移,从而保证精确异常。

也就是说当异常产生时,之前的预备工作(即取指,译码,当然PC随之增长)便被废弃。CPU从异常中返回时,再重新做读取和译码的工作。

总之,不管是何类异常,eptr 之前的所有指令都会被执行完成 (commit之后),eptr 之后的指令不会被执行。 来自http://blog.chinaunix.net/uid-26817832-id-3146408.html

6.load相关

概念:在加载数据之前,系统以错误的值做了运算.

解决方法: 在加载数据之前暂停流水线.

Key:判断load相关

若上一条指令是加载指令,且加载指令要加载的寄存器就是当前指令要通过regfile端口读取的值.则存在load相关,需要进行暂停流水线.


Baidu
map