⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci_mast.tb

📁 VHDLVERILOG语言实现的CARDBUS的IP源码,已经实现现场应用
💻 TB
📖 第 1 页 / 共 3 页
字号:
--------------------------------------------------------------------------------
--
-- File : pci_mast.tb
-- Last Modification: 06/26/2001
--
-- Created In SpDE Version: SpDE 8.22
-- Author :	Richard Yuan, QuickLogic Corporation
-- Copyright (C) 2001, Licensed customers of QuickLogic may copy and modify
-- this file for use in designing with QuickLogic devices only.
--	
-- Description :
--	This is a PCI master model.
--	Please see "The QL5064 PCI Bus Simulation Environment" for detailed informaiton.
--
-- Hierarchy:
--	The tf_pci_master entity is to be used in pci5(3/4)32_208.tb.
--
-- History:	
--	Date	        Author					Version
--  06/26/01		Richard Yuan			1.0
--		- Header reorganized to conform to coding standard.
--
--------------------------------------------------------------------------------


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.pci_pack.all;

--This external master does not drive random bits on upper 32 address/data
-- and upper be's when doing 32 bit accesses.

ENTITY tf_pci_master IS
         GENERIC (RW_BUFF_SIZE_ADDR_BITS : integer := 8);

         PORT (
              pci_clk     : IN    std_logic;
              pci_ad     : INOUT std_logic_vector(63 downto 0);
              pci_cbe     : OUT   std_logic_vector(7 downto 0);
              par     : INOUT std_logic;
              par_64     : INOUT std_logic;
              frame_l     : INOUT std_logic;
              irdy_l     : INOUT std_logic;
              trdy_l     : IN    std_logic;
              stop_l     : IN    std_logic;
              devsel_l     : IN    std_logic;
              idsel     : INOUT std_logic;
              req64_l     : OUT   std_logic;
              ack64_l     : IN    std_logic;
              req_l     : OUT   std_logic;
              gnt_l     : IN    std_logic;
              reset_l     : IN    std_logic;
              start_bit     : IN    std_logic;
              done_bit     : OUT    std_logic;
              master_addr   : IN std_logic_vector(63 downto 0);
              master_command : IN std_logic_vector(3 downto 0);
              master_addr_parity     : IN    std_logic;
              master_data_parity     : IN    std_logic;
              master_dword_count : IN integer;
              master_initial_data_delay : IN integer;
              master_next_data_delay : IN integer;
			  master_bad_parity_phase : in integer;
              master_m64bit : IN std_logic;
              master_quiet : IN std_logic;
              be_array : IN BYTE_ARRAY_TYPE;
              data_array : IN DATA_ARRAY_TYPE;
			  pass : OUT std_logic;
               last_data : OUT std_logic_vector(63 downto 0)
         );
END tf_pci_master;

ARCHITECTURE tf_pci_master_ARC_CORE OF tf_pci_master IS

-- this simulates the clock-to-out timing for 33MHz
CONSTANT OUTPUT_DELAY : time := 11 NS;

----PARAMETER
CONSTANT ZEROS32 : std_logic_vector(31 downto 0) := "00000000000000000000000000000000";
CONSTANT RW_BUFF_SIZE : integer := 2 ** RW_BUFF_SIZE_ADDR_BITS;

------- SIGNALS that get initialized at beginning
SIGNAL pci_ad_oe   : std_logic := '0';
SIGNAL pci_cbe_oe   : std_logic := '0';
SIGNAL frame_oe   : std_logic := '0';
SIGNAL idsel_oe   : std_logic := '0';
SIGNAL irdy_oe   : std_logic := '0';
SIGNAL req64_oe   : std_logic := '0';
SIGNAL req_reg   : std_logic := '0';

SIGNAL force_32 : std_logic := '0';
SIGNAL disconnect_req64   : std_logic := '0';

SIGNAL fake_a_DAC : std_logic := '0';

-- OUTPUT SIGNALS (TEMPS)
SIGNAL pci_cbe_outtmp   : std_logic_vector(7 downto 0);
SIGNAL req64_l_outtmp   : std_logic;
SIGNAL req_l_outtmp   : std_logic;
-- Wires -> SIGNALs
SIGNAL par64_reg_with_error   : std_logic;
SIGNAL par_reg_with_error : std_logic;
SIGNAL irdy   : std_logic;
SIGNAL devsel   : std_logic;
SIGNAL frame   : std_logic;
SIGNAL trdy   : std_logic;
SIGNAL stop   : std_logic;
SIGNAL local_req64_l   : std_logic;
SIGNAL gnt   : std_logic;
SIGNAL reset   : std_logic;
SIGNAL perr64_injected   : std_logic;
SIGNAL perr_injected   : std_logic;

