/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// 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
|