Zicsr: implement immediate operand instructions

This commit is contained in:
2025-09-05 09:00:58 +03:00
parent 6a42df4da6
commit 71ec54c8d3
2 changed files with 28 additions and 4 deletions
+1
View File
@@ -268,6 +268,7 @@ module rvx0_core #(
.funct3_i (funct3), .funct3_i (funct3),
.rs1_value_i (rs1_value), .rs1_value_i (rs1_value),
.rd_i (rd), .rd_i (rd),
.rs1_i (rs1),
.imm_i (imm), .imm_i (imm),
.exec_ready_o (zicsr_exec_ready), .exec_ready_o (zicsr_exec_ready),
+27 -4
View File
@@ -5,6 +5,7 @@ module rvx0_zicsr (
input wire [2:0] funct3_i, input wire [2:0] funct3_i,
input wire [31:0] rs1_value_i, input wire [31:0] rs1_value_i,
input wire [4:0] rd_i, input wire [4:0] rd_i,
input wire [4:0] rs1_i,
input wire [31:0] imm_i, input wire [31:0] imm_i,
input wire [31:0] csr_value_i, input wire [31:0] csr_value_i,
input wire undefined_csr_i, input wire undefined_csr_i,
@@ -18,9 +19,11 @@ module rvx0_zicsr (
output logic [31:0] csr_read_output_o, output logic [31:0] csr_read_output_o,
output logic [31:0] csr_write_output_o, output logic [31:0] csr_write_output_o,
output logic [11:0] csr_index_o, output logic [11:0] csr_index_o,
output logic csr_write_o, output logic csr_write_o
output logic csr_clk_o
); );
wire [31:0] uimm;
wire value2_immediate;
logic need_csr_read; logic need_csr_read;
logic need_csr_write; logic need_csr_write;
logic single_cycle; logic single_cycle;
@@ -36,20 +39,25 @@ module rvx0_zicsr (
assign csr_index_o = imm_i[11:0]; assign csr_index_o = imm_i[11:0];
assign value2_immediate = funct3_i[2] == 1;
assign uimm = { 27'b0, rs1_i };
assign csrrs_output = value1 | value2; assign csrrs_output = value1 | value2;
assign csrrc_output = value1 & ~value2; assign csrrc_output = value1 & ~value2;
assign exec_ready_o = single_cycle || latch_state == 2; assign exec_ready_o = single_cycle || latch_state == 2;
assign csr_write_o = single_cycle ? need_csr_write : latch_state == 2; assign csr_write_o = single_cycle ? need_csr_write : latch_state == 2;
assign regfile_clk_o = single_cycle ? need_csr_read : latch_state == 2; assign regfile_clk_o = (single_cycle || value2_immediate) ? need_csr_read : latch_state == 2;
assign value1 = single_cycle ? csr_value_i : csr_value_latch; assign value1 = single_cycle ? csr_value_i : csr_value_latch;
assign value2 = single_cycle ? rs1_value_i : rs1_value_latch; assign value2 = value2_immediate ? uimm : (single_cycle ? rs1_value_i : rs1_value_latch);
assign csr_read_output_o = single_cycle ? csr_value_i : csr_value_latch; assign csr_read_output_o = single_cycle ? csr_value_i : csr_value_latch;
always_comb begin always_comb begin
instruction_fault_o = undefined_csr_i; instruction_fault_o = undefined_csr_i;
need_csr_read = 0; need_csr_read = 0;
need_csr_write = 0;
single_cycle = 0; single_cycle = 0;
csr_write_output_o = 0; csr_write_output_o = 0;
@@ -70,6 +78,21 @@ module rvx0_zicsr (
need_csr_write = rs1_value_i != 0; need_csr_write = rs1_value_i != 0;
csr_write_output_o = csrrc_output; csr_write_output_o = csrrc_output;
end end
3'b101: begin // csrrwi
need_csr_read = rd_i != 0;
need_csr_write = 1;
csr_write_output_o = uimm;
end
3'b110: begin // csrrsi
need_csr_read = 1;
need_csr_write = uimm != 0;
csr_write_output_o = csrrs_output;
end
3'b111: begin
need_csr_read = 1;
need_csr_write = uimm != 0;
csr_write_output_o = csrrc_output;
end
// TODO csrrwi, csrrsi, csrrci // TODO csrrwi, csrrsi, csrrci
default: instruction_fault_o = 1; default: instruction_fault_o = 1;
endcase endcase