-- Regs -> SIGNALs
SIGNAL frame_reg   : std_logic;
SIGNAL pci_cbe_reg   : std_logic_vector(7 downto 0);
SIGNAL par64_reg   : std_logic;
----SIGNAL start_address   : std_logic_vector(63 downto 0);
SIGNAL irdy_oe_dly   : std_logic;
SIGNAL par_oe_reg   : std_logic;
SIGNAL par_reg   : std_logic;
SIGNAL idsel_reg   : std_logic;
SIGNAL par64_oe_reg   : std_logic;
SIGNAL irdy_dly   : std_logic;
SIGNAL frame_dly   : std_logic;
SIGNAL irdy_reg   : std_logic;
SIGNAL pci_ad_reg   : std_logic_vector(63 downto 0);
SIGNAL bus_idle_ready_to_start   : std_logic;

-- integers -> INTEGERS
SIGNAL phase_count   : integer;
signal master_bad_parity_phase_dly : integer := 0;

-- TEMP SIGNALs
  
---- PROCEDURES
procedure compare64(addr : IN std_logic_vector(63 downto 0);
                    expected : IN std_logic_vector(63 downto 0);
                    SIGNAL actual : IN std_logic_vector(63 downto 0);
                    be : IN std_logic_vector(7 downto 0);
                    VARIABLE pass_fail : INOUT std_logic;
                    quiet : IN std_logic;
                    VARIABLE last_data : OUT std_logic_vector(63 downto 0)) IS
VARIABLE be_mask : std_logic_vector(63 downto 0);
VARIABLE jptempvar4   : std_logic_vector(7 downto 0);
VARIABLE jptempvar5   : std_logic_vector(7 downto 0);
VARIABLE jptempvar6   : std_logic_vector(7 downto 0);
VARIABLE jptempvar7   : std_logic_vector(7 downto 0);
VARIABLE jptempvar8   : std_logic_vector(7 downto 0);
VARIABLE jptempvar9   : std_logic_vector(7 downto 0);
VARIABLE jptempvar10   : std_logic_vector(7 downto 0);
VARIABLE jptempvar11   : std_logic_vector(7 downto 0);
BEGIN
   IF be(7) = '1' THEN jptempvar4 := "11111111";
    ELSE jptempvar4 := "00000000"; END IF;
   IF be(6) = '1' THEN jptempvar5 := "11111111";
    ELSE jptempvar5 := "00000000"; END IF;
   IF be(5) = '1' THEN jptempvar6 := "11111111";
    ELSE jptempvar6 := "00000000"; END IF;
   IF be(4) = '1' THEN jptempvar7 := "11111111";
    ELSE jptempvar7 := "00000000"; END IF;
   IF be(3) = '1' THEN jptempvar8 := "11111111";
    ELSE jptempvar8 := "00000000"; END IF;
   IF be(2) = '1' THEN jptempvar9 := "11111111";
    ELSE jptempvar9 := "00000000"; END IF;
   IF be(1) = '1' THEN jptempvar10 := "11111111";
    ELSE jptempvar10 := "00000000"; END IF;
   IF be(0) = '1' THEN jptempvar11 := "11111111";
    ELSE jptempvar11 := "00000000"; END IF;
   be_mask(63 downto 0) :=   (  ( jptempvar4 )  & --THIS IS CONCATENATION
                   ( jptempvar5 )  & --THIS IS CONCATENATION
                   ( jptempvar6 )  & --THIS IS CONCATENATION
                   ( jptempvar7 )  & --THIS IS CONCATENATION
                   ( jptempvar8 )  & --THIS IS CONCATENATION
                   ( jptempvar9 )  & --THIS IS CONCATENATION
                   ( jptempvar10 )  & --THIS IS CONCATENATION
                   ( jptempvar11 )  ) ;
------jptempvar12 <=  '1' WHEN 
 ------( expected(63 downto 0) AND  be_mask(63 downto 0) )  /=  (  )  ELSE '0';
   IF (expected(63 downto 0) AND be_mask(63 downto 0)) /= (actual(63 downto 0) AND be_mask(63 downto 0)) THEN
       pass_fail :=  '0';
       IF  (  NOT quiet )  = '1'  THEN
          ASSERT (False)
            REPORT "FAILURE: PCI side quad word data read mismatch at address " &
                    vec2hstr(addr) &
                    "." & LF & "Expected: " &
                    vec2hstr(expected AND be_mask) & LF &
                    "Actual: " &
                    vec2hstr(actual AND be_mask)
            SEVERITY Error;
          -----------error_bit.toggle;
       ELSE 
          ----error_bit.toggle_hidden;
       END IF;
   END IF;
   last_data(63 downto 0) :=  actual(63 downto 0) AND  be_mask(63 downto 0);

