testsupport.vhd

来自「Actel Fusion System Management Developme」· VHDL 代码 · 共 647 行 · 第 1/2 页

VHD
647
字号
-- ********************************************************************/ 
-- Copyright 2007 Actel Corporation.  All rights reserved.
-- IP Engineering 
--
-- ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN 
-- ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED 
-- IN ADVANCE IN WRITING.  
--  
-- File:  testsupport.vhd
--     
-- Description: Simple APB Bus Controller
--              Support package for testbench  
--
-- Rev: 2.3   01Mar07 IPB  : Production Release   
--
-- Notes:
--
-- *********************************************************************/ 


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use work.support.all;

use work.textio.all;

package testsupport is

type TABCCONFIG is record 
   ID          : integer range 0 to 9  ;		 
   FAMILY      : integer range 0 to 19  ;		 
   APB_AWIDTH  : integer range 1 to 16  ;     
   APB_DWIDTH  : integer range 8 to 32  ;     
   APB_SDEPTH  : integer range 1 to 16  ;     
   ICWIDTH     : integer range 1 to 16  ;     
   ZRWIDTH     : integer range 0 to 16  ;     
   IIWIDTH     : integer range 1 to 32  ;     
   IFWIDTH     : integer range 0 to 28  ;     
   IOWIDTH     : integer range 1 to 32  ;     
   STWIDTH     : integer range 1 to 8   ;     
   EN_RAM      : integer range 0 to 1   ;     
   EN_AND      : integer range 0 to 1   ;     
   EN_XOR      : integer range 0 to 1   ;     
   EN_OR       : integer range 0 to 1   ;     
   EN_ADD      : integer range 0 to 1   ;     
   EN_INC      : integer range 0 to 1   ;     
   EN_SHL      : integer range 0 to 1   ;     
   EN_SHR      : integer range 0 to 1   ;     
   EN_CALL     : integer range 0 to 1   ;     
   EN_PUSH     : integer range 0 to 1   ;     
   EN_ACM      : integer range 0 to 1   ;     
   EN_MULT     : integer range 0 to 3   ;     
   EN_DATAM    : integer range 0 to 3   ;     
   EN_INT      : integer range 0 to 2   ;     
   ISRADDR     : integer range 0 to 65536;     
   DEBUG       : integer range 0 to 1   ; 
   INSMODE     : integer range 0 to 2   ;
   INITWIDTH   : integer range 1 to 16  ;  
   TESTMODE    : integer range 0 to 99  ;
   EN_IOREAD   : integer range 0 to 1   ;  
   EN_IOWRT    : integer range 0 to 1   ;  
   EN_ALURAM   : integer range 0 to 1   ;  
   EN_INDIRECT : integer range 0 to 1   ;  
end record;


function  tostr( x : integer) return string;
function  log2( x: integer ) return integer;
function  log2z( x: integer ) return integer;
function  APBsetup ( TN,FAMILY,INSMODE : integer) return TABCCONFIG;
function  set_generic(TN,X,Y: integer ) return integer;
function  override(X,Y: integer ) return integer;
function  overrideP(X,Y: integer ) return integer;
procedure printerror ( ERRORS : inout integer; str : string);
procedure checksetup (su : TABCCONFIG);

component APBModel 
  generic ( ID      : integer range 0 to 15;
            DEBUG   : integer range 0 to 1;
            AWIDTH  : integer range 1 to 16;
            DWIDTH  : integer range 8 to 32 
           );

  port ( PCLK        : in  std_logic;
         PRESETN     : in  std_logic;
         
         -- APB Interface
         PENABLE     : in  std_logic;
         PWRITE      : in  std_logic;
         PSEL        : in  std_logic;
         PADDR       : in  std_logic_vector( AWIDTH-1 downto 0);
         PWDATA      : in  std_logic_vector( DWIDTH-1 downto 0);
         PRDATA      : out std_logic_vector( DWIDTH-1 downto 0);
         PREADY      : out std_logic
       );
end component;

component MAKEHEX 
  generic ( ENABLE   : boolean;
            ID       : integer range 0 to 9 ;
            FAMILY   : integer range 0 to 21;
		    AWIDTH   : integer range 1 to 16;  
            DWIDTH   : integer range 8 to 32;   
            SDEPTH   : integer range 1 to 16;    
            ICWIDTH  : integer range 1 to 16;  
            IIWIDTH  : integer range 1 to 32;
            IFWIDTH  : integer range 0 to 28;
            TESTMODE : integer range 0 to 99			
           );
end component;

component INITGEN 
  generic ( ENABLE    : boolean;
            ID        : integer range 0 to 9 ;
            AWIDTH    : integer range 1 to 16;  
            DWIDTH    : integer range 8 to 32;   
            SDEPTH    : integer range 1 to 16 ;    
            ICWIDTH   : integer range 1 to 16;
			INITWIDTH : integer range 1 to 16  
           );
  port ( PCLK        : in  std_logic;
         PRESETN     : in  std_logic;

         -- RAM Initialization Port
         INITDATVAL  : out std_logic;
         INITDONE    : out std_logic; 
         INITADDR    : out std_logic_vector(INITWIDTH-1 downto 0);
         INITDATA    : out std_logic_vector(8 downto 0)
        );
end component;

end testsupport;


---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use work.support.all;


package body testsupport is

function log2( x: integer ) return integer is
begin
 case x is
   when 1   => return(0);
   when 2   => return(1);
   when 4   => return(2);
   when 8   => return(3);
   when 16  => return(4);
   when 32  => return(5);
   when 64  => return(6);
   when 128 => return(7);
   when 256 => return(8);
   when 512 => return(9);
   when others => return(-1);
 end case;
