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

Subversion Repositories ata

[/] [ata/] [trunk/] [bench/] [verilog/] [ata_device.v] - Diff between revs 16 and 30

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 16 Rev 30
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
////                                                             ////
////                                                             ////
////  ATA (IDE) Device Model                                     ////
////  ATA (IDE) Device Model                                     ////
////  This Model Supports PIO cycles only !                      ////
////  This Model Supports PIO cycles only !                      ////
////                                                             ////
////                                                             ////
////                                                             ////
////                                                             ////
////  Author: Rudolf Usselmann                                   ////
////  Author: Rudolf Usselmann                                   ////
////          rudi@asics.ws                                      ////
////          rudi@asics.ws                                      ////
////                                                             ////
////                                                             ////
////                                                             ////
////                                                             ////
////  Downloaded from: http://www.opencores.org/cores/ata/       ////
////  Downloaded from: http://www.opencores.org/cores/ata/       ////
////                                                             ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
////                                                             ////
////                                                             ////
//// Copyright (C) 2001 Rudolf Usselmann                         ////
//// Copyright (C) 2001 Rudolf Usselmann                         ////
////                    rudi@asics.ws                            ////
////                    rudi@asics.ws                            ////
////                                                             ////
////                                                             ////
//// This source file may be used and distributed without        ////
//// This source file may be used and distributed without        ////
//// restriction provided that this copyright statement is not   ////
//// restriction provided that this copyright statement is not   ////
//// removed from the file and that any derivative work contains ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// the original copyright notice and the associated disclaimer.////
////                                                             ////
////                                                             ////
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
////                                                             ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
 
 
//  CVS Log
//  CVS Log
//
//
//  $Id: ata_device.v,v 1.1 2001-08-16 10:01:05 rudi Exp $
//  $Id: ata_device.v,v 1.2 2002-02-25 06:07:21 rherveille Exp $
//
//
//  $Date: 2001-08-16 10:01:05 $
//  $Date: 2002-02-25 06:07:21 $
//  $Revision: 1.1 $
//  $Revision: 1.2 $
//  $Author: rudi $
//  $Author: rherveille $
//  $Locker:  $
//  $Locker:  $
//  $State: Exp $
//  $State: Exp $
//
//
// Change History:
// Change History:
//               $Log: not supported by cvs2svn $
//               $Log: not supported by cvs2svn $
 
//               Revision 1.1  2001/08/16 10:01:05  rudi
 
//
 
//               - Added Test Bench
 
//               - Added Synthesis scripts for Design Compiler
 
//               - Fixed minor bug in atahost_top
 
//
//
//
//
//
//
//
//                        
//                        
 
 
`timescale 1ns / 10ps
`timescale 1ns / 10ps
 
 
module ata_device(      ata_rst_, ata_data, ata_da, ata_cs0, ata_cs1,
module ata_device(      ata_rst_, ata_data, ata_da, ata_cs0, ata_cs1,
                        ata_dior_, ata_diow_, ata_iordy, ata_intrq );
                        ata_dior_, ata_diow_, ata_iordy, ata_intrq );
input           ata_rst_;
input           ata_rst_;
inout   [15:0]   ata_data;
inout   [15:0]   ata_data;
input   [2:0]    ata_da;
input   [2:0]    ata_da;
input           ata_cs0, ata_cs1;
input           ata_cs0, ata_cs1;
input           ata_dior_, ata_diow_;
input           ata_dior_, ata_diow_;
output          ata_iordy;
output          ata_iordy;
output          ata_intrq;
output          ata_intrq;
 
 
integer         mode;
integer         mode;
integer         n;
integer         n;
reg             ata_iordy;
reg             ata_iordy;
reg             iordy_enable;
reg             iordy_enable;
integer         iordy_delay;
integer         iordy_delay;
 
 
reg     [15:0]   mem[32:0];
reg     [15:0]   mem[32:0];
reg     [15:0]   dout;
reg     [15:0]   dout;
reg             dout_en;
reg             dout_en;
wire            ata_rst_m0, ata_rst_m1, ata_rst_m2, ata_rst_m3, ata_rst_m4;
wire            ata_rst_m0, ata_rst_m1, ata_rst_m2, ata_rst_m3, ata_rst_m4;
wire    [4:0]    addr;
wire    [4:0]    addr;
wire            ata_dior, ata_diow;
wire            ata_dior, ata_diow;
 
 
initial
initial
   begin
   begin
        dout_en = 0;
        dout_en = 0;
        mode = 0;
        mode = 0;
        iordy_enable = 0;
        iordy_enable = 0;
        iordy_delay  = 0;
        iordy_delay  = 0;
        ata_iordy    = 1;
        ata_iordy    = 1;
   end
   end
 
 
