u@home:~$

  • Address misalign exception

    想开始加exception了,之前cpu6 soc1里面只做过illegal instruction的,这次准备先搞address misalign的。 lsu里没处理这个,比如store,不管地址是不是misalign,都直接发出去给cache,发出data_req,只是要写的数据没有写进去。 st.h存两个字节,地址是0xc0000019,是不对其的。data_addr_ok是给回来了,后面data_data_ok是咋回事,这是个st指令。。 先记下,回头再调。 看了下龙芯手册,不是用的中断向量表,除了TLB,所有的exception和interrupt都是走CSR.EENTRY的入口。 然后通过CSR.ESTA里的信息由软件来判断是什么情况。 单这个EENTRY地址怎么定的,手册里没有。reset后的地址是1c000000是手册给出来的,这个EENTRY没给。 看了下chiplab,chiplab里没有exception这部分功能,之前也没注意。 查了下龙芯手册,结果发现LoongArch32和LoongArch64还不一样。 或者说LoongArch32是CSR.ECFG.VS为0时候的特殊情况。LoongArch64里可以用中断向量表的,为什么要这么设计,还不懂。 调的过程中遇到个问题。 lsu里给出的lsu_rdata_valid_m,这个名字我起的不好,应该叫lsu_finish_m。表示load或store操作结束,但并不能保证store是否成功,load是否成功读到数据。 问题是,如果lsu_rdata_valid_m不给出,lsu就一直stall ifu。 assign lsu_rdata_valid_m = data_data_ok; 1015 // 1016 // lsu_dispatch_d is the staring signal 1017 // lsu_ecl_rdata_valid_m ends it 1018 // 1019 assign lsu_stall_req_next = (lsu_dispatch_d) | (lsu_stall_req & ~lsu_ecl_rdata_valid_m); 1020 1021 dffr_s #(1)...

  • 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...