Line 102... |
Line 102... |
reg servicing_cache = 'd0;
|
reg servicing_cache = 'd0;
|
wire [3:0] byte_enable;
|
wire [3:0] byte_enable;
|
reg exclusive_access = 'd0;
|
reg exclusive_access = 'd0;
|
wire read_ack;
|
wire read_ack;
|
wire wait_write_ack;
|
wire wait_write_ack;
|
|
wire wb_wait;
|
|
|
|
// Write buffer
|
|
reg [31:0] wbuf_data_r = 'd0;
|
|
reg [31:0] wbuf_addr_r = 'd0;
|
|
reg [3:0] wbuf_sel_r = 'd0;
|
|
reg wbuf_busy_r = 'd0;
|
|
|
|
|
assign read_ack = !o_wb_we && i_wb_ack;
|
assign read_ack = !o_wb_we && i_wb_ack;
|
assign o_stall = ( core_read_request && !read_ack ) ||
|
assign o_stall = ( core_read_request && !read_ack ) ||
|
( core_read_request && servicing_cache ) ||
|
( core_read_request && servicing_cache ) ||
|
( core_write_request && servicing_cache ) ;
|
( core_write_request && servicing_cache ) ||
|
|
( core_write_request && wishbone_st == WB_WAIT_ACK) ||
|
|
( cache_write_request && wishbone_st == WB_WAIT_ACK) ||
|
|
wbuf_busy_r;
|
|
|
// Don't stall on writes
|
// Don't stall on writes
|
// Wishbone is doing burst read so make core wait to execute the write
|
// Wishbone is doing burst read so make core wait to execute the write
|
// ( core_write_request && !i_wb_ack ) ;
|
// ( core_write_request && !i_wb_ack ) ;
|
|
|
Line 120... |
Line 129... |
assign core_write_request = i_select && i_write_enable;
|
assign core_write_request = i_select && i_write_enable;
|
|
|
assign cache_read_request = i_cache_req && !i_write_enable;
|
assign cache_read_request = i_cache_req && !i_write_enable;
|
assign cache_write_request = i_cache_req && i_write_enable;
|
assign cache_write_request = i_cache_req && i_write_enable;
|
|
|
assign start_access = core_read_request || core_write_request || i_cache_req ;
|
assign wb_wait = o_wb_stb && !i_wb_ack;
|
|
assign start_access = (core_read_request || core_write_request || i_cache_req) && !wb_wait ;
|
|
|
// For writes the byte enable is always 4'hf
|
// For writes the byte enable is always 4'hf
|
assign byte_enable = ( core_write_request || cache_write_request ) ? i_byte_enable : 4'hf;
|
assign byte_enable = wbuf_busy_r ? wbuf_sel_r :
|
|
( core_write_request || cache_write_request ) ? i_byte_enable :
|
|
4'hf ;
|
|
|
|
|
|
|
|
// ======================================
|
|
// Write buffer
|
|
// ======================================
|
|
|
|
|
|
always @( posedge i_clk )
|
|
if ( wb_wait && !wbuf_busy_r && (core_write_request || cache_write_request) )
|
|
begin
|
|
wbuf_data_r <= i_write_data;
|
|
wbuf_addr_r <= i_address;
|
|
wbuf_sel_r <= i_byte_enable;
|
|
wbuf_busy_r <= 1'd1;
|
|
end
|
|
else if (!o_wb_stb)
|
|
wbuf_busy_r <= 1'd0;
|
|
|
// ======================================
|
// ======================================
|
// Register Accesses
|
// Register Accesses
|
// ======================================
|
// ======================================
|
always @( posedge i_clk )
|
always @( posedge i_clk )
|
if ( start_access )
|
if ( start_access )
|
Line 185... |
Line 214... |
exclusive_access <= i_exclusive;
|
exclusive_access <= i_exclusive;
|
|
|
|
|
if ( start_access )
|
if ( start_access )
|
begin
|
begin
|
|
if (wbuf_busy_r)
|
|
begin
|
|
o_wb_we <= 1'd1;
|
|
o_wb_adr[31:2] <= wbuf_addr_r[31:2];
|
|
end
|
|
else
|
|
begin
|
o_wb_we <= core_write_request || cache_write_request;
|
o_wb_we <= core_write_request || cache_write_request;
|
// only update these on new wb access to make debug easier
|
// only update these on new wb access to make debug easier
|
o_wb_adr[31:2] <= i_address[31:2];
|
o_wb_adr[31:2] <= i_address[31:2];
|
|
end
|
|
|
o_wb_adr[1:0] <= byte_enable == 4'b0001 ? 2'd0 :
|
o_wb_adr[1:0] <= byte_enable == 4'b0001 ? 2'd0 :
|
byte_enable == 4'b0010 ? 2'd1 :
|
byte_enable == 4'b0010 ? 2'd1 :
|
byte_enable == 4'b0100 ? 2'd2 :
|
byte_enable == 4'b0100 ? 2'd2 :
|
byte_enable == 4'b1000 ? 2'd3 :
|
byte_enable == 4'b1000 ? 2'd3 :
|
|
|