end log2;


function log2z( x: integer ) return integer is
begin
 case x is
   when 1   => return(1);
   when 2   => return(1);
   when 4   => return(2);
   when 8   => return(3);
   when 16  => return(4);
   when 32  => return(5);
   when 64  => return(6);
   when 128 => return(7);
   when 256 => return(8);
   when others => return(-1);
 end case;  
end log2z;


function set_generic(TN,X,Y: integer ) return integer is
begin
  if TN=0 then
    return(X);
  else
    return(Y);
  end if;
end set_generic;

function override(X,Y: integer ) return integer is
begin
  if X=-1 then
    return(Y);
  else
    return(X);
  end if;
end override;

function overrideP(X,Y: integer ) return integer is
begin
  case X is
    when 1 => return(0);
    when 2 => return(0);
    when 3 => return(1);
    when 4 => return(1);
    when 5 => return(2);
    when others => return(Y);
  end case;
end overrideP;


-- This function creates the core configuration based on the testmode
-- NOTES
--  Builds 0-6 match the Synthesis 
function APBsetup ( TN,FAMILY,INSMODE : integer) return TABCCONFIG is
variable setup : TABCCONFIG;
begin
 setup.FAMILY    := FAMILY;
 setup.TESTMODE  := TN;
 setup.INSMODE   := INSMODE;
 setup.INITWIDTH := 8;
 setup.ID        := 0;
 setup.DEBUG     := 1;
 -- Default settings
 setup.ZRWIDTH    := 8; 
 setup.IIWIDTH    := 4; 
 setup.IFWIDTH    := 4; 
 setup.IOWIDTH    := 8; 
 setup.EN_CALL    := 1; 
 setup.EN_MULT    := 1; 
 setup.EN_INC     := 1; 
 setup.EN_ADD     := 1; 
 setup.EN_AND     := 1; 
 setup.EN_OR      := 1; 
 setup.EN_XOR     := 1; 
 setup.EN_SHL     := 1; 
 setup.EN_SHR     := 1; 
 setup.EN_DATAM   := 2;
 setup.EN_RAM     := 1;
 setup.EN_ACM     := 1;
 setup.ICWIDTH    := 8;
 setup.STWIDTH    := 4;  
 setup.EN_PUSH    := 1;
 setup.INITWIDTH  := 16;
 setup.EN_INT     := 0;
 setup.ISRADDR    := 0;
 setup.EN_IOREAD  := 0;
 setup.EN_IOWRT   := 1;
 setup.EN_ALURAM  := 0;
 setup.EN_MULT    := 0;
 setup.EN_INDIRECT:= 0;
 
 
 case TN is 
     when 0 => -- Example for controlling CoreAI 
              setup.APB_AWIDTH   := 8;
              setup.APB_DWIDTH   := 16;
              setup.APB_SDEPTH   := 1;
              setup.ICWIDTH      := 5;
              setup.ZRWIDTH      := 0;
              setup.IIWIDTH      := 1;
              setup.IOWIDTH      := 2;
              setup.STWIDTH      := 1;
              setup.EN_RAM       := 0;
              setup.EN_AND       := 1;
              setup.EN_XOR       := 0;
              setup.EN_OR        := 0;
              setup.EN_ADD       := 1;
              setup.EN_INC       := 0;
              setup.EN_SHL       := 0;
              setup.EN_SHR       := 0;
              setup.EN_CALL      := 0;
              setup.EN_ACM       := 1;
              setup.EN_DATAM     := 2;
              setup.EN_INT       := 0;
              setup.EN_PUSH      := 0  ;
              setup.ISRADDR      := 0;

     when 1 => -- Build: Small 8 bit no adder
              setup.APB_AWIDTH   := 8  ;
              setup.APB_DWIDTH   := 8  ;
              setup.APB_SDEPTH   := 1  ;
              setup.ICWIDTH      := 5  ;
              setup.ZRWIDTH      := 0  ;
              setup.IIWIDTH      := 4  ;
              setup.IOWIDTH      := 8  ;
              setup.STWIDTH      := 1  ;
              setup.EN_RAM       := 0  ;
              setup.EN_AND       := 1  ;
              setup.EN_XOR       := 1  ;
              setup.EN_OR        := 0  ;
              setup.EN_ADD       := 0  ;
              setup.EN_INC       := 1  ;
              setup.EN_SHL       := 0  ;
              setup.EN_SHR       := 0  ;
              setup.EN_CALL      := 0  ;
              setup.EN_ACM       := 0  ;
              setup.EN_DATAM     := 2  ;
              setup.EN_PUSH      := 0  ;
              setup.EN_INT       := 0;
              setup.ISRADDR      := 0;
              
     when 2 => -- Build: Small 16 bit 
              setup.APB_AWIDTH   := 8 ;
              setup.APB_DWIDTH   := 16 ;
              setup.APB_SDEPTH   := 1 ;
              setup.ICWIDTH      := 5 ;
              setup.ZRWIDTH      := 0 ;
              setup.IIWIDTH      := 4 ;
              setup.IOWIDTH      := 8 ;
              setup.STWIDTH      := 1 ;
              setup.EN_RAM       := 0 ;
              setup.EN_AND       := 1 ;
              setup.EN_XOR       := 1 ;
              setup.EN_OR        := 0 ;
              setup.EN_ADD       := 1 ;
              setup.EN_INC       := 0 ;
              setup.EN_SHL       := 0 ;
              setup.EN_SHR       := 0 ;

⌨️ 快捷键说明

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