diff --git a/lacpu/README.md b/lacpu/README.md index 1492953..9fdf0ca 100755 --- a/lacpu/README.md +++ b/lacpu/README.md @@ -34,29 +34,7 @@ -#### alu_op - -add.w, addi.w, pcaddu12i, ld.b, ld.h, ld.bu, ld.hu, ld.w, st.b, st.h, st.w, b, bl, jirl - -sub.w - -slt, sltu, stli, sltui - -and, andi - -nor - -or, ori - -xor, xori - -sll.w, slli.w - -srl.w, srli.w - -sra.w, srai.w - -lui12i.w +测试目前使用 **[CDP_EDE_local](https://gitee.com/loongson-edu/cdp_ede_local)** 进行,已测试通过 func 的 n1~n46 @@ -82,14 +60,14 @@ lui12i.w | √ | ANDI | and i rd, rj, ui12 | ui12 立即数零扩展 | | √ | ORI | ori rd, rj, ui 12 | | | √ | XORI | xori rd, rj, ui12 | | -| - | NOP | andi r0, r0, 0 | | -| | MUL.W | mul.w rd, rj, rk | 操作数视为有符号数,结果符号扩展 | -| | MULH.W | mulh.w rd, rj, rk | 操作数视为有符号数,结果的 [63:32] 符号扩展 | -| | MULH.WU | mulh.wu rd, rj, rk | 操作数视为无符号数 | -| | DIV.W | div.w rd, rj, rk | 操作数视为有符号数,结果符号扩展 | -| | MOD.W | mod.w rd, rj, rk | | -| | DIV.WU | div.wu rd, rj, rk | 操作数视为无符号数 | -| | MOD,WU | mod.wu rd, rj, rk | | +| √ | NOP | andi r0, r0, 0 | | +| √ | MUL.W | mul.w rd, rj, rk | 操作数视为有符号数,结果符号扩展 | +| √ | MULH.W | mulh.w rd, rj, rk | 操作数视为有符号数,结果的 [63:32] 符号扩展 | +| √ | MULH.WU | mulh.wu rd, rj, rk | 操作数视为无符号数 | +| √ | DIV.W | div.w rd, rj, rk | 操作数视为有符号数,结果符号扩展 | +| √ | MOD.W | mod.w rd, rj, rk | | +| √ | DIV.WU | div.wu rd, rj, rk | 操作数视为无符号数 | +| √ | MOD,WU | mod.wu rd, rj, rk | | ### 移位运算类 @@ -107,12 +85,12 @@ lui12i.w | √ | 指令 | 格式 | 说明 | | ---- | ---- | -------------------- | ------------------ | -| - | BEQ | beq rj, rd, offs16 | | -| - | BNE | bne rj, rd, offs16 | | -| - | BLT | blt rj, rd, offs16 | 操作数视为有符号数 | -| - | BGE | bge rj, rd, offs16 | 操作数视为有符号数 | -| - | BLTU | bltu rj, rd, of fs16 | | -| - | BGEU | bgeu rj, rd, offs16 | | +| √ | BEQ | beq rj, rd, offs16 | | +| √ | BNE | bne rj, rd, offs16 | | +| √ | BLT | blt rj, rd, offs16 | 操作数视为有符号数 | +| √ | BGE | bge rj, rd, offs16 | 操作数视为有符号数 | +| √ | BLTU | bltu rj, rd, of fs16 | | +| √ | BGEU | bgeu rj, rd, offs16 | | | √ | B | | | | √ | BL | | | | √ | JIRL | | | diff --git a/lacpu/rtl/cpu/bru.v b/lacpu/rtl/cpu/bru.v index 7733e5a..c40cc40 100644 --- a/lacpu/rtl/cpu/bru.v +++ b/lacpu/rtl/cpu/bru.v @@ -36,10 +36,10 @@ module bru( } = branch_op; assign rj_eq_rd = (rj_value == rkd_value); - assign rj_lt_rd = (rj_value < rkd_value); - assign rj_ltu_rd = (rj_value[31] && ~rkd_value[31]) ? 1'b1 : - (~rj_value[31] && rkd_value[31]) ? 1'b0 : - rj_lt_rd; + assign rj_ltu_rd = (rj_value < rkd_value); + assign rj_lt_rd = (rj_value[31] && ~rkd_value[31]) ? 1'b1 : + (~rj_value[31] && rkd_value[31]) ? 1'b0 : + rj_ltu_rd; assign br_taken = ( inst_beq && rj_eq_rd || inst_bne && !rj_eq_rd || inst_blt && rj_lt_rd diff --git a/lacpu/rtl/cpu/exe_stage.v b/lacpu/rtl/cpu/exe_stage.v index d8e528d..7566fb8 100755 --- a/lacpu/rtl/cpu/exe_stage.v +++ b/lacpu/rtl/cpu/exe_stage.v @@ -67,6 +67,7 @@ module exe_stage wire br_taken; wire [31:0] br_target; + wire br_flush; wire data_sram_en_temp; @@ -122,6 +123,8 @@ module exe_stage inst //31 :0 }; + assign br_flush = br_taken; + always @ (posedge clk) begin if (reset) begin ds_to_es_bus_r <= 0; @@ -134,7 +137,7 @@ module exe_stage ds_to_es_bus_r <= 0; end //nop, id not stall and br_bus[32] - else if (!stall[2]&br_bus[32]) begin + else if (!stall[2]&br_flush) begin ds_to_es_bus_r <= 0; end // id not stall so can go on @@ -210,8 +213,9 @@ module exe_stage .mul_div_result(mul_div_result ) ); - assign es_result = |mul_div_op ? mul_div_result : - alu_result; + assign es_result = (|mul_div_op ) ? mul_div_result : + (|load_op | |store_op) ? data_sram_addr : + alu_result; assign csr_wdata = csr_wdata_sel ? imm : src1; assign csr_bus = {csr_we, diff --git a/lacpu/rtl/cpu/mem_stage.v b/lacpu/rtl/cpu/mem_stage.v index 41a604b..50c628c 100755 --- a/lacpu/rtl/cpu/mem_stage.v +++ b/lacpu/rtl/cpu/mem_stage.v @@ -135,19 +135,19 @@ module mem_stage .out(byte_sel ) ); - assign ms_result = (inst_ld_b & byte_sel[0]) ? {{24{data_temp[ 7]}}, data_temp[ 7: 0] } : - (inst_ld_b & byte_sel[1]) ? {{16{data_temp[15]}}, data_temp[15: 8], 8'b0} : - (inst_ld_b & byte_sel[2]) ? {{ 8{data_temp[23]}}, data_temp[23:16], 16'b0} : - (inst_ld_b & byte_sel[3]) ? { data_temp[31:24], 24'b0} : - (inst_ld_bu & byte_sel[0]) ? { 24'b0, data_temp[ 7: 0] } : - (inst_ld_bu & byte_sel[1]) ? { 16'b0, data_temp[15: 8], 8'b0} : - (inst_ld_bu & byte_sel[2]) ? { 8'b0, data_temp[23:16], 16'b0} : - (inst_ld_bu & byte_sel[3]) ? { data_temp[31:24], 24'b0} : - (inst_ld_h & byte_sel[0]) ? {{16{data_temp[15]}}, data_temp[15: 0] } : - (inst_ld_h & byte_sel[2]) ? { data_temp[15: 0], 16'b0} : - (inst_ld_hu & byte_sel[0]) ? { 16'b0, data_temp[15: 0] } : - (inst_ld_hu & byte_sel[2]) ? { data_temp[15: 0], 16'b0} : - (inst_ld_w & byte_sel[0]) ? data_temp : + assign ms_result = (inst_ld_b & byte_sel[0]) ? {{24{data_temp[ 7]}}, data_temp[ 7: 0]} : + (inst_ld_b & byte_sel[1]) ? {{24{data_temp[15]}}, data_temp[15: 8]} : + (inst_ld_b & byte_sel[2]) ? {{24{data_temp[23]}}, data_temp[23:16]} : + (inst_ld_b & byte_sel[3]) ? {{24{data_temp[31]}}, data_temp[31:24]} : + (inst_ld_bu & byte_sel[0]) ? { 24'b0, data_temp[ 7: 0]} : + (inst_ld_bu & byte_sel[1]) ? { 24'b0, data_temp[15: 8]} : + (inst_ld_bu & byte_sel[2]) ? { 24'b0, data_temp[23:16]} : + (inst_ld_bu & byte_sel[3]) ? { 24'b0, data_temp[31:24]} : + (inst_ld_h & byte_sel[0]) ? {{16{data_temp[15]}}, data_temp[15: 0]} : + (inst_ld_h & byte_sel[2]) ? {{16{data_temp[31]}}, data_temp[31:16]} : + (inst_ld_hu & byte_sel[0]) ? { 16'b0, data_temp[15: 0]} : + (inst_ld_hu & byte_sel[2]) ? { 16'b0, data_temp[31:16]} : + (inst_ld_w & byte_sel[0]) ? data_temp : 32'b0; // inst_ll ? assign {csr_we,