u@home:~$

  • CSR模块

    387 cpu7_csr csr( 388 .clk (clk ), 389 .resetn (resetn ), 390 .csr_rdata (csr_byp_rdata_d ), 391 .csr_raddr (ecl_csr_raddr_d ), 392 .csr_waddr (ecl_csr_waddr_m ), 393 .csr_wdata (byp_csr_wdata_m ), 394 .csr_wen (ecl_csr_wen_m ) 395 ); 在_d的时候读csr寄存器的内容。 处理csrwr csrxchg的时候需要读rd的内容,写到csr寄存器里。因为读到的rd的内容需要经过byp处理,所以在_e写csr寄存器来不及,只能在_m写。 695 assign csr_wdata_e = byp_rs2_data_e; 并且_e的时候还要处理csrxchg里的mask。 但这样就出现个问题,csr寄存器也需要byp。 比如csrwr后面紧跟着csrrd,csrwr在_m时写csr寄存器,而csrrd在_d的时候就去读了,比如下面这段代码。 addi.w $r4, $r0, -1 # r4...

  • 怎样新加一个功能性模块

    最开始的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,...