一.准备工作
先看看书(《计算机原理与设计 Verilog HDL版》),搞懂一点原理。然后照着书上的代码写一写(用8.4的就可以了,不用8.6的)。
注意mux2x32,mux4,cla32等可以用单周期的mux,alu。 (cla32就是个加法器,)
然后dffe32在书上前几章也有。
pipeimem即为im指令存储器,可以套用单周期的IM。
pipemem是数据存储器,可以套用单周期的dm
regfile 可以套用单周期的RF。
alu可以完全套用单周期的alu。pipecu中的aluc,rij型的wire,以及wreg中的一部分都可以套用单周期的代码。只是注意要调整好,不要多写,少写,导致错误。(我犯过错误就是,alu的功能与pipecu的aluc不一致,少写了一些东西,导致数据读入都出问题。)
需要理解流水线cpu的各种问题及解决对策。
比如lw指令从memory读到register,在mem级才可以前推(forward)到id级,这样如果下一条指令要用到寄存器的 结果,需要阻塞(stall)一周期,否则已经进入了exe级了而书上示例的cpu只能forward到id级。
这里补充一点,用了8.4的代码,然后为了消除控制冒险,要在mars的测试文件(.asm)中,每一条J型指令后加一个nop。这里是因为看8.2.2,采用了延迟槽技术,i指令是跳转类指令,i+1无论如何都会被执行。(提前到在ID级判断是否要跳转),这里加nop,刚好取代了i+1。
二.调整接口&&细节调整
写完代码,modelsim编译成功。(或者有问题,按照transcript的提升改一改)。
然后start simulation、
simulation失败,提升error loading design。
error loading design的原因基本上是:模块名错误(定义的和使用的。),参数错误(接口错误,比如参数顺序不一致,参数宽度不一致)
注意网上看error loading design很多都说没有提示,这是误导了。(导致我自己不看提示改了一天,虽然确实也改好了一些吧)确实提示不多,但是modelsim transricpt 在start simulation 后也会有一些error提示的
Error: (vsim-3043) E:/pipe3/pipelinecomp_tb.v(55): Unresolved reference to ‘ID‘ in U_SCCOMP.U_SCPU.ID.
这个就提示ID不知道是啥。
然后我看了一下pipelinecpu中,pipeid 起名id_stage ,而不是ID。把ID改成id_stage就完事了
调整接口很困难(对我来说)。要细心。
比如clrn就是rest等等,需要理解后替换。
比如因为仍然使用了单周期的顶层例化文件,comp中cpu模块只有一个aluout的例化,那么就不能按照8.4的代码在module cpu里ealu,malu,walu三个输出。其中walu,ealu改为wire型。malu改名为aluout,仍保留为输出。
还有pipemem(即为DM,data‘memory)因为在comp中例化,就不需要像8.4中一样在module pipelinecpu中使用了。
还有许多细节,需要自己摸索。
三.效果
还是学号排序,应该是成功了
放错图了
这是mars setting momeryconfiguration text at address,然后assemble,然后dump的结果。
正确的图
先设置mars setting momeryconfiguration data at address,assemble,不要运行,dump,然后仿真的结果
单周期的时候也是这么设置的,一开始忘记了...
原文地址:https://www.cnblogs.com/lqerio/p/11117618.html