end compare64;

procedure compare (addr : IN std_logic_vector(63 downto 0);
                   expected : IN std_logic_vector(31 downto 0);
                   SIGNAL actual : IN std_logic_vector(31 downto 0);
                   be : IN std_logic_vector(3 downto 0);
                   VARIABLE pass_fail : INOUT std_logic;
                   quiet : IN std_logic;
                   VARIABLE last_data : OUT std_logic_vector(63 downto 0)) IS
VARIABLE be_mask : std_logic_vector(31 downto 0);
VARIABLE jptempvar13   : std_logic_vector(7 downto 0);
VARIABLE jptempvar14   : std_logic_vector(7 downto 0);
VARIABLE jptempvar15   : std_logic_vector(7 downto 0);
VARIABLE jptempvar16   : std_logic_vector(7 downto 0);
BEGIN
   IF be(3) = '1' THEN jptempvar13 := "11111111";
    ELSE jptempvar13 := "00000000"; END IF;
   IF be(2) = '1' THEN jptempvar14 := "11111111";
    ELSE jptempvar14 := "00000000"; END IF;
   IF be(1) = '1' THEN jptempvar15 := "11111111";
    ELSE jptempvar15 := "00000000"; END IF;
   IF be(0) = '1' THEN jptempvar16 := "11111111";
    ELSE jptempvar16 := "00000000"; END IF;
   be_mask(31 downto 0) :=   (  ( jptempvar13 )  & --THIS IS CONCATENATION
               ( jptempvar14 )  & --THIS IS CONCATENATION
               ( jptempvar15 )  & --THIS IS CONCATENATION
               ( jptempvar16 )  ) ;
   ----jptempvar17 := '1' WHEN 
        ----(expected(31 downto 0) AND  be_mask(31 downto 0) )  /=  (  )  ELSE '0';
   IF (expected(31 downto 0) AND be_mask(31 downto 0)) /= (actual(31 downto 0) AND be_mask(31 downto 0)) THEN
       pass_fail :=  '0';
       IF  (NOT quiet) = '1' THEN
          ASSERT (False)
            REPORT "FAILURE: PCI side double word data read mismatch at address " &
                    vec2hstr(addr) &
                    "." & LF & "Expected: " &
                    vec2hstr(expected AND be_mask) & LF &
                    "Actual: " &
                    vec2hstr(actual AND be_mask)
            SEVERITY Error;
          -----------error_bit.toggle;
       ELSE 
          ----error_bit.toggle_hidden;
       END IF;
   END IF;
---   jptempvar18 <=  '1' WHEN 
---      ( be_mask(63 downto 0) )  /=  0  ELSE '0';
   IF be_mask(31 downto 0) /= ZEROS32 THEN
      IF  ( addr(2) )  = '1'  THEN
          last_data(63 downto 0) := ( (actual(31 downto 0) AND  be_mask(31 downto 0)) & --THIS IS CONCATENATION
                        "00000000000000000000000000000000" ) ;
      ELSE
          last_data(63 downto 0) := ( "00000000000000000000000000000000" & --THIS IS CONCATENATION
                     (actual(31 downto 0) AND  be_mask(31 downto 0)) ) ;
      END IF;
   END IF;
end compare;

---------- PROCEDURE (MAIN)
PROCEDURE target_access_one_frame(VARIABLE address : IN std_logic_vector(63 downto 0);
                                  command : IN std_logic_vector(3 downto 0);
                                  addr_parity : IN std_logic;
                                  data_parity : IN std_logic;
                                  VARIABLE burst_count : IN integer;
                                  initial_data_delay : IN integer;
                                  next_data_delay : IN integer;
                                  m64bit_in : IN std_logic;
                                  initial_array_position : IN integer;
                                  VARIABLE pass_fail : INOUT std_logic;
                                  quiet : IN std_logic;
                                  last_data : INOUT std_logic_vector(63 downto 0);
                                  hold_req : IN std_logic;
                                  SIGNAL req_reg : INOUT std_logic;
                                  SIGNAL irdy_reg : INOUT std_logic;
                                  SIGNAL frame_oe : OUT std_logic;
                                  SIGNAL frame_reg : INOUT std_logic;
                                  SIGNAL idsel_oe : OUT std_logic;
                                  SIGNAL pci_ad_oe : OUT std_logic;
                                  SIGNAL pci_cbe_oe : OUT std_logic;
                                  SIGNAL pci_ad_reg : OUT std_logic_vector(63 downto 0);
                                  SIGNAL pci_cbe_reg : OUT std_logic_vector(7 downto 0);
                                  SIGNAL idsel_reg : OUT std_logic;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -