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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_3/] [rtl/] [verilog/] [pci_master32_sm_if.v] - Diff between revs 6 and 21

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

Rev 6 Rev 21
Line 40... Line 40...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.2  2001/10/05 08:14:29  mihad
 
// Updated all files with inclusion of timescale file for simulation purposes.
 
//
// Revision 1.1.1.1  2001/10/02 15:33:46  mihad
// Revision 1.1.1.1  2001/10/02 15:33:46  mihad
// New project directory structure
// New project directory structure
//
//
//
//
 
 
`include "constants.v"
`include "pci_constants.v"
`include "bus_commands.v"
`include "bus_commands.v"
 
 
 
// synopsys translate_off
`include "timescale.v"
`include "timescale.v"
 
// synopsys translate_on
 
 
/*====================================================================
/*====================================================================
Module provides interface between PCI bridge internals and PCI master
Module provides interface between PCI bridge internals and PCI master
state machine
state machine
====================================================================*/
====================================================================*/
Line 77... Line 83...
    // status inputs from master SM
    // status inputs from master SM
    wait_in,
    wait_in,
    wtransfer_in,
    wtransfer_in,
    rtransfer_in,
    rtransfer_in,
    retry_in,
    retry_in,
    werror_in,
 
    rerror_in,
    rerror_in,
    first_in ,
    first_in ,
    mabort_in,
    mabort_in,
 
 
 
 
Line 115... Line 120...
    // error reporting
    // error reporting
    err_addr_out,
    err_addr_out,
    err_bc_out,
    err_bc_out,
    err_signal_out,
    err_signal_out,
    err_source_out,
    err_source_out,
    err_pending_in,
 
    err_rty_exp_out,
    err_rty_exp_out,
 
 
    cache_line_size_in,
    cache_line_size_in,
 
 
    // two signals for pci control and status 
    // two signals for pci control and status 
    mabort_received_out,
    mabort_received_out,
    tabort_received_out
    tabort_received_out,
 
 
 
    posted_write_not_present_out
);
);
 
 
// system inputs
// system inputs
input clk_in ;
input clk_in ;
input reset_in ;
input reset_in ;
Line 157... Line 163...
 
 
input           wait_in,
input           wait_in,
                wtransfer_in,
                wtransfer_in,
                rtransfer_in,
                rtransfer_in,
                retry_in,
                retry_in,
                werror_in,
 
                rerror_in,
                rerror_in,
                first_in ,
                first_in ,
                mabort_in ;
                mabort_in ;
 
 
// WISHBONE write fifo interconnect
// WISHBONE write fifo interconnect
Line 202... Line 207...
 
 
output          err_signal_out ;                // error signalization
output          err_signal_out ;                // error signalization
 
 
output          err_source_out ;                // error source indicator
output          err_source_out ;                // error source indicator
 
 
input           err_pending_in ;
 
 
 
input   [7:0]   cache_line_size_in ;            // cache line size value input
input   [7:0]   cache_line_size_in ;            // cache line size value input
 
 
output          err_rty_exp_out ;               // retry expired error output
output          err_rty_exp_out ;               // retry expired error output
 
 
output          mabort_received_out ;           // master abort signaled to status register
output          mabort_received_out ;           // master abort signaled to status register
output          tabort_received_out ;           // target abort signaled to status register
output          tabort_received_out ;           // target abort signaled to status register
 
 
 
