131 lines
3.8 KiB
Verilog
131 lines
3.8 KiB
Verilog
`default_nettype wire
|
|
|
|
module uncache
|
|
#(
|
|
parameter STAGE_WD = 4,
|
|
parameter WAIT = 4'b1000,
|
|
parameter IDLE = 4'b0001,
|
|
parameter BUFFER = 4'b0010
|
|
)
|
|
(
|
|
input clk,
|
|
input resetn,
|
|
output stallreq,
|
|
|
|
input conf_en,
|
|
input [ 3:0] conf_we,
|
|
input [31:0] conf_addr,
|
|
input [31:0] conf_wdata,
|
|
output reg [31:0] conf_rdata,
|
|
|
|
output reg axi_en, // en
|
|
output reg [ 3:0] axi_wsel, // we
|
|
output reg [31:0] axi_addr, // addr
|
|
output reg [31:0] axi_wdata,
|
|
|
|
input reload,
|
|
input [31:0] axi_rdata
|
|
);
|
|
reg valid;
|
|
reg finish;
|
|
reg buffer_valid;
|
|
reg [STAGE_WD -1:0] stage;
|
|
|
|
wire conf_rd_req;
|
|
wire conf_wr_req;
|
|
|
|
assign conf_rd_req = conf_en & ~valid & ~(|conf_we);
|
|
assign conf_wr_req = conf_en & ~valid & (|conf_we);
|
|
|
|
assign stallreq = conf_rd_req & ~valid | conf_wr_req & buffer_valid & ~valid | stage[3];
|
|
always @ (posedge clk) begin
|
|
if (!resetn) begin
|
|
valid <= 1'b0;
|
|
end
|
|
else if (finish) begin
|
|
valid <= 1'b1;
|
|
end
|
|
else begin
|
|
valid <= 1'b0;
|
|
end
|
|
end
|
|
|
|
// assign rd_req = conf_en & ~valid & ~(|conf_we);
|
|
// assign rd_addr = conf_addr;
|
|
// assign wr_req = conf_en & ~valid & (|conf_we);
|
|
// assign wr_wstrb = conf_we;
|
|
// assign wr_addr = conf_addr;
|
|
// assign wr_data = conf_wdata;
|
|
|
|
always @ (posedge clk) begin
|
|
if (!resetn) begin
|
|
conf_rdata <= 32'b0;
|
|
end
|
|
else if (reload) begin
|
|
conf_rdata <= axi_rdata;
|
|
end
|
|
end
|
|
|
|
always @ (posedge clk) begin
|
|
if (!resetn) begin
|
|
buffer_valid <= 1'b0;
|
|
|
|
stage <= {{(STAGE_WD-1){1'b0}}, 1'b1};
|
|
finish <= 1'b0;
|
|
|
|
axi_en <= 1'b0;
|
|
axi_wsel <= 4'b0;
|
|
axi_addr <= 32'b0;
|
|
axi_wdata <= 32'b0;
|
|
end
|
|
else begin
|
|
case(1'b1)
|
|
stage[0]:begin
|
|
if (conf_rd_req & ~buffer_valid) begin
|
|
axi_en <= 1'b1;
|
|
axi_wsel <= conf_we;
|
|
axi_addr <= conf_addr;
|
|
axi_wdata <= conf_wdata;
|
|
stage <= WAIT;
|
|
end
|
|
else if (conf_wr_req & ~buffer_valid) begin
|
|
axi_en <= 1'b1;
|
|
axi_wsel <= conf_we;
|
|
axi_addr <= conf_addr;
|
|
axi_wdata <= conf_wdata;
|
|
buffer_valid <= 1'b1;
|
|
// finish <= 1'b1;
|
|
stage <= BUFFER;
|
|
end
|
|
end
|
|
stage[1]:begin //BUFFER
|
|
// finish <= 1'b0;
|
|
if (reload) begin
|
|
buffer_valid <= 1'b0;
|
|
axi_en <= 1'b0;
|
|
axi_wsel <= 4'b0;
|
|
axi_addr <= 32'b0;
|
|
axi_wdata <= 32'b0;
|
|
stage <= IDLE;
|
|
end
|
|
end
|
|
stage[3]:begin
|
|
if (reload) begin
|
|
axi_en <= 1'b0;
|
|
axi_wsel <= 4'b0;
|
|
axi_addr <= 32'b0;
|
|
axi_wdata <= 32'b0;
|
|
finish <= 1'b1;
|
|
end
|
|
else if (finish) begin
|
|
finish <= 1'b0;
|
|
stage <= {{(STAGE_WD-1){1'b0}}, 1'b1};
|
|
end
|
|
end
|
|
default:begin
|
|
stage <= {{(STAGE_WD-1){1'b0}}, 1'b1};
|
|
end
|
|
endcase
|
|
end
|
|
end
|
|
endmodule |