[Modified] Fix bugs & 46 Functional Test Point PASS
This commit is contained in:
@@ -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 | | |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -135,18 +135,18 @@ 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} :
|
||||
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 ?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user