assign ata_dior = !ata_dior_;
assign ata_dior = !ata_dior_;
assign ata_diow = !ata_diow_;
assign ata_diow = !ata_diow_;
 
 
assign ata_intrq = 0;
assign ata_intrq = 0;
 
 
assign ata_data = dout_en ? dout : 16'hzzzz;
assign ata_data = dout_en ? dout : 16'hzzzz;
 
 
assign addr = {~ata_cs1, ~ata_cs0, ata_da};
assign addr = {~ata_cs1, ~ata_cs0, ata_da};
 
 
always @(posedge ata_rst_)
always @(posedge ata_rst_)
        dout_en = 0;
        dout_en = 0;
 
 
always @(posedge ata_dior)
always @(posedge ata_dior)
   begin
   begin
        dout = mem[ addr ];
        dout = mem[ addr ];
        dout_en = 1;
        dout_en = 1;
   end
   end
 
 
always @(negedge ata_dior)
always @(posedge ata_dior)
   begin
   begin
        dout_en = 0;
        dout_en = 0;
   end
   end
 
 
always @(posedge ata_diow)
always @(posedge ata_diow)
   begin
   begin
        mem[ addr ] = ata_data;
        mem[ addr ] = ata_data;
   end
   end
 
 
always @(posedge ata_dior or posedge ata_diow)
always @(posedge ata_dior or posedge ata_diow)
   begin
   begin
        ata_iordy = 1'b0;
        ata_iordy = 1'b0;
        #(iordy_delay);
        #(iordy_delay);
        ata_iordy = 1'b1;
        ata_iordy = 1'b1;
   end
   end
 
 
task init_mem;
task init_mem;
 
 
begin
begin
 
 
for(n=0;n<32;n=n+1)
for(n=0;n<32;n=n+1)
        mem[n] = n;
        mem[n] = n;
