u@home:~$

  • 加test case

    先复制份代码。 u@unamed:~/prjs/cpu7/software/func/$ cp -r func_uty0/ func_uty1_ld 代码不在这里编译。 现在configure.sh里加上func/func_uty1_ld func/func_advance) RUN_FUNC=y mkdir -p ./obj/func mkdir -p ./log/func ;; func/func_uty0) RUN_FUNC=y mkdir -p ./obj/func mkdir -p ./log/func ;; func/func_uty1_ld) RUN_FUNC=y mkdir -p ./obj/func mkdir -p ./log/func ;; my_program) RUN_FUNC=n RUN_C=y mkdir -p ./obj/ mkdir -p ./log/ ;; 然后在run_func里编译。 u@unamed:~/prjs/cpu7/sims/verilator/run_func$ ./configure.sh -run func/func_uty1_ld...

  • Chiplab LSU

    Chiplab的lsu要简单些,因为用的是memory interface,不需要处理dcache,也不需要通过AXI控制内存,因为这些都包装在别的模块。 module lsu_s1( input clk, input resetn, input valid, input [`LSOC1K_LSU_CODE_BIT-1:0]lsu_op, input [`GRLEN-1:0] base, input [`GRLEN-1:0] offset, input [`GRLEN-1:0] wdata, input tlb_req, input data_exception, input [`GRLEN-1:0]data_badvaddr, input tlb_finish, //memory interface output data_req, output [`GRLEN-1:0] data_addr, output data_wr, `ifdef LA64 output [ 7:0] data_wstrb, `elsif LA32 output [ 3:0] data_wstrb,...

  • LSU里读写内存有stall一个cycle结果回不来怎么办?

    以前写的都是用block ram,一个cycle读写都能完成,所以没遇到这个问题。 现在要是用cache,cache miss以后需要很多个周期。取指时还好解决,取不到就ifu就不往下进行。 而LSU在读写内存时一个cycle回不来,就要stall在那,流水线也要暂停等结果。 chiplab里是结果返回后设置lsu_res_valid。data_data_ok是cached memory interface给出的读成功的信号。 lsu_s2.v assign lsu_res_valid = data_data_ok || data_exception || res_valid || prefetch || !valid || (lsu_op == `LSOC1K_LSU_IDLE); 在ex2_stage里,lsu指令的完成可以让change=1。最终设置ex2_allow_in让流水线动起来。 //result wire port0_change; wire port0_alu_change = (ex2_port0_src == `EX_ALU0 ) && ex2_alu0_valid; wire port0_lsu_change = (ex2_port0_src == `EX_LSU ) && lsu_res_valid; wire port0_bru_change =...