?? corepwm_pkg.vhd
字號:
-----------------------------------------------------------------------------
-- (c) Copyright 2005 Actel Corporation
--
-- name: corepwm_pkg.vhd
-- function: Testbench package for CorePWM
-- comments: best viewed with tabstops set to "4"
-- history: 05/05/03 - TFB created
--
-- Rev: 3.0 23May08 SMT - Production
--
-----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_misc.all;
library std;
use std.textio.all;
package corepwm_pkg is
-- functions, procedures, constants, etc...
---------------------------------------------------------------------------
-- TFB 4/29/03 - created various procedures for CPU operations
procedure cpu_wr (
constant addr: in bit_vector(7 downto 0);
constant d: in bit_vector(7 downto 0);
signal clk: in std_logic;
signal a: out std_logic_vector (7 downto 0);
signal do: out std_logic_vector (7 downto 0);
signal sel: out std_logic;
signal wr: out std_logic;
signal en: out std_logic
);
procedure cpu_rd (
-- only 2 LSB bits used out of 8 legacy
-- constant addr: in bit_vector(7 downto 0);
constant addr: in bit_vector(7 downto 0);
constant d: in bit_vector(7 downto 0);
signal clk: in std_logic;
signal a: out std_logic_vector (7 downto 0);
signal di: in std_logic_vector (7 downto 0);
signal sel: out std_logic;
signal wr: out std_logic;
signal en: out std_logic;
simerrors: inout integer
);
---------------------------------------------------------------------------
constant MAXSTRLEN : INTEGER := 256;
type T_NUMTYPE is ( NONE, INT, VECT, STRG);
--subtype QWORD is std_logic_vector (63 downto 0);
constant MAXBYTES : integer := 256;
subtype QWORD is std_logic_vector ((MAXBYTES*8)-1 downto 0);
type T_FMT is record
f_type : T_NUMTYPE;
f_integer : INTEGER;
f_vector : QWORD;
f_length : INTEGER;
f_string : STRING (1 to MAXSTRLEN);
end record;
type T_FMT_ARRAY is array ( integer range <> ) of T_FMT;
function is01 ( v: std_logic) return BOOLEAN;
function is01 ( v: std_logic_vector; len : INTEGER) return BOOLEAN;
function strlen( str: STRING) return INTEGER;
function strcopy ( instr : STRING) return STRING;
procedure printf( str : STRING; params : T_FMT_ARRAY);
procedure printf( str : STRING; params : T_FMT);
procedure printf( str : STRING );
procedure ifprintf( enable : BOOLEAN; str : STRING; params : T_FMT_ARRAY);
procedure ifprintf( enable : BOOLEAN; str : STRING; params : T_FMT);
procedure ifprintf( enable : BOOLEAN; str : STRING );
function fmt ( x : INTEGER) return T_FMT;
function fmt ( x : std_logic_vector) return T_FMT;
function fmt ( x : string ) return T_FMT;
function fmt ( x : boolean ) return T_FMT;
function fmt ( x : std_logic) return T_FMT;
procedure fprintf( FSTR : out text; str : STRING; params : T_FMT_ARRAY);
procedure fprintf( FSTR : out text; str : STRING; params : T_FMT);
procedure fprintf( FSTR : out text; str : STRING );
function inttostr( value : INTEGER; base : INTEGER;
numlen : INTEGER :=0; zeros: BOOLEAN:=FALSE) return STRING;
-- Check value of signal (expected output) & print message if mis-match
procedure checksig (
d: std_logic;
sig_name: string;
v: bit;
ERRCNT: inout integer
);
-- Check value of signal (expected output) & print message if mis-match
procedure checksig (
d: std_logic_vector;
sig_name: string;
v: bit_vector;
ERRCNT: inout integer
);
function sl2int (s: std_logic) return integer;
function sl2int (s: std_logic_vector) return integer;
function int2slv(val: in integer; len: in integer) return std_logic_vector;
function sl2x01z(s: std_logic) return std_logic;
--function vlg2x01z(s: character) return std_logic;
function vlg2x01z(s: string(1 to 1)) return std_logic;
function slv2x01z(s: std_logic_vector) return std_logic_vector;
function hex2sl(s: character) return std_logic;
function hexv2slv(s: string) return std_logic_vector;
-- expected vector types
type evbit is ('0','1','2','3','4','5','6','7','8');
type evvec is array (integer range <>) of evbit;
subtype evbyte is evvec(7 downto 0);
function ev2sl(e: evbit) return std_logic;
function evv2slv(e: evbyte) return std_logic_vector;
function to_evbit(c: character) return evbit;
-- small function to do hex numbers for std_logic_vector
function hx (b: bit_vector) return std_logic_vector;
-- store simulation vectors for DUT
subtype BV128 is bit_vector (127 downto 0);
type SVEC1_WORD is array (integer range 0 to 2) of BV128;
type SVEC1_STORE is array (integer range <>) of SVEC1_WORD;
end corepwm_pkg;
---------------------------------- Pkg Body ----------------------------------
package body corepwm_pkg is
---------------------------------------------------------------------------
-- Basic Character Converters
--
function to_char( x : INTEGER range 0 to 15) return character is
begin
case x is
when 0 => return('0');
when 1 => return('1');
when 2 => return('2');
when 3 => return('3');
when 4 => return('4');
when 5 => return('5');
when 6 => return('6');
when 7 => return('7');
when 8 => return('8');
when 9 => return('9');
when 10 => return('A');
when 11 => return('B');
when 12 => return('C');
when 13 => return('D');
when 14 => return('E');
when 15 => return('F');
end case;
end to_char;
function to_char( v : std_logic ) return CHARACTER is
begin
case v is
when '0' => return('0');
when '1' => return('1');
when 'L' => return('L');
when 'H' => return('H');
when 'Z' => return('Z');
when 'X' => return('X');
when 'U' => return('U');
when '-' => return('-');
when 'W' => return('W');
end case;
end to_char;
---------------------------------------------------------------------------
-- special std_logic_vector handling
--
function is01 ( v: std_logic) return BOOLEAN is
begin
return ( v='0' or v='1');
end is01;
function is01 ( v: std_logic_vector; len : INTEGER) return BOOLEAN is
variable ok : BOOLEAN;
begin
ok := TRUE;
for i in 0 to len-1 loop
ok := ok and is01( v(i));
end loop;
return (ok);
end is01;
---------------------------------------------------------------------------
-- String Functions
--
function strlen( str: STRING) return INTEGER is
variable i: INTEGER;
begin
i:=1;
while i<= MAXSTRLEN and str(i)/=NUL loop
i:=i+1;
end loop;
return(i-1);
end strlen;
function strcopy ( instr : STRING) return STRING is
variable outstr : STRING (1 to MAXSTRLEN);
variable i: INTEGER;
begin
outstr(1 to instr'length) := instr;
outstr(instr'length+1) := NUL;
return(outstr);
end strcopy;
---------------------------------------------------------------------------
-- Number Printing Routines
--
function hexchar ( vect : std_logic_vector) return character is
variable v : std_logic_vector ( 3 downto 0);
variable char : CHARACTER;
begin
v := vect;
if is01(v(0)) and is01(v(1)) and is01(v(2)) and is01(v(3)) then
char := to_char (conv_integer(v));
elsif v(0)=v(1) and v(0)=v(2) and v(0)=v(3) then
char:= to_char(v(0));
else
char:='?';
end if;
return(char);
end hexchar;
function inttostr( value : INTEGER; base : INTEGER;
numlen : INTEGER :=0; zeros: BOOLEAN:=FALSE) return STRING is
variable str : STRING (1 to MAXSTRLEN);
variable s1 : STRING (MAXSTRLEN downto 1);
variable pos,x,xn,x1 : INTEGER;
begin
if value=-2147483648 then
str(1 to 9) := "UNDERFLOW";
str(10) := NUL;
else
x := abs(value);
pos := 0;
while x>0 or pos=0 loop
pos:=pos+1;
xn := x / base;
x1 := x - xn * base ;
x := xn;
s1(pos) := to_char(x1);
end loop;
if value<0 then
pos:=pos+1;
s1(pos):='-';
end if;
if pos>numlen then
str(1 to pos) := s1 (pos downto 1);
str(pos+1) := NUL;
else
case ZEROS is
when TRUE => str := (others => '0');
when FALSE => str := (others => ' ');
end case;
str( (1+numlen-pos) to numlen) := s1(pos downto 1);
str(numlen+1) := NUL;
end if;
end if;
return(str);
end inttostr;
function vecttostr( value : std_logic_vector; len : INTEGER; base : INTEGER;
numlen : INTEGER :=0;
zeros: BOOLEAN:=FALSE) return STRING is
variable str : STRING (1 to MAXSTRLEN);
variable s1 : STRING (MAXSTRLEN downto 1);
variable pos, len4 : INTEGER;
variable x : QWORD;
variable vect4 : std_logic_vector(3 downto 0);
begin
x:=value;
if len<64 then
x(63 downto len) := (others =>'0');
end if;
case base is
when 2 => for i in 0 to len-1 loop
s1(i+1) := to_char(value(i));
end loop;
pos:=len;
when 16 => len4 := ((len+3)/4);
for i in 0 to len4-1 loop
vect4 := x( 3+(4*i) downto 4*i);
s1(i+1) := hexchar(vect4);
end loop;
pos:=len4;
when others => s1:=strcopy("ESAB LAGELLI");
end case;
if pos>numlen then
str(1 to pos) := s1 (pos downto 1);
str(pos+1) := NUL;
else
case ZEROS is
when TRUE => str := (others => '0');
when FALSE => str := (others => ' ');
end case;
str( (1+numlen-pos) to numlen) := s1(pos downto 1);
str(numlen+1) := NUL;
end if;
return(str);
end vecttostr;
---------------------------------------------------------------------------
-- Multi Type input handlers
--
function fmt ( x : BOOLEAN) return T_FMT is
variable fm : T_FMT;
begin
fm.f_type := INT;
if x then fm.f_integer := 1;
else fm.f_integer := 0;
end if;
return(fm);
end fmt;
function fmt ( x : INTEGER) return T_FMT is
variable fm : T_FMT;
begin
fm.f_type := INT;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -