实现 LUI 指令(加载高位立即数)
- cpu21_riscv_alu.v:新增 ALU_PASSB(4'd15),直接把 B 端送到 result;
- cpu21_riscv_decoder.v:新增 OP_LUI(IR[6:2]=0x0d,即标准 RISC-V opcode 0x37),
imm = {IR[31:12], 12'b0},用 ALU_SRC 选择立即数、ALU 直通输出写回 rd,
不读源寄存器(uses_rs1/rs2 保持 0);
- 说明文档补充 lui 的功能说明与编码表行。
验证(xsim + tb_no_intr,自编的小汇编器生成测试程序):
依次输出 12345000 / fffff000 / 80000000,以及 lui+addi 组合得到 12345678,
随后 a7=10 停机(共 21 周期,halted=1),无编译错误与警告。
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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` |
|
||||
|
||||
Reference in New Issue
Block a user