Please wait until document has finished loading (reload)
|
[Donate]
library IEEE;
use IEEE.std_logic_1164.all;
use work.config.all;
use work.iface.all;
use work.leonlib.all;
use work.debug.all;
use STD.TEXTIO.all;
entity tbgen is
generic (
msg1 : string := "32 kbyte 32-bit rom, 0-ws";
msg2 : string := "2x128 kbyte 32-bit ram, 0-ws";
pcihost : boolean := false; DISASS : integer := 0; clkperiod : integer := 20; romfile : string := "tsource/rom.dat"; ramfile : string := "tsource/ram.dat"; sdramfile : string := "tsource/sdram.rec"; romwidth : integer := 32; romdepth : integer := 13; romtacc : integer := 10; ramwidth : integer := 32; ramdepth : integer := 15; rambanks : integer := 2; bytewrite : boolean := true; ramtacc : integer := 10 );
end;
architecture behav of tbgen is
component iram
generic (index : integer := 0; Abits: Positive := 10; echk : integer := 0; tacc : integer := 10; fname : string := "ram.dat"); port (
A : in std_logic_vector;
D : inout std_logic_vector(7 downto 0);
CE1 : in std_logic;
WE : in std_logic;
OE : in std_logic
); end component;
component testmod
port (
clk : in std_logic;
dsurx : in std_logic;
dsutx : out std_logic;
error : in std_logic;
iosn : in std_logic;
oen : in std_logic;
read : in std_logic;
writen : in std_logic;
brdyn : out std_logic;
bexcn : out std_logic;
address : in std_logic_vector(7 downto 0);
data : inout std_logic_vector(31 downto 0);
ioport : out std_logic_vector(15 downto 0)
);
end component;
component mt48lc16m16a2
generic (index : integer := 0; fname : string := "tsrouce/sdram.rec"); PORT (
Dq : INOUT STD_LOGIC_VECTOR (15 DOWNTO 0);
Addr : IN STD_LOGIC_VECTOR (12 DOWNTO 0);
Ba : IN STD_LOGIC_VECTOR (1 downto 0);
Clk : IN STD_LOGIC;
Cke : IN STD_LOGIC;
Cs_n : IN STD_LOGIC;
Ras_n : IN STD_LOGIC;
Cas_n : IN STD_LOGIC;
We_n : IN STD_LOGIC;
Dqm : IN STD_LOGIC_VECTOR (1 DOWNTO 0)
);
END component;
function to_xlhz(i : std_logic) return std_logic is
begin
case to_X01Z(i) is
when 'Z' => return('Z');
when '0' => return('L');
when '1' => return('H');
when others => return('X');
end case;
end;
TYPE logic_xlhz_table IS ARRAY (std_logic'LOW TO std_logic'HIGH) OF std_logic;
CONSTANT cvt_to_xlhz : logic_xlhz_table := (
'Z', 'Z', 'L', 'H', 'Z', 'Z', 'Z', 'Z', 'Z' );
function buskeep (signal v : in std_logic_vector) return std_logic_vector is
variable res : std_logic_vector(v'range);
begin
for i in v'range loop res(i) := cvt_to_xlhz(v(i)); end loop;
return(res);
end;
signal clk : std_logic := '0';
signal Rst : std_logic := '0'; constant ct : integer := clkperiod/2;
signal address : std_logic_vector(27 downto 0);
signal data : std_logic_vector(31 downto 0);
signal ramsn : std_logic_vector(4 downto 0);
signal ramoen : std_logic_vector(4 downto 0);
signal rwen : std_logic_vector(3 downto 0);
signal rwenx : std_logic_vector(3 downto 0);
signal romsn : std_logic_vector(1 downto 0);
signal iosn : std_logic;
signal oen : std_logic;
signal read : std_logic;
signal writen : std_logic;
signal brdyn : std_logic;
signal bexcn : std_logic;
signal wdog : std_logic;
signal dsuen, dsutx, dsurx, dsubre, dsuact : std_logic;
signal test : std_logic;
signal error : std_logic;
signal pio : std_logic_vector(15 downto 0);
signal GND : std_logic := '0';
signal VCC : std_logic := '1';
signal NC : std_logic := 'Z';
signal clk2 : std_logic := '1';
signal pci_rst_n : std_logic := '0';
signal pci_clk : std_logic := '0';
signal pci_gnt_in_n: std_logic := '0';
signal pci_ad : std_logic_vector(31 downto 0);
signal pci_cbe_n : std_logic_vector(3 downto 0);
signal pci_frame_n : std_logic;
signal pci_irdy_n : std_logic;
signal pci_trdy_n : std_logic;
signal pci_devsel_n: std_logic;
signal pci_stop_n : std_logic;
signal pci_perr_n : std_logic;
signal pci_par : std_logic;
signal pci_req_n : std_logic;
signal pci_serr_n : std_logic;
signal pci_idsel_in: std_logic;
signal pci_lock_n : std_logic;
signal pci_host : std_logic;
signal pci_arb_req_n : std_logic_vector(0 to 3);
signal pci_arb_gnt_n : std_logic_vector(0 to 3);
signal power_state : std_logic_vector(1 downto 0);
signal pci_66 : std_logic;
signal pme_enable : std_logic;
signal pme_clear : std_logic;
signal pme_status : std_logic;
signal sdcke : std_logic_vector ( 1 downto 0); signal sdcsn : std_logic_vector ( 1 downto 0); signal sdwen : std_logic; signal sdrasn : std_logic; signal sdcasn : std_logic; signal sddqm : std_logic_vector ( 3 downto 0); signal sdclk : std_logic;
signal plllock : std_logic;
signal emdio : std_logic;
signal etx_clk : std_logic := '0';
signal erx_clk : std_logic := '0';
signal erxd : std_logic_vector(3 downto 0);
signal erx_dv : std_logic;
signal erx_er : std_logic;
signal erx_col : std_logic;
signal erx_crs : std_logic;
signal etxd : std_logic_vector(3 downto 0);
signal etx_en : std_logic;
signal etx_er : std_logic;
signal emdc : std_logic;
signal emddis : std_logic;
signal epwrdwn : std_logic;
signal ereset : std_logic;
signal esleep : std_logic;
signal epause : std_logic;
begin
clk <= not clk after ct * 1 ns;
rst <= '0', '1' after clkperiod*10 * 1 ns;
dsuen <= '1'; dsubre <= '0';
etx_clk <= not etx_clk after 25 ns when ETHEN else '0';
erx_clk <= not etx_clk after 25 ns when ETHEN else '0';
emdio <= 'H'; erxd <= "0011"; erx_dv <= '0'; erx_er <= '0';
erx_col <= '0'; erx_crs <= '0';
pci_clk <= not pci_clk after 15 ns when PCIEN else '0';
pci_rst_n <= '0', '1' after clkperiod*10 * 1 ns;
pci_frame_n <= 'H';
pci_ad <= (others => 'H');
pci_cbe_n <= (others => 'H');
pci_par <= 'H';
pci_req_n <= 'H';
pci_idsel_in <= 'H';
pci_lock_n <= 'H';
pci_irdy_n <= 'H';
pci_trdy_n <= 'H';
pci_devsel_n <= 'H';
pci_stop_n <= 'H';
pci_perr_n <= 'H';
pci_serr_n <= 'H';
pci_host <= '1' when pcihost else '0';
p0 : if not PCIEN and not ETHEN generate
leon0 : leon port map (rst, clk, sdclk, plllock,
error, address, data,
ramsn, ramoen, rwenx, romsn, iosn, oen, read, writen, brdyn,
bexcn, sdcke, sdcsn, sdwen, sdrasn, sdcasn, sddqm, sdclk,
pio, wdog, dsuen, dsutx, dsurx, dsubre, dsuact, test);
end generate;
p1 : if PCIEN and not ETHEN generate
leon0 : leon_pci
port map (rst, clk, sdclk, plllock,
error, address, data,
ramsn, ramoen, rwenx, romsn, iosn, oen, read, writen,
brdyn, bexcn,
sdcke, sdcsn, sdwen, sdrasn, sdcasn, sddqm, sdclk,
pio, wdog, dsuen, dsutx, dsurx, dsubre, dsuact, test,
pci_rst_n, pci_clk, pci_gnt_in_n, pci_idsel_in,
pci_lock_n, pci_ad, pci_cbe_n, pci_frame_n, pci_irdy_n,
pci_trdy_n, pci_devsel_n, pci_stop_n, pci_perr_n, pci_par,
pci_req_n, pci_serr_n, pci_host, pci_66, pci_arb_req_n,
pci_arb_gnt_n, power_state, pme_enable, pme_clear, pme_status );
end generate;
p2 : if PCIEN and ETHEN generate
leon0 : leon_eth_pci port map (rst, clk, sdclk, plllock,
error, address, data,
ramsn, ramoen, rwenx, romsn, iosn, oen, read, writen, brdyn,
bexcn, sdcke, sdcsn, sdwen, sdrasn, sdcasn, sddqm, sdclk,
pio, wdog, dsuen, dsutx, dsurx, dsubre, dsuact, test,
pci_rst_n, pci_clk, pci_gnt_in_n, pci_idsel_in,
pci_lock_n, pci_ad, pci_cbe_n, pci_frame_n, pci_irdy_n,
pci_trdy_n, pci_devsel_n, pci_stop_n, pci_perr_n, pci_par,
pci_req_n, pci_serr_n, pci_host, pci_66, pci_arb_req_n,
pci_arb_gnt_n, power_state, pme_enable, pme_clear, pme_status,
emdio, etx_clk, erx_clk, erxd, erx_dv, erx_er, erx_col, erx_crs,
etxd, etx_en, etx_er, emdc,
emddis, epwrdwn, ereset, esleep, epause);
end generate;
p3 : if not PCIEN and ETHEN generate
leon0 : leon_eth port map (rst, clk, sdclk, plllock,
error, address, data,
ramsn, ramoen, rwenx, romsn, iosn, oen, read, writen, brdyn,
bexcn, sdcke, sdcsn, sdwen, sdrasn, sdcasn, sddqm, sdclk,
pio, wdog, dsuen, dsutx, dsurx, dsubre, dsuact,
emdio, etx_clk, erx_clk, erxd, erx_dv, erx_er, erx_col, erx_crs,
etxd, etx_en, etx_er, emdc,
emddis, epwrdwn, ereset, esleep, epause, test);
end generate;
rwen <= rwenx when bytewrite else (rwenx(0) & rwenx(0) & rwenx(0) & rwenx(0));
rom8d : if romwidth = 8 generate
pio(1 downto 0) <= "LL";
rom0 : iram
generic map (index => 0, abits => romdepth, echk => 2, tacc => romtacc,
fname => romfile)
port map (A => address(romdepth-1 downto 0), D => data(31 downto 24),
CE1 => romsn(0), WE => VCC, OE => oen);
rom2 : process (address, romsn, writen)
begin
if (writen and not romsn(1)) = '1' then
case address(1 downto 0) is
when "00" => data(31 downto 24) <= "00000001";
when "01" => data(31 downto 24) <= "00100011";
when "10" => data(31 downto 24) <= "01000101";
when others => data(31 downto 24) <= "01100111";
end case;
else data(31 downto 24) <= (others => 'Z'); end if;
end process;
end generate;
rom16d : if romwidth = 16 generate
pio(1 downto 0) <= "LH";
romarr : for i in 0 to 1 generate
rom0 : iram
generic map (index => i, abits => romdepth, echk => 4, tacc => romtacc,
fname => romfile)
port map (A => address(romdepth downto 1),
D => data((31 - i*8) downto (24-i*8)), CE1 => romsn(0),
WE => VCC, OE => oen);
end generate;
rom2 : process (address, romsn, writen)
begin
if (writen and not romsn(1)) = '1' then
case address(1 downto 0) is
when "00" => data(31 downto 16) <= "0000000100100011";
when others => data(31 downto 16) <= "0100010101100111";
end case;
else data(31 downto 16) <= (others => 'Z'); end if;
end process;
end generate;
rom32d : if romwidth = 32 generate
pio(1 downto 0) <= "HH";
romarr : for i in 0 to 3 generate
rom0 : iram
generic map (index => i, abits => romdepth, echk => 0, tacc => romtacc,
fname => romfile)
port map (A => address(romdepth+1 downto 2),
D => data((31 - i*8) downto (24-i*8)), CE1 => romsn(0),
WE => VCC, OE => oen);
end generate;
data(31 downto 0) <= "00000001001000110100010101100111" when (romsn(1) or not writen) = '0'
else (others => 'Z');
end generate;
ram8d : if ramwidth = 8 generate
ram0 : iram
generic map (index => 0, abits => ramdepth, echk => 2, tacc => ramtacc,
fname => ramfile)
port map (A => address(ramdepth-1 downto 0), D => data(31 downto 24),
CE1 => ramsn(0), WE => rwen(0), OE => ramoen(0));
end generate;
ram16d : if ramwidth = 16 generate
rambnk : for i in 0 to rambanks-1 generate
ramarr : for j in 0 to 1 generate
ram0 : iram
generic map (index => j, abits => ramdepth, echk => 4,
tacc => ramtacc, fname => ramfile)
port map (A => address(ramdepth downto 1),
D => data((31 - j*8) downto (24-j*8)), CE1 => ramsn(i),
WE => rwen(j), OE => ramoen(i));
end generate;
end generate;
end generate;
ram32d : if ramwidth = 32 generate
rambnk : for i in 0 to rambanks-1 generate
ramarr : for j in 0 to 3 generate
ram0 : iram
generic map (index => j, abits => ramdepth, echk => 0,
tacc => ramtacc, fname => ramfile)
port map (A => address(ramdepth+1 downto 2),
D => data((31 - j*8) downto (24-j*8)), CE1 => ramsn(i),
WE => rwen(j), OE => ramoen(i));
end generate;
end generate;
end generate;
bootmsg : process(rst)
begin
if rst'event and (rst = '1') then print("LEON-2 generic testbench (leon2-"& LEON_VERSION & ")");
print("Bug reports to Jiri Gaisler, jiri@gaisler.com");
print("");
print("Testbench configuration:");
print(msg1); print(msg2); print("");
end if;
end process;
sdram : if SDRAMEN generate
u0: mt48lc16m16a2 generic map (index => 0, fname => sdramfile)
PORT MAP(
Dq => data(31 downto 16), Addr => address(14 downto 2),
Ba => address(16 downto 15), Clk => sdclk, Cke => sdcke(0),
Cs_n => sdcsn(0), Ras_n => sdrasn, Cas_n => sdcasn, We_n => sdwen,
Dqm => sddqm(3 downto 2));
u1: mt48lc16m16a2 generic map (index => 16, fname => sdramfile)
PORT MAP(
Dq => data(15 downto 0), Addr => address(14 downto 2),
Ba => address(16 downto 15), Clk => sdclk, Cke => sdcke(0),
Cs_n => sdcsn(0), Ras_n => sdrasn, Cas_n => sdcasn, We_n => sdwen,
Dqm => sddqm(1 downto 0));
u2: mt48lc16m16a2 generic map (index => 0, fname => sdramfile)
PORT MAP(
Dq => data(31 downto 16), Addr => address(14 downto 2),
Ba => address(16 downto 15), Clk => sdclk, Cke => sdcke(0),
Cs_n => sdcsn(1), Ras_n => sdrasn, Cas_n => sdcasn, We_n => sdwen,
Dqm => sddqm(3 downto 2));
u3: mt48lc16m16a2 generic map (index => 16, fname => sdramfile)
PORT MAP(
Dq => data(15 downto 0), Addr => address(14 downto 2),
Ba => address(16 downto 15), Clk => sdclk, Cke => sdcke(0),
Cs_n => sdcsn(1), Ras_n => sdrasn, Cas_n => sdcasn, We_n => sdwen,
Dqm => sddqm(1 downto 0));
end generate;
testmod0 : testmod port map (clk, dsutx, dsurx, error, iosn, oen, read,
writen, brdyn, bexcn, address(7 downto 0), data , pio);
test <= '1' when DISASS > 0 else '0';
pio(14) <= to_XLHZ(pio(11)); pio(10) <= to_XLHZ(pio(15)); pio(12) <= to_XLHZ(pio(9)); pio(8) <= to_XLHZ(pio(13));
pio(15) <= 'H';
pio(13) <= 'H';
pio(11) <= 'H';
pio(9) <= 'H';
pio(2) <= 'H' when not bytewrite else 'L';
pio(3) <= wdog when WDOGEN else 'H'; wdog <= 'H'; error <= 'H'; data <= (others => 'H');
data <= buskeep(data) after 5 ns;
wsgen : process
begin
if (romtacc < (2*clkperiod - 20)) then pio(5 downto 4) <= "LL";
elsif (romtacc < (3*clkperiod - 20)) then pio(5 downto 4) <= "LH";
elsif (romtacc < (4*clkperiod - 20)) then pio(5 downto 4) <= "HL";
else pio(5 downto 4) <= "HH"; end if;
if (ramtacc < (2*clkperiod - 20)) then pio(7 downto 6) <= "LL";
elsif (ramtacc < (3*clkperiod - 20)) then pio(7 downto 6) <= "LH";
elsif (ramtacc < (4*clkperiod - 20)) then pio(7 downto 6) <= "HL";
else pio(7 downto 6) <= "HH"; end if;
wait on rst;
end process;
end ;
Function to_xlhz defined in /tmp/build_html/vhdl/tbench/dep_tbgen.vhd
function to_xlhz(i : std_logic) return std_logic is
begin
case to_X01Z(i) is
when 'Z' => return('Z');
when '0' => return('L');
when '1' => return('H');
when others => return('X');
end case;
end;
|
Function buskeep defined in /tmp/build_html/vhdl/tbench/dep_tbgen.vhd
function buskeep (signal v : in std_logic_vector) return std_logic_vector is
variable res : std_logic_vector(v'range);
begin
for i in v'range loop res(i) := cvt_to_xlhz(v(i)); end loop;
return(res);
end;
|
Function priority defined in /tmp/build_html/vhdl/core/ctrl/irqctrl2.vhd
function priority(v : std_logic_vector(31 downto 0)) return std_logic_vector is
begin
if v(31) = '1' then return("11111");
elsif v(30) = '1' then return("11110");
elsif v(29) = '1' then return("11101");
elsif v(28) = '1' then return("11100");
elsif v(27) = '1' then return("11011");
elsif v(26) = '1' then return("11010");
elsif v(25) = '1' then return("11001");
elsif v(24) = '1' then return("11000");
elsif v(23) = '1' then return("10111");
elsif v(22) = '1' then return("10110");
elsif v(21) = '1' then return("10101");
elsif v(20) = '1' then return("10100");
elsif v(19) = '1' then return("10011");
elsif v(18) = '1' then return("10010");
elsif v(17) = '1' then return("10001");
elsif v(16) = '1' then return("10000");
elsif v(15) = '1' then return("01111");
elsif v(14) = '1' then return("01110");
elsif v(13) = '1' then return("01101");
elsif v(12) = '1' then return("01100");
elsif v(11) = '1' then return("01011");
elsif v(10) = '1' then return("01010");
elsif v( 9) = '1' then return("01001");
elsif v( 8) = '1' then return("01000");
elsif v( 7) = '1' then return("00111");
elsif v( 6) = '1' then return("00110");
elsif v( 5) = '1' then return("00101");
elsif v( 4) = '1' then return("00100");
elsif v( 3) = '1' then return("00011");
elsif v( 2) = '1' then return("00010");
elsif v( 1) = '1' then return("00001");
else return ("00000"); end if;
end;
|
Type pci_config_type defined in /tmp/build_html/vhdl/sparc/leon_target.vhd
type pci_config_type is record
pcicore : pcitype; ahbmasters : integer; ahbslaves : integer; arbiter : boolean; fixpri : boolean; prilevels : integer; pcimasters : integer; vendorid : integer; deviceid : integer; subsysid : integer; revisionid : integer; classcode : integer; pmepads : boolean; p66pad : boolean; pcirstall : boolean; end record;
|
Type mctrl_config_type defined in /tmp/build_html/vhdl/sparc/leon_target.vhd
type mctrl_config_type is record
bus8en : boolean; bus16en : boolean; wendfb : boolean; ramsel5 : boolean; sdramen : boolean; sdinvclk : boolean; end record;
|
If you have question mail to: Konrad Eisele<eiselekd@web.de>, created: Wed Apr 14 13:07:33 WEDT 2004
;
This is part of the Core distribution