[Modified] Fix bugs & 46 Functional Test Point PASS

This commit is contained in:
2023-06-26 20:30:39 +08:00
parent 38f1ea7eda
commit 7a879edcb6
4 changed files with 39 additions and 57 deletions

View File

@@ -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 | | |

View File

@@ -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 :
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_lt_rd;
rj_ltu_rd;
assign br_taken = ( inst_beq && rj_eq_rd
|| inst_bne && !rj_eq_rd
|| inst_blt && rj_lt_rd

View File

@@ -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,7 +213,8 @@ module exe_stage
.mul_div_result(mul_div_result )
);
assign es_result = |mul_div_op ? mul_div_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;

View File

@@ -136,17 +136,17 @@ module mem_stage
);
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_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]) ? { 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_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]) ? { data_temp[15: 0], 16'b0} :
(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]) ? { data_temp[15: 0], 16'b0} :
(inst_ld_hu & byte_sel[2]) ? { 16'b0, data_temp[31:16]} :
(inst_ld_w & byte_sel[0]) ? data_temp :
32'b0; // inst_ll ?