2021年10月1日星期五

先改gs232c_front

gs232c_front gs232c_front(
    .clock           (clk                     ),
    .reset           (~resetn                 ),
    // .br_endline      (1'b0                    ),
    .pc_init         (`GRLEN'h1c000000            ),

    .br_hint         (bru_hint_input          ),
    .br_cancel       (bru_cancel_input        ),// I, 1
    .br_target       (bru_target_input        ),// I, 32
    .br_taken        (bru_taken_input         ),// I, 1
    .br_link         (bru_link_input          ),// I, 1
    .br_jrra         (bru_jrra_input          ),// I, 1
    .br_brop         (bru_brop_input          ),// I, 1
    .br_jrop         (bru_jrop_input          ),// I, 1
    .br_sign         (bru_sign_input          ),// I, 1
    .br_pc           (bru_pc_input            ),// I, 32
    .br_link_pc      (bru_link_pc_input[`GRLEN-1:2]),// I, 32

    .wb_cancel        (wb_cancel         ),// I, 1
    .wb_target        (wb_target         ),// I, 32
    .wb_link          (wb_link           ),// I, 1
    .wb_link_pc       (wb_link_pc[`GRLEN-1:2]),// I, 32
    .wb_jrra          (wb_jrra           ),// I, 1
    .wb_jrop          (wb_jrop           ),// I, 1
    .wb_brop          (wb_brop           ),// I, 1
    .wb_pc            (wb_pc             ),// I, 32

    // .wb_endline       (1'b0              ),
    .wb_taken         (wb_taken          ),

    .inst_req         (inst_req          ),// O, 1
    .inst_addr        (inst_addr         ),// O, 32
    .inst_cancel      (inst_cancel       ),
    .inst_addr_ok     (inst_addr_ok      ),// I, 1
    .inst_valid       (inst_valid        ),// I, 8
    .inst_count       (inst_count        ),
    .inst_rdata       (inst_rdata        ),
    .inst_uncache     (inst_uncache      ),// I, 1
    .inst_ex          (inst_exception    ),// I, 1
    .inst_exccode     (inst_exccode      ),// I, 5
    .o_allow          (de2_accept         ),
    .o_valid          ({de1_port2_valid,de1_port1_valid,de1_port0_valid}),
    .o_port0_pc       (de1_port0_pc       ),// O, 32
    .o_port0_inst     (de1_port0_inst     ),// O, 32
    .o_port0_taken    (de1_port0_br_taken ),// O, 1
    .o_port0_target   (de1_port0_br_target),// O, 30
    .o_port0_ex       (de1_port0_exception),// O, 1
    .o_port0_exccode  (de1_port0_exccode  ),// O, 5
    .o_port0_hint     (de1_port0_hint     ),
    .o_port1_pc       (de1_port1_pc       ),// O, 32
    .o_port1_inst     (de1_port1_inst     ),// O, 32
    .o_port1_taken    (de1_port1_br_taken ),// O, 1
    .o_port1_target   (de1_port1_br_target),// O, 30
    .o_port1_ex       (de1_port1_exception),// O, 1
    .o_port1_exccode  (de1_port1_exccode  ),// O, 5
    .o_port1_hint     (de1_port1_hint     ),
    .o_port2_pc       (de1_port2_pc       ),// O, 32
    .o_port2_inst     (de1_port2_inst     ),// O, 32
    .o_port2_taken    (de1_port2_br_taken ),// O, 1
    .o_port2_target   (de1_port2_br_target),// O, 30
    .o_port2_ex       (de1_port2_exception),// O, 1
    .o_port2_exccode  (de1_port2_exccode  ),// O, 5

 
    `LSOC1K_CONN_BHT_RAMS
);

 

gs232c_front里面有分支预测,这个可以先不管。还有指令队列,可以先实现个简单的,每次读2条指令,用2个寄存器存这 2条指令,比如inst, inst_next。模块输出有3个端口,可以先只用port0, 通过o_valid控制。

这个模块不需要接触cache,也不需要和内存axi总线交互。L1 cache可以先不动。


先要在代码里找到inst和pc的位置。gs232c_inst_queue inst_queue里负责维护这个。而gs232c_pipe_pc是综合分支预测决定pc的位置。











之前说的inst_addr,是在lsoc1000_mainpipe cpu里输出的,用来在cache里索引。inst_addr也是gs232c_inst_queue维护的。因为每一读近来都是一个cache line,这解释了以前遇到的为啥inst_addr不是4字节的增长,而是0x10 (128bit)。读进来的是inst_rdata。























开始那么多的clock,可能是读内存的时间。


打算先搞个一次存2指令, 而port先只用一个。

一次读2指令是想跟opensparc T1学。

试着用了下

先把DUMP_TRACE设为1,生成波形。

TIME_LIMIT并不是时钟周期,而是ps。

测试代码就几句

start.S

_start:
start:
    addi.w t0, t0, 1
    addi.w t0, t0, 2
    addi.w t0, t0, 3
    addi.w t0, t0, 4
    addi.w t0, t0, 5

一开始设置成20,结果波形没什么结果,但时钟周期已经经过了几个。后来设成2000,跑了995个clock,波形终于有点变化了。

DUMP_DELAY=0
DUMP_TRACE=1
TIME_LIMIT=2000


 
 
 

 

 

比如gs232c_front里的inst_addr, cpu reset后是从0x1c000000开始执行,但后面很多个clock,inst_addr没有变化,后面0x1c000010倒是有道理,因为一次读16字节。可能是axi总线设置里随即delay?可后面地址变化也没搞明白。

 

testbench/include/testbench.h里clock_total是clock数,可以在testbench里加个选项,运行几个clock。