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学。