diff --git a/cpu21_riscv_alu.v b/cpu21_riscv_alu.v index 99cde79..7bec9fe 100644 --- a/cpu21_riscv_alu.v +++ b/cpu21_riscv_alu.v @@ -27,6 +27,7 @@ module cpu21_riscv_alu ( localparam ALU_NOR = 4'd10; localparam ALU_SLT = 4'd11; localparam ALU_SLTU = 4'd12; + localparam ALU_PASSB = 4'd15; // 直接输出 B 端(供 LUI 使用) reg [63:0] mult_result; always @* begin @@ -52,6 +53,7 @@ module cpu21_riscv_alu ( ALU_NOR: result = ~(a | b); ALU_SLT: result = ($signed(a) < $signed(b)) ? 32'd1 : 32'd0; ALU_SLTU: result = (a < b) ? 32'd1 : 32'd0; + ALU_PASSB: result = b; default: result = 32'b0; endcase end diff --git a/cpu21_riscv_decoder.v b/cpu21_riscv_decoder.v index b122e98..32a9675 100644 --- a/cpu21_riscv_decoder.v +++ b/cpu21_riscv_decoder.v @@ -47,6 +47,8 @@ module cpu21_riscv_decoder ( localparam OP_BRANCH = 5'h18; localparam OP_JAL = 5'h1b; localparam OP_SYS = 5'h1c; + // LUI 为扩展指令(标准 RISC-V opcode 0x37 -> IR[6:2]=0x0d)。 + localparam OP_LUI = 5'h0d; localparam ALU_SLL = 4'd0; localparam ALU_SRA = 4'd1; @@ -60,6 +62,7 @@ module cpu21_riscv_decoder ( localparam ALU_XOR = 4'd9; localparam ALU_SLT = 4'd11; localparam ALU_SLTU = 4'd12; + localparam ALU_PASSB = 4'd15; // LUI:直接输出 B 端(立即数) wire [4:0] opcode = ir_i[6:2]; wire [2:0] funct3 = ir_i[14:12]; @@ -143,6 +146,16 @@ module cpu21_riscv_decoder ( endcase end + // 加载高位立即数 lui:rd = imm[31:12] << 12。 + // 不读寄存器;用 ALU_SRC 选立即数,ALU 直通 B 端输出。 + OP_LUI: begin + reg_write_o = 1'b1; + alu_src_o = 1'b1; + alu_op_o = ALU_PASSB; + imm_o = {ir_i[31:12], 12'b0}; + wb_sel_o = 3'd0; + end + // 加载指令,当前仅支持 lw(funct3=010)。 OP_LOAD: begin if (funct3 == 3'b010) begin diff --git a/cpu21_riscv_redirect_int_bpb说明.md b/cpu21_riscv_redirect_int_bpb说明.md index 362e301..24ade59 100644 --- a/cpu21_riscv_redirect_int_bpb说明.md +++ b/cpu21_riscv_redirect_int_bpb说明.md @@ -18,6 +18,7 @@ - CSRRSI、CSRRCI,以及 CSRRW:支持 CSR 地址 `0x004`(`ustatus`)和 `0x041`(`uepc`)。立即数为 `IR[19:15]` 的零扩展值,并按 RISC-V 规则把旧 CSR 值写回 `rd`;这覆盖任务书中的 `csrrsi s6,0x41,0` 和 `csrrw zero,0x41,s6` 用法。 - `ecall`:`a7 == 34` 时把 `a0` 锁存到 `led_data_o`;否则置 `halted_o`,直到 `go_i` 为高。 - `sw` 和 `sb`:输出 `data_wstrb_o`,支持按字节写入。 +- `lui`:加载高位立即数,`rd = imm[31:12] << 12`(按需求补充的扩展指令,标准 opcode `0x37`)。 ## 指令编码 @@ -28,6 +29,7 @@ | ------------------------------ | -----: | --------------------------------------- | | R 型 | `0x0c` | add/sub/and/or/xor/slt/sltu/sll/srl/sra | | I 型 ALU | `0x04` | addi/andi/ori/xori/slti/slli/srli/srai | +| `lui`(扩展) | `0x0d` | 加载高位立即数,`rd = imm[31:12] << 12` | | `lw` | `0x00` | `funct3=010` | | `sw` / `sb` | `0x08` | `funct3=010` / `000` | | `beq` / `bne` / `blt` / `bltu` | `0x18` | `funct3=000` / `001` / `100` / `110` |