关于计算机组成原理课设Verilog制作CPU的testbench文件的补充

        关于testbench文件,我们需要写的部分只有几行,老师其实已经给我们标出,那么接下来我会讲一讲具体的编写过程以及其背后的部分原理(简单易懂版)。

        编写过程

        首先献上老师给我们的部分代码。

        

         其实老师标的也比较明确,在IN里面,补充我们的指令,格式与IN底下的三行一样,这里要注意一点,nop旁边的0不是指他的指令码是00000000,而是他是第0条指令,我们后续的指令需要按序号标为1,2,3......但不是说指令就必须要是00000001,00000010...

        我觉得直接上图会比较好理解这一块。需要什么指令直接按照相同的格式往后面加即可,第0条指令也可以不是nop,我这个就改了。

        

         check的话在后面补充A1的按下和弹起,意思就是你有多少条指令,就在后面补充多少个A1=0;A1=1;即可。

        

         同样的,run指令也是补充A1的按下和弹起,但是要注意指令之间间隔的时间和check不一样

        

         注意:在进行三字指令的编写的时候,需要编写三组IN指令三组CHECK指令一组RUN指令。IN部分示例如下:(关于为什么我的指令前面标了两个数字就和这个有关,小的代表指令条数,大的代表指令字节数,CHECK对标字节数,RUN对标条数)

         

         部分理论分析

        为什么IN、CHECK、RUN不是一个指令一个循环,而是先把指令输入完毕,再全部检查完毕,再全部一起跑?为什么三字指令的CHECK有三次,RUN只有一次?......大家可能疑问很多,看完下面的内容应该就不会有疑问了。

        要理解指令的存储过程,我们必须看老师给我们的RAM部分。

        

         仔细看testbench已经给我们的部分,我们可以发现,IN指令执行期间,SW1=1,SW2=0,而CPU_controller中有一句assign CPU_state = {SW2,SW1};因此在IN阶段对应的正是cpustate=2'b01部分的代码,其流程我们其实一看就明白,就是一个数组存储,每按一次A,memory[cnt++]=D。(D就是我们输入的D)

        那么我们可以得出一个结论,我们输入的所有的D都按顺序存储在memory数组中。而看下面cpustate=2b'10阶段,也就是CHECK阶段,我们可以发现是一条条指令取出来。下面是其对应的输出语句部分。通过check_out输出。于是我们又可以得出一个结论:CHECK语句对标的是输入的字节数,因为即便是三字指令,我也会把你的三个字节按顺序慢慢取出来看。

        RUN阶段就比较依赖read信号了。

        

        每有一次read信号之后会读取一次memory中的数,并且地址依赖的是addr1,这个addr1就是addr的低五位,addr来源于AR寄存器,这部分可以看一下AR的实例化。AR存储的是什么,我上一篇文章已经讲过了,AR在一个三字指令中会往后走三步,所以我们只需要RUN一下,就可以把三个字节的值都读取出来 。

        讲到这里明面上的问题就已经讲完了,还有一个问题,就是关于读取数据(比如LDAC,读取某个存储单元的数据)和读取指令地址(比如JUMP,读取JUMP到的指令的地址)的三字指令的差别。

        

        

         其实奥秘都在这几行,如果你输入的addr高11位全部为0,那么就读取低5位在memory数组中的值,否则就读取高11位在ram数组中的值,低5位代表的是数组[7:0]memory[31:0]中的单元,而高11位代表的是[7:0]ram[1023:0]中的单元。

        所以其实有个有趣的现象,我读取0000000010000000的数据和0000000010000001的数据是一样的,共用一个存储单元,而指令字节数不能超过32个。

猜你喜欢

转载自blog.csdn.net/qq_51135645/article/details/121907264
今日推荐