-
单发射就不需要issue stage了吧
过段时间就全忘啊。。 verilator模拟的时候出一大堆Read Miss Addr0,这个是正常的,不知道刚开始怎么着就读到地址0了。 新加模块什么的,重新编译要先make clean,现在没时间改进makefile。 要是make clean_all,一定记得在run_func,也就是make的目录下makdir log,创建log文件夹,要不后面不编译了。 verilator要用的内存文件最后在./tmp/ram.dat Makefile里有这句,不过tmp目录运行完就删除了。 cat ./tmp/rom.vlog > ./tmp/ram.dat; 确认有ram.dat,verilator就能读内存了。刚开始被一堆的Read Miss Addr0给整不会了,以为是内存文件没生成出来。 而且后来读内存的时候,是从1c000000开始读的,但读出来的是0,开始也是以为内存文件的事。 cpu7模块里本来想完全从头写,先只放cpu7_ifu和cpu7_exu,可发现没有tlb和csr模块控制cache,读内存会出问题。 本打算借着这个机会把cache看看,结果先试了把csr和tlb_wrapper加了回来,结果指令取值正常了。 那就先这样吧,一个inst_req要6个还是7个周期才读成功,inst_addr_ok和inst_valid同时返回,还没有看是因为什么。 先在cpu7_ifu里有cpu7_ifu_fdp和cpu7_ifu_dec,取值,解码。 obj/main.elf: file format elf32-loongarch obj/main.elf Disassembly of section .text: 1c000000 <_start>: kernel_entry(): 1c000000: 0280058c addi.w $r12,$r12,1(0x1) 1c000004: 0280098c addi.w $r12,$r12,2(0x2) 1c000008: 02800d8c addi.w $r12,$r12,3(0x3) 1c00000c: 0280118c addi.w...
-
流水线stall的设计
两种方式选一: chiplab的,上一级等下一级,一级一级串起来,一但后面的比如ex2卡住了,前面流水线全部停下。 我自己cpu6的,if阶段有个stallF信号,后面阶段如果要stall,就去signal这个stallF,然后流水线里就产生泡泡。这样需要各级都很清楚哪里要stall,哪里要flush。 先在看来流水线控制我已经知道了3种方式。 chilap的,一级链一级,后面的不完成,前面的进不去。 我自己的,控制if,刷后面的id,ex,让流水线里产生泡泡。 OpenSPARC T1,stall 各级NIR,同时有很多个信号随着这条stall后重复的指令通过整个流水线,但在读写reg的时候都不给en,所以这条指令是没任何效果的。 如果要用OpenSPARC的方式,rf要支持,虽说rf都有wen,但我要用chiplab的rf,这个没有ren。 如果要刷流水线寄存器,那么所有的dff都还要有rst。 还没有看chiplab里面怎样刷流水线,比如branch以后已经进到流水线里的指令。OpenSPARC怎么做的更是还没看明白。 todo 先看下opensparc是怎么做的。 来自ifu外部的stallreq,一个是来自lsu,是某个队列快满了就告诉ifu不要再取值往后面执行了。另一个是来自ffu,浮点运算单元。 lsu/rtl/lsu_qctl2.v // Determine whether cfq has crossed high-water mark. IFU must switchout all threads // for every cycle that this is valid. // Need to change wptr size once new cfq array description incorporated. //...
-
chiplab pipeline moudle
ifu里先去掉所有和分支预测有关的信号,只剩下三组信号需要处理。 cpu读取指令的信号 inst_ 后面传回的跳转地址 br_ 给后一级decode的信号,o_port0_ chiplab里是有三个port的,为了简单,ifu只能单发射,虽然接口没有变,但只有port0有效。 NONE0是什么种类的指令? 在ex1_stage里 wire [`GRLEN-1:0] ex1_none0_result; wire [`GRLEN-1:0] ex1_none1_result; wire ex1_none0_exception; wire ex1_none1_exception; wire [`GRLEN-1:0] ex1_none0_csr_result; wire [`GRLEN-1:0] ex1_none1_csr_result; wire [`GRLEN-1:0] ex1_none0_csr_a; wire [`GRLEN-1:0] ex1_none1_csr_a; 可以看到exception,cache,tlb,csr相关的指令都走NONE。 +-------------------------------------------------------+ | cpu7_ifu_fdp cpu7_ifu | | | | .inst_req | | .inst_addr | | .inst_cancel | | .inst_addr_ok...