u@home:~$

  • Sample Page

    模块有valid,表示启用。 模块输出的信号要 & valid,表示确实是这个模块有意发出的。 模块输出信号带目的模块缩写,比如lsu_ecl_,这样的信号一定都有valid。

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