-
怎样新加一个功能性模块
最开始的ALU指令,5个cycle完成。 后面加了load store指令。 store还好,没有延迟,而load指令取决与cache,如果cache miss,就肯定不可能在一个周期里返回了。 cache miss,也还要看cache line refill要多久。 而load指令还是需要把结果写回寄存器的,所以有rd_idx, rd_data,同时也要有wen信号。 如果load指令的实现是封装在lsu模块里的,那lsu模块就要自己保存rd_idx rd_data wen信号。 因为从_e以后就和exu_ecl保存的alu指令相关的rd_idx rd_data就已经不同步了,LSU要自己维护这些,等到_m的时候返回给exu_ecl模块。 exu_ecl在_m这里就需要2个mux,一个是rd_idx的mux,一个是rd_data的mux。 726 // 727 // rd_data mux 728 // 729 730 wire [`GRLEN-1:0] rd_data_m; 731 wire [`GRLEN-1:0] rd_data_w; 732 733 734 wire rddata_sel_alu_res_m_l; 735 wire rddata_sel_lsu_res_m_l; 736 wire rddata_sel_bru_res_m_l; 737 wire rddata_sel_mul_res_m_l; 738 739...
-
chiplab里的csr
// csrrd/wr/xchg output [`GRLEN-2 :0] rdata, <--- input [`LSOC1K_CSR_BIT-1:0] raddr, input [`GRLEN-1 :0] wdata, input [`LSOC1K_CSR_BIT-1:0] waddr, input wen , 这有个bug,rdata长度是31bit。 可能因为很少csr寄存器用到第31bit吧,不容易发现。 csr寄存器是这样实现的。 // CRMD 0x0_0_0 reg [1:0] crmd_plv; reg crmd_ie; reg crmd_da; reg crmd_pg; reg [1:0] crmd_datf; reg [1:0] crmd_datm; reg crmd_we; assign crmd = { `ifdef GS264C_64BIT 32'b0,...
-
mul指令
LoongArch32上只有mul.w mulh.w mulh.wu这三条。 mul64x64模块试了下,下一个周期就能返回结果。 比如mul.w,试了下2 x 2和-1 x -1。 又试了下mulhwu,结果对,也是下个周期就返回。 其实就可以把这个结果按_m返回直接丢给rd_data_mux了。 网上搜了下,说mul指令是可以一个周期完成的,就是快就需要很多full adder,在以前的话比较费资源。 不过我还没时间好好学习这部分,直接用了chiplab里的mul64x64模块,连接口也没改。 1 module mul64x64( 2 input clk, 3 input rstn, 4 5 input mul_validin, 6 input ex2_allowin, 7 output mul_validout, 8 input ex1_readygo, 9 input ex2_readygo, 10 11 input [63:0] opa, 12 input [63:0] opb, 13 input...