OpenCores
URL https://opencores.org/ocsvn/amber/amber/trunk

Subversion Repositories amber

[/] [amber/] [trunk/] [hw/] [vlog/] [amber23/] [a23_wishbone.v] - Diff between revs 15 and 42

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 15 Rev 42
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 :
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.