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

Subversion Repositories pci

[/] [pci/] [tags/] [working_demo/] [old_stuff/] [wb_slave/] [test_bench/] [wb_master32.v] - Rev 8

Go to most recent revision | Compare with Previous | Blame | View Log

//////////////////////////////////////////////////////////////////////
////                                                              ////
////  File name "wb_master32.v"                                   ////
////                                                              ////
////  This file is part of the "PCI bridge" project               ////
////  http://www.opencores.org/cores/pci/                         ////
////                                                              ////
////  Author(s):                                                  ////
////      - Miha Dolenc (mihad@opencores.org)                     ////
////      - Winefred Washington                                   ////
////                                                              ////
////  All additional information is avaliable in the README.pdf   ////
////  file.                                                       ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
////                                                              ////
//// Copyright (C) 2001 Miha Dolenc, mihad@opencores.org          ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.2  2001/07/19 09:50:08  mihad
// Only delayed write storage is provided after merging delayed requests.
// All delayed reads now pass through FIFO.
//
//
 
`define Tp 1
 
module WB_MASTER32(CLK_I, RST_I, TAG_I, TAG_O,
		   ACK_I, ADR_O, CYC_O, DAT_I, DAT_O, ERR_I, RTY_I, SEL_O, STB_O, WE_O, CAB_O);
 
    input	    	CLK_I;
    input		    RST_I;
    input    [3:0] 	TAG_I;
    output   [3:0]  TAG_O;
    input		    ACK_I;
    output   [31:0] ADR_O;
    output		    CYC_O;
    input    [31:0] DAT_I;
    output   [31:0] DAT_O;
    input	    	ERR_I;
    input		    RTY_I;
    output   [3:0] 	SEL_O;
    output	    	STB_O;
    output		    WE_O;
    output          CAB_O ;
 
    reg [31:0]  ADR_O;
    reg [3:0] 	SEL_O;
    reg 		CYC_O;
    reg 		WE_O;
    reg [31:0] 	DAT_O;
    reg         CAB_O ;
    reg         STB_O ;
 
    // timeout counter and timeout flag for canceling deadlocked cycles 
    reg [7:0]   tocount ;
    reg         toflag ;
 
    // assign outputs to unknown state while in reset
    always@(RST_I)
    begin
        if (RST_I)
        begin
   	        ADR_O <= 32'hxxxx_xxxx ;
    	    SEL_O <= 4'hx ;
            CYC_O <= 1'b0 ;
   		    WE_O  <= 1'bx ;
   		    DAT_O <= 32'hxxxx_xxxx ;
            CAB_O <= 1'b0 ;
            STB_O <= 1'b0 ;
        end
    end //reset
 
    task blkwr ;
        input [31:0]    address ;   // address input
        input [31:0]    data ;      // data input 
        input [3:0]     select ;    // selects input
        input           burst ;     // burst (cab) input flag
        input           start ;     // start flag
        input           stop ;      // stop flag - terminates cycle
        output [2:0]    result ;    // result output: result[2] = acknowledge, result[1] = error, result[0] = retry
    begin
        // if this is the first cycle, synchronize operation to clock
        if (start)
            @(posedge CLK_I) ;
 
        // assign outputs
        ADR_O <= #`Tp address ;
    	SEL_O <= #`Tp select ;
        CYC_O <= #`Tp 1'b1 ;
   		WE_O  <= #`Tp 1'b1 ;
   		DAT_O <= #`Tp data ;
        CAB_O <= #`Tp burst ;
 
        // if data is not valid insert a wait cycle - STB = 0
        if (data  === 32'hxxxxxxxx)
            STB_O <= #`Tp 1'b0 ;
        else
            STB_O <= #`Tp 1'b1 ;
 
        // wait for current cycle to end
        @(posedge CLK_I) ;
 
        if (STB_O)
            while (~(ACK_I || ERR_I || RTY_I || toflag))
                @(posedge CLK_I) ;
 
        result = {ACK_I, ERR_I, RTY_I} ;
 
        STB_O <= #`Tp 1'b0 ;
 
        // terminate the cycle if stop flag is set or error, retry or timeout is signalled
        if(stop || result[1:0])
        begin   
            CYC_O <= #`Tp 1'b0 ;
            CAB_O <= #`Tp 1'b0 ;
        end
 
        #`Tp ;
    end
    endtask // blkwr
 
    task blkrd ;
        input   [31:0]  address ;       // read address
        input   [3:0]   select ;        // byte selects
        input           burst ;         // burst flag
        input           start ;         // start flag
        input           stop ;          // stop flag
        output  [34:0]  status_w_data ; // status with data - [34:32] = status[34]=acknowledge, status[33]=error, status[32]=retry
        reg     [2:0]   result ;        
    begin
        // if this is the first cycle, synchronize operation to clock
        if (start)
            @(posedge CLK_I) ;
 
        // assign outputs
        ADR_O <= #`Tp address ;
    	SEL_O <= #`Tp select ;
        CYC_O <= #`Tp 1'b1 ;
   		WE_O  <= #`Tp 1'b0 ;
        CAB_O <= #`Tp burst ;
        STB_O <= #`Tp 1'b1 ;
 
        // invalid selects insert wait cycles
        if (select === 4'bxxxx)
            STB_O <= #`Tp 1'b0 ;
        else
            STB_O <= #`Tp 1'b1 ;
 
        // wait for current cycle to end
        @(posedge CLK_I) ;
        if (STB_O) 
            while (~(ACK_I || ERR_I || RTY_I || toflag))
                @(posedge CLK_I) ;
 
        result = {ACK_I, ERR_I, RTY_I} ;
        status_w_data = {result, DAT_I} ;
 
        STB_O <= #`Tp 1'b0 ;
 
        if(stop || result[1:0] || toflag)
        begin   
            CYC_O <= #`Tp 1'b0 ;
            CAB_O <= #`Tp 1'b0 ;
        end
 
        #`Tp ;
    end
    endtask // blkrd
 
    // timeout flag generation
    always@(posedge CLK_I or posedge RST_I)
    begin
        if (RST_I)
        begin
            toflag  <= 1'b0 ;
            tocount <= 8'h00 ;
        end
        else
        begin
            // whenever cycle is in progress and data is qualified count cycles with no slave response
            if (CYC_O && STB_O && ~(ACK_I || ERR_I || RTY_I))
            begin
                tocount <= tocount + 1 ;
            end
            else
            // reset counter and flag when cycle or strobe are inactive or slave responds whith whatever response signal
            begin
                tocount <= 8'h00 ;
                toflag  <= 1'b0 ;
            end
 
            if ( tocount == 8'hFF)
                toflag <= 1'b1 ;
        end
 
 
    end
endmodule
 
 
 
 
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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