output          posted_write_not_present_out ;  // used in target state machine - must deny read completions when this signal is 0
 
 
 
 
assign err_bc_out   = bc_out ;
assign err_bc_out   = bc_out ;
 
 
// assign read outputs
// assign read outputs
/*==================================================================================================================
/*==================================================================================================================
Line 255... Line 260...
 
 
// error recovery indicator
// error recovery indicator
reg err_recovery ;
reg err_recovery ;
 
 
// operation is locked until error recovery is in progress or error bit is not cleared in configuration space
// operation is locked until error recovery is in progress or error bit is not cleared in configuration space
wire err_lock = err_recovery || err_pending_in ;
wire err_lock = err_recovery ;
 
 
// three requests are possible - posted write, delayed write and delayed read
// three requests are possible - posted write, delayed write and delayed read
reg del_write_req ;
reg del_write_req ;
reg posted_write_req ;
reg posted_write_req ;
reg del_read_req ;
reg del_read_req ;
 
 
// assign request output
// assign request output
assign req_out = del_write_req || posted_write_req || del_read_req ;
assign req_out = del_write_req || posted_write_req || del_read_req ;
 
 
 
// posted write is not present, when WB Write Fifo is empty and posted write transaction is not beeing requested at present time
 
assign posted_write_not_present_out = !posted_write_req && wbw_fifo_empty_in ;
 
 
// write requests are staged, so data is read from source into current data register and next data register
// write requests are staged, so data is read from source into current data register and next data register
reg write_req_int ;
reg write_req_int ;
always@(posedge reset_in or posedge clk_in)
always@(posedge reset_in or posedge clk_in)
begin
begin
    if ( reset_in )
    if ( reset_in )
Line 315... Line 323...
end
end
 
 
// multiplexer for data output to PCI MASTER state machine
// multiplexer for data output to PCI MASTER state machine
reg [31:0] source_data ;
reg [31:0] source_data ;
reg [3:0]  source_be ;
reg [3:0]  source_be ;
always@(data_source or wbw_fifo_addr_data_in or wbw_fifo_cbe_in or del_wdata_in or del_be_in)
always@(data_source or wbw_fifo_addr_data_in or wbw_fifo_cbe_in or del_wdata_in or del_be_in or del_burst_in)
begin
begin
    case (data_source)
    case (data_source)
        POSTED_WRITE:   begin
        POSTED_WRITE:   begin
                            source_data = wbw_fifo_addr_data_in ;
                            source_data = wbw_fifo_addr_data_in ;
                            source_be   = wbw_fifo_cbe_in ;
                            source_be   = wbw_fifo_cbe_in ;
                        end
                        end
        DELAYED_WRITE:  begin
        DELAYED_WRITE:  begin
                            source_data = del_wdata_in ;
                            source_data = del_wdata_in ;
                            source_be   = ~del_be_in ;
                            // read all bytes during delayed burst read!
 
                            source_be   = ~( del_be_in | {4{del_burst_in}} ) ;
                        end
                        end
    endcase
    endcase
end
end
 
 
wire            waddr =  wbw_fifo_control_in[`ADDR_CTRL_BIT] ;
wire            waddr =  wbw_fifo_control_in[`ADDR_CTRL_BIT] ;
Line 340... Line 349...
// load address and bus command from wbw_fifo, else load data from delayed transaction logic
// load address and bus command from wbw_fifo, else load data from delayed transaction logic
wire     [31:0] new_address = ( ~req_out && do_posted_write ) ? wbw_fifo_addr_data_in[31:0] : del_addr_in[31:0] ;
wire     [31:0] new_address = ( ~req_out && do_posted_write ) ? wbw_fifo_addr_data_in[31:0] : del_addr_in[31:0] ;
wire     [3:0]  new_bc      = ( ~req_out && do_posted_write ) ? wbw_fifo_cbe_in : del_bc_in ;
wire     [3:0]  new_bc      = ( ~req_out && do_posted_write ) ? wbw_fifo_cbe_in : del_bc_in ;
 
 
// address counter enable - only for posted writes when data is actually transfered
// address counter enable - only for posted writes when data is actually transfered
wire addr_count_en = ~wait_in && posted_write_req && wtransfer_in ;
wire addr_count_en = ~wait_in && posted_write_req && rtransfer_in ;
 
 
always@(posedge reset_in or posedge clk_in)
always@(posedge reset_in or posedge clk_in)
begin
begin
    if (reset_in)
    if (reset_in)
        bc_out <= #`FF_DELAY `BC_RESERVED0 ;
        bc_out <= #`FF_DELAY `BC_RESERVED0 ;
    else
    else
    if (address_change)
    if (address_change)
        bc_out <= #`FF_DELAY new_bc ;
        bc_out <= #`FF_DELAY new_bc ;
end
end
 
 
reg [31:2] current_dword_address ;
reg [29:0] current_dword_address ;
 
 
// DWORD address counter with load
// DWORD address counter with load
always@(posedge reset_in or posedge clk_in)
always@(posedge reset_in or posedge clk_in)
begin
begin
    if (reset_in)
    if (reset_in)
Line 389... Line 398...
wire read_count_enable = ~wait_in && del_read_req && del_burst_in && wtransfer_in  ;
wire read_count_enable = ~wait_in && del_read_req && del_burst_in && wtransfer_in  ;
 
 
// cache line counter is loaded when del read request is not in progress
// cache line counter is loaded when del read request is not in progress
wire read_count_load   = ~del_read_req ;
wire read_count_load   = ~del_read_req ;
 
 
reg [8:0] max_read_count ;
reg [(`WBR_ADDR_LENGTH - 1):0] max_read_count ;
always@(cache_line_size_in or del_bc_in)
always@(cache_line_size_in or del_bc_in)
begin
begin
    if ( (cache_line_size_in >= `WBR_DEPTH) || (~del_bc_in[1] && ~del_bc_in[0]) )
    if ( (cache_line_size_in >= `WBR_DEPTH) || (~del_bc_in[1] && ~del_bc_in[0]) )
        max_read_count = `WBR_DEPTH - 1'b1;
        max_read_count = `WBR_DEPTH - 1'b1;
    else
    else
        max_read_count = cache_line_size_in ;
        max_read_count = cache_line_size_in ;
end
end
 
 
reg [8:0] read_count ;
reg [(`WBR_ADDR_LENGTH - 1):0] read_count ;
 
 
// cache line bound indicator - it signals when data for one complete cacheline was read
// cache line bound indicator - it signals when data for one complete cacheline was read
wire read_bound_comb = ~|(read_count[8:2]) ;
wire read_bound_comb = ~|(read_count[(`WBR_ADDR_LENGTH - 1):2]) ;
reg  read_bound ;
reg  read_bound ;
always@(posedge clk_in)
always@(posedge clk_in or posedge reset_in)
begin
begin
    if (read_count_load)
    if ( reset_in )
 
        read_bound <= #`FF_DELAY 1'b0 ;
 
    else if (read_count_load)
        read_bound <= #`FF_DELAY 1'b0 ;
        read_bound <= #`FF_DELAY 1'b0 ;
    else if ( read_count_enable )
    else if ( read_count_enable )
        read_bound <= #`FF_DELAY read_bound_comb ;
        read_bound <= #`FF_DELAY read_bound_comb ;
end
end
 
 
// down counter with load
// down counter with load
always@(posedge reset_in or posedge clk_in)
always@(posedge reset_in or posedge clk_in)
begin
begin
    if (reset_in)
    if (reset_in)
        read_count <= #`FF_DELAY 8'h00 ;
        read_count <= #`FF_DELAY 0 ;
    else
    else
    if (read_count_load)
    if (read_count_load)
        read_count <= #`FF_DELAY max_read_count ;
        read_count <= #`FF_DELAY max_read_count ;
    else
    else
    if (read_count_enable)
    if (read_count_enable)
Line 705... Line 716...
wire   del_write_complete = del_write_req && ( rtransfer_in || rerror_in || mabort_in ) ;
wire   del_write_complete = del_write_req && ( rtransfer_in || rerror_in || mabort_in ) ;
wire   del_read_complete  = del_read_req  && ( rerror_in || mabort_in || ( last_transfered ) || ( retry_in && ~first_in ) ) ;
wire   del_read_complete  = del_read_req  && ( rerror_in || mabort_in || ( last_transfered ) || ( retry_in && ~first_in ) ) ;
 
 
assign del_complete_out = ~wait_in && ( del_write_complete || del_read_complete ) ;
assign del_complete_out = ~wait_in && ( del_write_complete || del_read_complete ) ;
 
 
 
 
// next last output generation
// next last output generation
assign next_last_out = del_write_req || del_read_req && ( ~del_burst_in || read_bound ) || posted_write_req && ( write_next_last ) ;
assign next_last_out = del_write_req || del_read_req && ( ~del_burst_in || read_bound ) || posted_write_req && ( write_next_last ) ;
/*==================================================================================================================
/*==================================================================================================================
Error recovery FF gets a value of one, when during posted write error occurs. It is cleared when all the data provided
Error recovery FF gets a value of one, when during posted write error occurs. It is cleared when all the data provided
for erroneous transaction is pulled out of WBW_FIFO
for erroneous transaction is pulled out of WBW_FIFO
Line 730... Line 740...
    else
    else
        // when error recovery is set, wbw_fifo is enabled - clear err_recovery when last data entry of erroneous transaction is pulled out of fifo
        // when error recovery is set, wbw_fifo is enabled - clear err_recovery when last data entry of erroneous transaction is pulled out of fifo
        err_recovery_in = ~wlast ;
        err_recovery_in = ~wlast ;
end
end
 
 
wire data_load_slow = (req_out && ~rdy_out) && (del_read_req || write_req_int) ;
wire data_out_load = (posted_write_req || del_write_req) && ( !rdy_out || ( !wait_in && rtransfer_in ) ) ;
wire data_load_en   = posted_write_req && ~last_out && ~wait_in ;
 
wire data_be_load = data_load_slow || (data_load_en && wtransfer_in) ;
wire be_out_load  = (req_out && !rdy_out) || ( posted_write_req && !wait_in && rtransfer_in ) ;
 
 
wire last_load  = req_out && ( ~rdy_out || ~wait_in && wtransfer_in ) ;
wire last_load  = req_out && ( ~rdy_out || ~wait_in && wtransfer_in ) ;
 
 
always@(posedge reset_in or posedge clk_in)
always@(posedge reset_in or posedge clk_in)
begin
begin
    if (reset_in)
    if (reset_in)
    begin
 
        be_out   <= #`FF_DELAY 4'hF ;
 
        data_out <= #`FF_DELAY 32'h0000_0000 ;
        data_out <= #`FF_DELAY 32'h0000_0000 ;
    end
 
    else
    else
    if ( data_be_load )
    if ( data_out_load )
    begin
        data_out <= #`FF_DELAY intermediate_data ;
        data_out <= #`FF_DELAY next_data_out ;
 
        be_out   <= #`FF_DELAY next_be_out ;
 
    end
    end
 
 
 
always@(posedge clk_in or posedge reset_in)
 
begin
 
    if ( reset_in )
 
        be_out <= #`FF_DELAY 4'hF ;
 
    else
 
    if ( be_out_load )
 
        be_out <= #`FF_DELAY posted_write_req ? intermediate_be : source_be ;
end
end
 
 
always@(posedge reset_in or posedge clk_in)
always@(posedge reset_in or posedge clk_in)
begin
begin
    if (reset_in)
    if (reset_in)
Line 762... Line 775...
        current_last <= #`FF_DELAY next_last_out ;
        current_last <= #`FF_DELAY next_last_out ;
end
end
 
 
assign last_out = current_last ;
assign last_out = current_last ;
endmodule
endmodule
 No newline at end of file
 No newline at end of file
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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