u@home:~$

  • 流水线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...

  • CPU7

    The goal is to learn from chiplab project, including how to use verilator to establish a developing and testing framework, how the chiplab cpu’s modules are orgnized, and how to use AXI and ABP bus protocol to connect with memory and peripherial devices. Step 1: Move and rename the chiplab...