在前天将41 instructions pipelined full forwarding cpu验收完成,写verilog的日子就算是告一段落了,很可能以后再也不会去动它了。在此,一来记录一下过去,二来,也给要写类似东西的人以启示。
初见Verilog
最初见到Verilog应该是在逻辑与计算机设计基础的实验课上见到,同时见到的还有FPGA板子和Xilinx ISE。最开始,我以为这课基本上是从理论到理论,接下来的计算机组成,那更是如此。因为,在此之前,我买过国内的一本计算机组成的书,它上面也有讲加法器,乘法器,除法器等等ALU部件,还有其他CPU部分,寄存器堆,内部总线,ISA等等。但是,它似乎没有让你去实现它的意思。理论很多,但是具体怎么实现,不知道。
最开始的时候,我们也只是用verilog写写,多路选择器,译码器,加法器,以及到后面稍微复杂时序电路。
当时,老师说,我们最终会实现一个cpu的时候,我开始对此有了小小的期待。(我不知道国内的其它学校他们是怎么上这课,还是从理论到理论吗?)
逻辑课的大程
在逻辑课快结束的时候,老师需要我们写一个大程。他对大程的要求是,要用VGA显示,要用到ram or rom,并且得有时序电路。他还给了一个例子,打乒乓球,应该是前些届学长做的。当时,不知怎么的,我想到了去做硬件解24点问题。此处应该算是缩减版的24点,首先,运算只能有+-*,4张牌,每一张都是0-15之内的一个值。主要原因是除法运算不是一个时钟周期可以完成的,做多周期的要复杂很多,每张只能是0-15也是为了简单起见,刚好4个bit。
软件24点
用软件和硬件实现24点都是十分类似。最根本的方法都是穷举法。我网上搜到的都是穷举法,应该还是有其他更快的方法的,但是即便是穷举也没有多少种。
括号的嵌套方式(其实也就是运算的顺序)总共有5种。(之后我们都认为+-*之间是没有优先级的,先算谁都是靠括号来的。)
- ((a+b)+c)+d
- (a+(b+c))+d
- a+((b+c)+d)
- a+(b+(c+d))
- (a+b)+(c+d)
对于给定的任一括号嵌套方式,我们都有3*3*3=27种运算符组合。
对于任一种括号嵌套和运算符组合,我们都有4!=24种安排4个数的顺序。
总的来说也就是,组合共有5*27*24=3240种。每种也就进行3次运算,所以总的运算量十分少,穷举也不是什么很糟糕的算法。
硬件24点
软件是串行的,硬件可是并行的。那不是什么多核或者是GPGPU的并行,而是比他们低层得多的,bit单位的并行。我当时的做法是,类似于外面套两层循环,第一层循环去枚举4个数字的排列情况,第二层循环去枚举运算符的组合,最里面并行的去计算5种括号嵌套方式。然后,找出其中一组最终值为24。
计组的多时钟CPU
计组的单时钟CPU怎么做的,我已经记得不太清楚了。但是,多时钟我还是记得比较清楚的。当时的那一次的4个人合作几乎是我大学里面最为成功的一次合作。不管是从分工,效率,过程,还是结果都非常的好。我是负责将另一个组员画好的图,用verilog拼起来。我用了4个小时,将它拼起来,并且又用了4个小时