Zicsr: implement immediate operand instructions
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user