ibuffer addition
This commit is contained in:
@@ -7,7 +7,7 @@ module VX_csr_unit #(
|
||||
input wire reset,
|
||||
|
||||
VX_cmt_to_csr_if cmt_to_csr_if,
|
||||
VX_csr_to_fpu_if csr_to_fpu_if,
|
||||
VX_csr_to_issue_if csr_to_issue_if,
|
||||
|
||||
VX_csr_io_req_if csr_io_req_if,
|
||||
VX_csr_io_rsp_if csr_io_rsp_if,
|
||||
@@ -15,16 +15,13 @@ module VX_csr_unit #(
|
||||
VX_csr_req_if csr_req_if,
|
||||
VX_exu_to_cmt_if csr_commit_if
|
||||
);
|
||||
VX_csr_req_if csr_pipe_req_if();
|
||||
VX_csr_rsp_if csr_pipe_rsp_if();
|
||||
VX_csr_req_if csr_pipe_req_if();
|
||||
VX_exu_to_cmt_if csr_pipe_rsp_if();
|
||||
|
||||
wire select_io_req = csr_io_req_if.valid;
|
||||
wire select_io_rsp;
|
||||
|
||||
VX_csr_arb csr_arb (
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
.csr_core_req_if (csr_req_if),
|
||||
.csr_io_req_if (csr_io_req_if),
|
||||
.csr_req_if (csr_pipe_req_if),
|
||||
@@ -41,7 +38,6 @@ module VX_csr_unit #(
|
||||
wire [`CSR_ADDR_BITS-1:0] csr_addr_s1;
|
||||
wire [31:0] csr_read_data, csr_read_data_s1;
|
||||
wire [31:0] csr_updated_data_s1;
|
||||
wire [`NW_BITS-1:0] wid_s1;
|
||||
|
||||
VX_csr_data #(
|
||||
.CORE_ID(CORE_ID)
|
||||
@@ -49,7 +45,7 @@ module VX_csr_unit #(
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.cmt_to_csr_if (cmt_to_csr_if),
|
||||
.csr_to_fpu_if (csr_to_fpu_if),
|
||||
.csr_to_issue_if (csr_to_issue_if),
|
||||
.read_enable (csr_pipe_req_if.valid),
|
||||
.read_addr (csr_pipe_req_if.csr_addr),
|
||||
.read_data (csr_read_data),
|
||||
@@ -60,7 +56,7 @@ module VX_csr_unit #(
|
||||
);
|
||||
|
||||
wire csr_hazard = (csr_addr_s1 == csr_pipe_req_if.csr_addr)
|
||||
&& (wid_s1 == csr_pipe_req_if.wid)
|
||||
&& (csr_pipe_rsp_if.wid == csr_pipe_req_if.wid)
|
||||
&& csr_pipe_rsp_if.valid;
|
||||
|
||||
wire [31:0] csr_read_data_qual = csr_hazard ? csr_updated_data_s1 : csr_read_data;
|
||||
@@ -86,21 +82,21 @@ module VX_csr_unit #(
|
||||
end
|
||||
default: csr_updated_data = 32'hdeadbeef;
|
||||
endcase
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
wire csr_we_s0 = csr_we_s0_unqual && csr_pipe_req_if.valid;
|
||||
|
||||
wire stall = ~csr_pipe_rsp_if.ready && csr_pipe_rsp_if.valid;
|
||||
|
||||
VX_generic_register #(
|
||||
.N(1 + `ISTAG_BITS + `NW_BITS + 1 + `CSR_ADDR_BITS + 1 + 32 + 32)
|
||||
.N(1 + `NW_BITS + `NUM_THREADS + 32 + `NR_BITS + 1 + 1 + `CSR_ADDR_BITS + 1 + 32 + 32)
|
||||
) csr_reg (
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.stall (stall),
|
||||
.flush (0),
|
||||
.in ({csr_pipe_req_if.valid, csr_pipe_req_if.issue_tag, csr_pipe_req_if.wid, csr_we_s0, csr_pipe_req_if.csr_addr, csr_pipe_req_if.is_io, csr_read_data_qual, csr_updated_data}),
|
||||
.out ({csr_pipe_rsp_if.valid, csr_pipe_rsp_if.issue_tag, wid_s1, csr_we_s1, csr_addr_s1, select_io_rsp, csr_read_data_s1, csr_updated_data_s1})
|
||||
.in ({csr_pipe_req_if.valid, csr_pipe_req_if.wid, csr_pipe_req_if.thread_mask, csr_pipe_req_if.curr_PC, csr_pipe_req_if.rd, csr_pipe_req_if.wb, csr_we_s0, csr_pipe_req_if.csr_addr, csr_pipe_req_if.is_io, csr_read_data_qual, csr_updated_data}),
|
||||
.out ({csr_pipe_rsp_if.valid, csr_pipe_rsp_if.wid, csr_pipe_rsp_if.thread_mask, csr_pipe_rsp_if.curr_PC, csr_pipe_rsp_if.rd, csr_pipe_rsp_if.wb, csr_we_s1, csr_addr_s1, select_io_rsp, csr_read_data_s1, csr_updated_data_s1})
|
||||
);
|
||||
|
||||
for (genvar i = 0; i < `NUM_THREADS; i++) begin
|
||||
@@ -109,6 +105,7 @@ module VX_csr_unit #(
|
||||
csr_read_data_s1;
|
||||
end
|
||||
|
||||
// can accept new request?
|
||||
assign csr_pipe_req_if.ready = ~stall;
|
||||
|
||||
endmodule
|
||||
|
||||
Reference in New Issue
Block a user