end
end
endtask
endtask
 
 
assign ata_rst_m0 = ata_rst_ & (mode==0);
assign ata_rst_m0 = ata_rst_ & (mode==0);
assign ata_rst_m1 = ata_rst_ & (mode==1);
assign ata_rst_m1 = ata_rst_ & (mode==1);
assign ata_rst_m2 = ata_rst_ & (mode==2);
assign ata_rst_m2 = ata_rst_ & (mode==2);
assign ata_rst_m3 = ata_rst_ & (mode==3);
assign ata_rst_m3 = ata_rst_ & (mode==3);
assign ata_rst_m4 = ata_rst_ & (mode==4);
assign ata_rst_m4 = ata_rst_ & (mode==4);
 
 
specify
specify
        specparam       // ATA Mode 0 Timing
        specparam       // ATA Mode 0 Timing
                        M0_DioCycle     = 600,                  // T0
                        M0_DioCycle     = 600,                  // T0
                        M0_AddrSetup    = 70,                   // T1
                        M0_AddrSetup    = 70,                   // T1
                        M0_DioHigh      = 290,                  // T2
                        M0_DioHigh      = 290,                  // T2
                        M0_WrSetup      = 60,                   // T3
                        M0_WrSetup      = 60,                   // T3
                        M0_WrHold       = 30,                   // T4
                        M0_WrHold       = 30,                   // T4
                        M0_DoutSetup    = 50,                   // T5
                        M0_DoutSetup    = 50,                   // T5
                        M0_DoutHold     = 5,                    // T6
                        M0_DoutHold     = 5,                    // T6
                        M0_AddrHold     = 20,                   // T9
                        M0_AddrHold     = 20,                   // T9
 
 
                        // ATA Mode 1 Timing
                        // ATA Mode 1 Timing
                        M1_DioCycle     = 383,                  // T0
                        M1_DioCycle     = 383,                  // T0
                        M1_AddrSetup    = 50,                   // T1
                        M1_AddrSetup    = 50,                   // T1
                        M1_DioHigh      = 290,                  // T2
                        M1_DioHigh      = 290,                  // T2
                        M1_WrSetup      = 45,                   // T3
                        M1_WrSetup      = 45,                   // T3
                        M1_WrHold       = 20,                   // T4
                        M1_WrHold       = 20,                   // T4
                        M1_DoutSetup    = 35,                   // T5
                        M1_DoutSetup    = 35,                   // T5
                        M1_DoutHold     = 5,                    // T6
                        M1_DoutHold     = 5,                    // T6
                        M1_AddrHold     = 15,                   // T9
                        M1_AddrHold     = 15,                   // T9
 
 
                        // ATA Mode 2 Timing
                        // ATA Mode 2 Timing
                        M2_DioCycle     = 330,                  // T0
                        M2_DioCycle     = 330,                  // T0
                        M2_AddrSetup    = 30,                   // T1
                        M2_AddrSetup    = 30,                   // T1
                        M2_DioHigh      = 290,                  // T2
                        M2_DioHigh      = 290,                  // T2
                        M2_WrSetup      = 30,                   // T3
                        M2_WrSetup      = 30,                   // T3
                        M2_WrHold       = 15,                   // T4
                        M2_WrHold       = 15,                   // T4
                        M2_DoutSetup    = 20,                   // T5
                        M2_DoutSetup    = 20,                   // T5
                        M2_DoutHold     = 5,                    // T6
                        M2_DoutHold     = 5,                    // T6
                        M2_AddrHold     = 10,                   // T9
                        M2_AddrHold     = 10,                   // T9
 
 
                        // ATA Mode 3 Timing
                        // ATA Mode 3 Timing
                        M3_DioCycle     = 180,                  // T0
                        M3_DioCycle     = 180,                  // T0
                        M3_AddrSetup    = 30,                   // T1
                        M3_AddrSetup    = 30,                   // T1
                        M3_DioHigh      = 80,                   // T2
                        M3_DioHigh      = 80,                   // T2
                        M3_DioLow       = 70,                   // T2i
                        M3_DioLow       = 70,                   // T2i
                        M3_WrSetup      = 30,                   // T3
                        M3_WrSetup      = 30,                   // T3
                        M3_WrHold       = 10,                   // T4
                        M3_WrHold       = 10,                   // T4
                        M3_DoutSetup    = 20,                   // T5
                        M3_DoutSetup    = 20,                   // T5
                        M3_DoutHold     = 5,                    // T6
                        M3_DoutHold     = 5,                    // T6
                        M3_AddrHold     = 10,                   // T9
                        M3_AddrHold     = 10,                   // T9
 
 
                        // ATA Mode 4 Timing
                        // ATA Mode 4 Timing
                        M4_DioCycle     = 120,                  // T0
                        M4_DioCycle     = 120,                  // T0
                        M4_AddrSetup    = 25,                   // T1
                        M4_AddrSetup    = 25,                   // T1
                        M4_DioHigh      = 70,                   // T2
                        M4_DioHigh      = 70,                   // T2
                        M4_DioLow       = 25,                   // T2i
                        M4_DioLow       = 25,                   // T2i
                        M4_WrSetup      = 20,                   // T3
                        M4_WrSetup      = 20,                   // T3
                        M4_WrHold       = 10,                   // T4
                        M4_WrHold       = 10,                   // T4
                        M4_DoutSetup    = 20,                   // T5
                        M4_DoutSetup    = 20,                   // T5
                        M4_DoutHold     = 5,                    // T6
                        M4_DoutHold     = 5,                    // T6
                        M4_AddrHold     = 10;                   // T9
                        M4_AddrHold     = 10;                   // T9
 
 
 
 
 
 
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
        // ATA Mode 0 Timing                               //
        // ATA Mode 0 Timing                               //
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
 
 
        // Output Delay Path
        // Output Delay Path
        if(mode==0) (ata_dior_ => ata_data) =    //(01,10,0z,z1,1z,z0)
        if(mode==0) (ata_dior_ => ata_data) =    //(01,10,0z,z1,1z,z0)
                                        (0,0,
                                        (0,0,
                                        M0_DoutHold, (M0_DioHigh - M0_DoutSetup),
                                        M0_DoutHold, (M0_DioHigh - M0_DoutSetup),
                                        M0_DoutHold, (M0_DioHigh - M0_DoutSetup) );
                                        M0_DoutHold, (M0_DioHigh - M0_DoutSetup) );
 
 
        // Write Data Setup/Hold Check
        // Write Data Setup/Hold Check
        $setuphold(negedge ata_diow, ata_data, M0_WrSetup, M0_WrHold, , ,ata_rst_m0 );
        $setuphold(negedge ata_diow, ata_data, M0_WrSetup, M0_WrHold, , ,ata_rst_m0 );
 
 
        // DioX Active time Check
        // DioX Active time Check
        $width(posedge ata_dior &&& ata_rst_m0, M0_DioHigh );
        $width(posedge ata_dior &&& ata_rst_m0, M0_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m0, M0_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m0, M0_DioHigh );
 
 
        // DioX Min Cycle Width Check
        // DioX Min Cycle Width Check
        $period(posedge ata_dior &&& ata_rst_m0, M0_DioCycle );
        $period(posedge ata_dior &&& ata_rst_m0, M0_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m0, M0_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m0, M0_DioCycle );
 
 
        // Address Setup Hold Checks
        // Address Setup Hold Checks
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
 
 
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
 
 
 
 
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
        // ATA Mode 1 Timing                               //
        // ATA Mode 1 Timing                               //
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
 
 
        // Output Delay Path
        // Output Delay Path
        if(mode==1) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
        if(mode==1) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
                                        (0,0,
                                        (0,0,
                                        M1_DoutHold, (M1_DioHigh - M1_DoutSetup),
                                        M1_DoutHold, (M1_DioHigh - M1_DoutSetup),
                                        M1_DoutHold, (M1_DioHigh - M1_DoutSetup) );
                                        M1_DoutHold, (M1_DioHigh - M1_DoutSetup) );
 
 
        // Write Data Setup/Hold Check
        // Write Data Setup/Hold Check
        $setuphold(negedge ata_diow, ata_data, M1_WrSetup, M1_WrHold, , ,ata_rst_m1 );
        $setuphold(negedge ata_diow, ata_data, M1_WrSetup, M1_WrHold, , ,ata_rst_m1 );
 
 
        // DioX Active time Check
        // DioX Active time Check
        $width(posedge ata_dior &&& ata_rst_m1, M1_DioHigh );
        $width(posedge ata_dior &&& ata_rst_m1, M1_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m1, M1_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m1, M1_DioHigh );
 
 
        // DioX Min Cycle Width Check
        // DioX Min Cycle Width Check
        $period(posedge ata_dior &&& ata_rst_m1, M1_DioCycle );
        $period(posedge ata_dior &&& ata_rst_m1, M1_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m1, M1_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m1, M1_DioCycle );
 
 
        // Address Setup Hold Checks
        // Address Setup Hold Checks
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
 
 
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
 
 
 
 
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
        // ATA Mode 2 Timing                               //
        // ATA Mode 2 Timing                               //
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
 
 
        // Output Delay Path
        // Output Delay Path
        if(mode==2) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
        if(mode==2) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
                                        (0,0,
                                        (0,0,
                                        M2_DoutHold, (M2_DioHigh - M2_DoutSetup),
                                        M2_DoutHold, (M2_DioHigh - M2_DoutSetup),
                                        M2_DoutHold, (M2_DioHigh - M2_DoutSetup) );
                                        M2_DoutHold, (M2_DioHigh - M2_DoutSetup) );
 
 
        // Write Data Setup/Hold Check
        // Write Data Setup/Hold Check
        $setuphold(negedge ata_diow, ata_data, M2_WrSetup, M2_WrHold, , ,ata_rst_m2 );
        $setuphold(negedge ata_diow, ata_data, M2_WrSetup, M2_WrHold, , ,ata_rst_m2 );
 
 
        // DioX Active time Check
        // DioX Active time Check
        $width(posedge ata_dior &&& ata_rst_m2, M2_DioHigh );
        $width(posedge ata_dior &&& ata_rst_m2, M2_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m2, M2_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m2, M2_DioHigh );
 
 
        // DioX Min Cycle Width Check
        // DioX Min Cycle Width Check
        $period(posedge ata_dior &&& ata_rst_m2, M2_DioCycle );
        $period(posedge ata_dior &&& ata_rst_m2, M2_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m2, M2_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m2, M2_DioCycle );
 
 
        // Address Setup Hold Checks
        // Address Setup Hold Checks
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
 
 
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
 
 
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
        // ATA Mode 3 Timing                               //
        // ATA Mode 3 Timing                               //
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
 
 
        // Output Delay Path
        // Output Delay Path
        if(mode==3) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
        if(mode==3) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
                                        (0,0,
                                        (0,0,
                                        M3_DoutHold, (M3_DioHigh - M3_DoutSetup),
                                        M3_DoutHold, (M3_DioHigh - M3_DoutSetup),
                                        M3_DoutHold, (M3_DioHigh - M3_DoutSetup) );
                                        M3_DoutHold, (M3_DioHigh - M3_DoutSetup) );
 
 
        // Write Data Setup/Hold Check
        // Write Data Setup/Hold Check
        $setuphold(negedge ata_diow, ata_data, M3_WrSetup, M3_WrHold, , ,ata_rst_m3 );
        $setuphold(negedge ata_diow, ata_data, M3_WrSetup, M3_WrHold, , ,ata_rst_m3 );
 
 
        // DioX Active time Check
        // DioX Active time Check
        $width(posedge ata_dior &&& ata_rst_m3, M3_DioHigh );
        $width(posedge ata_dior &&& ata_rst_m3, M3_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m3, M3_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m3, M3_DioHigh );
 
 
        $width(negedge ata_dior &&& ata_rst_m3, M3_DioLow );
        $width(negedge ata_dior &&& ata_rst_m3, M3_DioLow );
        $width(negedge ata_diow &&& ata_rst_m3, M3_DioLow );
        $width(negedge ata_diow &&& ata_rst_m3, M3_DioLow );
 
 
        // DioX Min Cycle Width Check
        // DioX Min Cycle Width Check
        $period(posedge ata_dior &&& ata_rst_m3, M3_DioCycle );
        $period(posedge ata_dior &&& ata_rst_m3, M3_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m3, M3_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m3, M3_DioCycle );
 
 
        // Address Setup Hold Checks
        // Address Setup Hold Checks
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
 
 
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
 
 
 
 
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
        // ATA Mode 4 Timing                               //
        // ATA Mode 4 Timing                               //
        /////////////////////////////////////////////////////
        /////////////////////////////////////////////////////
 
 
        // Output Delay Path
        // Output Delay Path
        if(mode==4) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
        if(mode==4) (ata_dior_ => ata_data) =   //(01,10,0z,z1,1z,z0)
                                        (0,0,
                                        (0,0,
                                        M4_DoutHold, (M4_DioHigh - M4_DoutSetup),
                                        M4_DoutHold, (M4_DioHigh - M4_DoutSetup),
                                        M4_DoutHold, (M4_DioHigh - M4_DoutSetup) );
                                        M4_DoutHold, (M4_DioHigh - M4_DoutSetup) );
 
 
        // Write Data Setup/Hold Check
        // Write Data Setup/Hold Check
        $setuphold(negedge ata_diow, ata_data, M4_WrSetup, M4_WrHold, , ,ata_rst_m4 );
        $setuphold(negedge ata_diow, ata_data, M4_WrSetup, M4_WrHold, , ,ata_rst_m4 );
 
 
        // DioX Active time Check
        // DioX Active time Check
        $width(posedge ata_dior &&& ata_rst_m4, M4_DioHigh );
        $width(posedge ata_dior &&& ata_rst_m4, M4_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m4, M4_DioHigh );
        $width(posedge ata_diow &&& ata_rst_m4, M4_DioHigh );
 
 
        $width(negedge ata_dior &&& ata_rst_m4, M4_DioLow );
        $width(negedge ata_dior &&& ata_rst_m4, M4_DioLow );
        $width(negedge ata_diow &&& ata_rst_m4, M4_DioLow );
        $width(negedge ata_diow &&& ata_rst_m4, M4_DioLow );
 
 
        // DioX Min Cycle Width Check
        // DioX Min Cycle Width Check
        $period(posedge ata_dior &&& ata_rst_m4, M4_DioCycle );
        $period(posedge ata_dior &&& ata_rst_m4, M4_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m4, M4_DioCycle );
        $period(posedge ata_diow &&& ata_rst_m4, M4_DioCycle );
 
 
        // Address Setup Hold Checks
        // Address Setup Hold Checks
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
 
 
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
 
 
 
 
 
 
endspecify
endspecify
 
 
 
 
endmodule
endmodule
 
 
 
 
 
 
 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.