OpenCores
URL https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk

Subversion Repositories pcie_ds_dma

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /pcie_ds_dma/trunk/projects/ambpex5_sx50t_wishbone/src
    from Rev 15 to Rev 16
    Reverse comparison

Rev 15 → Rev 16

/testbench/test_pkg.vhd
0,0 → 1,1910
---------------------------------------------------------------------------------------------------
--
-- Title : test_pkg.vhd
-- Author : Dmitry Smekhov
-- Company : Instrumental System
--
-- Version : 1.0
--
---------------------------------------------------------------------------------------------------
--
 
--
---------------------------------------------------------------------------------------------------
--
-- Version 1.1 (25.10.2011) Kuzmi4
-- Description: add couple of simple tests for test WB stuff, let "test_num_1" unchanged.
--
---------------------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use std.textio.all;
 
library work;
use work.cmd_sim_pkg.all;
use work.block_pkg.all;
use work.wb_block_pkg.all;
 
package test_pkg is
--! Initialising
procedure test_init(
 
);
--! Finished
procedure test_close;
--! Start DMA with incorrect descriptor
procedure test_dsc_incorrect (
 
 
);
 
--! Start DMA for one block 4 kB
procedure test_read_4kb (
 
 
);
 
--! Read block_test_check 8 kB
procedure test_adm_read_8kb (
 
 
);
 
 
--procedure test_block_main (
 
 
-- );
--
 
--procedure test_adm_read_16kb (
 
 
-- );
--
 
procedure test_adm_write_16kb (
 
 
);
---------------------------------------------------------------------------------------------------
--
--
--
procedure test_num_1(
 
 
);
procedure test_num_2(
 
 
);
-- ==> TEST_CHECK.WB_CFG_SLAVE
procedure test_wb_1(
 
 
);
-- ==> TEST_GEN.WB_CFG_SLAVE
procedure test_wb_2(
 
 
);
end package test_pkg;
---------------------------------------------------------------------------------------------------
package body test_pkg is
FILE log: text;
shared variable cnt_ok, cnt_error: integer;
-- Initialising
procedure test_init(
fname: in string
) is
begin
file_open( log, fname, WRITE_MODE );
cnt_ok:=0;
cnt_error:=0;
end test_init;
--! Finished
procedure test_close is
variable str : LINE; -- pointer to string
begin
std.textio.write( str, string'(" " ));
writeline( log, str );
writeline( log, str );
write( str, string'("check completed" ));
writeline( log, str );
write( str, string'("the number of successful tests: " ));
write( str, cnt_ok );
writeline( log, str );
write( str, string'("the number of false test: " ));
write( str, cnt_error );
writeline( log, str );
file_close( log );
if( cnt_ok>0 and cnt_error=0 ) then
write( str, string'("TEST finished successfully") );
writeline( output, str );
else
write( str, string'("TEST finished with ERR") );
writeline( output, str );
end if;
end test_close;
--! Start DMA with incorrect descriptor
procedure test_dsc_incorrect (
 
 
)
is
 
variable adr : std_logic_vector( 31 downto 0 );
variable data : std_logic_vector( 31 downto 0 );
variable str : line;
begin
write( str, string'("TEST_DSC_INCORRECT" ));
writeline( log, str );
---- Init block of descriptor ---
for ii in 0 to 127 loop
adr:= x"00100000";
adr:=adr + ii*4;
int_mem_write( cmd, ret, adr, x"00000000" );
end loop;
int_mem_write( cmd, ret, x"00100000", x"03020100" );
int_mem_write( cmd, ret, x"001001FC", x"FF00AA00" );
---- DMA program ----
block_write( cmd, ret, 4, 8, x"00000027" ); -- DMA_MODE
block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
block_write( cmd, ret, 4, 20, x"00100000" ); -- PCI_ADRL
block_write( cmd, ret, 4, 21, x"00100000" ); -- PCI_ADRH
block_write( cmd, ret, 4, 23, x"0000A400" ); -- LOCAL_ADR
block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
wait for 20 us;
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data( 15 downto 0 )=x"A021" ) then
write( str, string'(" - Ok" ));
cnt_ok := cnt_ok + 1;
else
write( str, string'(" - Error" ));
cnt_error := cnt_error + 1;
end if;
writeline( log, str );
block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL - STOP
end test_dsc_incorrect;
 
--! Start DMA for one block 4 kB
procedure test_read_4kb (
 
 
)
is
 
variable adr : std_logic_vector( 31 downto 0 );
variable data : std_logic_vector( 31 downto 0 );
variable str : line;
 
variable error : integer:=0;
variable dma_complete : integer;
 
begin
write( str, string'("TEST_READ_4KB" ));
writeline( log, str );
---- Init block of descriptor ---
for ii in 0 to 127 loop
adr:= x"00100000";
adr:=adr + ii*4;
int_mem_write( cmd, ret, adr, x"00000000" );
end loop;
int_mem_write( cmd, ret, x"00100000", x"00008000" );
int_mem_write( cmd, ret, x"00100004", x"00000100" );
 
int_mem_write( cmd, ret, x"001001F8", x"00000000" );
int_mem_write( cmd, ret, x"001001FC", x"762C4953" );
--wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000001" ); -- reset
wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000000" );
wb_block_gen_read( cmd, ret, REG_BLOCK_ID, data ); -- read block id
write( str, string'("BLOCK TEST_GEN ID: " ));
hwrite( str, data );
writeline( log, str );
wb_block_gen_write( cmd, ret, REG_TEST_GEN_SIZE, x"00000001" ); -- size of block = 4 kByte
 
---- DMA program ----
block_write( cmd, ret, 4, 8, x"00000025" ); -- DMA_MODE - without request
block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
block_write( cmd, ret, 4, 20, x"00100000" ); -- PCI_ADRL
block_write( cmd, ret, 4, 21, x"00100000" ); -- PCI_ADRH
block_write( cmd, ret, 4, 23, TEST_GEN_WB_BURST_SLAVE ); -- LOCAL_ADR
 
wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"000006A0" ); -- start test sequence
 
wait for 1 us;
block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
--wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"000006A2" );
wait for 20 us;
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data( 8 )='1' ) then
write( str, string'(" - descriptor is correct" ));
else
write( str, string'(" - descriptor is incorrect" ));
error := error + 1;
end if;
writeline( log, str );
if( error=0 ) then
---- Wait for DMA finished ----
dma_complete := 0;
for ii in 0 to 100 loop
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data(5)='1' ) then
write( str, string'(" - DMA finished " ));
dma_complete := 1;
end if;
writeline( log, str );
if( dma_complete=1 ) then
exit;
end if;
wait for 1 us;
end loop;
writeline( log, str );
if( dma_complete=0 ) then
write( str, string'("Error - DMA not finished" ));
writeline( log, str );
error:=error+1;
end if;
 
end if;
for ii in 0 to 3 loop
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
writeline( log, str );
wait for 500 ns;
end loop;
block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL - STOP
write( str, string'(" Read: " ));
writeline( log, str );
for ii in 0 to 15 loop
 
adr:= x"00800000";
adr:=adr + ii*4;
int_mem_read( cmd, ret, adr, data );
write( str, ii ); write( str, string'(" " )); hwrite( str, data );
writeline( log, str );
end loop;
-- block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
-- block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL
-- block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
writeline( log, str );
if( error=0 ) then
write( str, string'("Test is correct" ));
cnt_ok := cnt_ok + 1;
else
write( str, string'("Test have ERRORS" ));
cnt_error := cnt_error + 1;
end if;
writeline( log, str );
writeline( log, str );
 
end test_read_4kb;
 
 
--! Read block_test_check 8 kB
procedure test_adm_read_8kb (
 
 
)
is
 
variable adr : std_logic_vector( 31 downto 0 );
variable data : std_logic_vector( 31 downto 0 );
variable str : line;
 
variable error : integer:=0;
variable dma_complete : integer;
 
begin
write( str, string'("TEST_ADM_READ_8KB" ));
writeline( log, str );
---- Init block of descriptor ---
for ii in 0 to 127 loop
adr:= x"00100000";
adr:=adr + ii*4;
int_mem_write( cmd, ret, adr, x"00000000" );
end loop;
--- Desctriptor 0 ---
int_mem_write( cmd, ret, x"00100000", x"00008000" );
int_mem_write( cmd, ret, x"00100004", x"00000111" ); -- jump to next descriptor
 
--- Desctriptor 1 ---
int_mem_write( cmd, ret, x"00100008", x"00008010" );
int_mem_write( cmd, ret, x"0010000C", x"00000110" ); -- stop
int_mem_write( cmd, ret, x"001001F8", x"00000000" );
int_mem_write( cmd, ret, x"001001FC", x"D6644953" );
 
block_write( cmd, ret, 4, 8, x"00000027" ); -- DMA_MODE
block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
block_write( cmd, ret, 4, 20, x"00100000" ); -- PCI_ADRL
block_write( cmd, ret, 4, 21, x"00100000" ); -- PCI_ADRH
block_write( cmd, ret, 4, 23, TEST_GEN_WB_BURST_SLAVE ); -- LOCAL_ADR
wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000001" ); -- reset
wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000000" );
wb_block_gen_read( cmd, ret, REG_BLOCK_ID, data ); -- read block id
write( str, string'("BLOCK TEST_GEN ID: " ));
hwrite( str, data );
writeline( log, str );
wb_block_gen_write( cmd, ret, REG_TEST_GEN_SIZE, x"00000001" ); -- size of block = 4 kByte
 
block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"000006A0" ); -- start test sequence
wait for 20 us;
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data( 8 )='1' ) then
write( str, string'(" - descriptor is correct" ));
else
write( str, string'(" - descriptor is incorrect" ));
error := error + 1;
end if;
writeline( log, str );
if( error=0 ) then
 
dma_complete := 0;
for ii in 0 to 100 loop
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data(5)='1' ) then
write( str, string'(" - DMA finished " ));
dma_complete := 1;
block_write( cmd, ret, 4, 16#11#, x"00000010" ); -- FLAG_CLR - reset EOT
end if;
writeline( log, str );
if( dma_complete=1 ) then
exit;
end if;
wait for 1 us;
end loop;
writeline( log, str );
if( dma_complete=0 ) then
write( str, string'("Error - DMA not finished " ));
writeline( log, str );
error:=error+1;
end if;
 
end if;
for ii in 0 to 3 loop
block_read( cmd, ret, 4, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
writeline( log, str );
wait for 500 ns;
end loop;
block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL - STOP
write( str, string'(" Block 0 - read: " ));
writeline( log, str );
for ii in 0 to 15 loop
 
adr:= x"00800000";
adr:=adr + ii*4;
int_mem_read( cmd, ret, adr, data );
write( str, ii ); write( str, string'(" " )); hwrite( str, data );
writeline( log, str );
end loop;
 
writeline( log, str );
write( str, string'(" Block 1 - read: " ));
writeline( log, str );
for ii in 0 to 15 loop
 
adr:= x"00801000";
adr:=adr + ii*4;
int_mem_read( cmd, ret, adr, data );
write( str, ii ); write( str, string'(" " )); hwrite( str, data );
writeline( log, str );
end loop;
-- block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
-- block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL
-- block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
writeline( log, str );
if( error=0 ) then
write( str, string'(" Test is correct " ));
cnt_ok := cnt_ok + 1;
else
write( str, string'(" Test have ERRORS " ));
cnt_error := cnt_error + 1;
end if;
writeline( log, str );
writeline( log, str );
 
end test_adm_read_8kb;
--
--
 
--procedure test_block_main (
 
 
-- )
--is
--
--variable adr : std_logic_vector( 31 downto 0 );
--variable data : std_logic_vector( 31 downto 0 );
--variable str : line;
--
--variable error : integer:=0;
--variable dma_complete : integer;
--
--begin
--
-- write( str, string'("TEST_BLOCK_MAIN" ));
-- writeline( log, str );
--
-- block_read( cmd, ret, 4, 16#00#, data );
 
--
-- wait for 10 us;
--
 
---- writeline( log, str );
---- for ii in 0 to 5 loop
 
---- write( str, ii );
---- for jj in 0 to 7 loop
---- block_read( cmd, ret, ii, jj, data );
---- write( str, " " );
---- hwrite( str, data );
---- end loop;
---- writeline( log, str );
---- end loop;
----
----
---- writeline( log, str );
----
---- block_read( cmd, ret, 0, 16#10#, data );
---- write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
----
---- block_write( cmd, ret, 80, 16#08#, x"00000100" );
----
---- block_read( cmd, ret, 0, 16#10#, data );
---- write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
----
---- block_write( cmd, ret, 80, 16#08#, x"00000200" );
----
---- block_read( cmd, ret, 0, 16#10#, data );
---- write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
----
----
---- writeline( log, str );
---- if( error=0 ) then
 
---- cnt_ok := cnt_ok + 1;
---- else
 
---- cnt_error := cnt_error + 1;
---- end if;
--
-- for ii in 0 to 127 loop
--
-- block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
-- block_read( cmd, ret, 4, 8, data );
-- write( str, string'("READ: " )); hwrite( str, data( 15 downto 0 ) ); writeline( log, str );
-- if( data/=x"0000AA55" ) then
-- error:=error+1;
-- end if;
--
-- end loop;
--
--
--
--
-- writeline( log, str );
-- writeline( log, str );
--
--end test_block_main;
--
--
--
--
 
--procedure test_adm_read_16kb (
 
 
-- )
--is
--
--variable adr : std_logic_vector( 31 downto 0 );
--variable data : std_logic_vector( 31 downto 0 );
--variable str : line;
--
--variable error : integer:=0;
--variable dma_complete : integer;
--variable kk : integer;
--variable status : std_logic_vector( 15 downto 0 );
--
--begin
--
-- write( str, string'("TEST_ADM_READ_16KB" ));
-- writeline( log, str );
--
 
-- for ii in 0 to 256 loop
-- adr:= x"00100000";
-- adr:=adr + ii*4;
-- int_mem_write( cmd, ret, adr, x"00000000" );
-- end loop;
--
 
--
 
-- int_mem_write( cmd, ret, x"00100000", x"00008000" );
 
--
 
-- int_mem_write( cmd, ret, x"00100008", x"00008010" );
 
--
 
 
-- int_mem_write( cmd, ret, x"00100014", x"00000000" );
--
--
-- int_mem_write( cmd, ret, x"001001F8", x"00000000" );
-- int_mem_write( cmd, ret, x"001001FC", x"14644953" );
--
--
 
--
 
-- int_mem_write( cmd, ret, x"00100200", x"00008020" );
 
--
 
-- int_mem_write( cmd, ret, x"00100208", x"00008030" );
 
--
--
-- int_mem_write( cmd, ret, x"001003F8", x"00000000" );
-- int_mem_write( cmd, ret, x"001003FC", x"D67C4953" );
--
--
--
 
-- block_write( cmd, ret, 4, 8, x"00000027" ); -- DMA_MODE
-- block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
--
-- block_write( cmd, ret, 4, 20, x"00100000" ); -- PCI_ADRL
-- block_write( cmd, ret, 4, 21, x"00100000" ); -- PCI_ADRH
-- block_write( cmd, ret, 4, 23, x"00019000" ); -- LOCAL_ADR
--
--
 
 
 
--
 
--
-- block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
--
 
--
 
--
 
--
-- wait for 20 us;
--
-- block_read( cmd, ret, 4, 16, data ); -- STATUS
--
-- write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
-- if( data( 8 )='1' ) then
 
-- else
 
-- error := error + 1;
-- end if;
--
-- writeline( log, str );
--
-- if( error=0 ) then
--
-- kk:=0;
-- loop
--
-- trd_status( cmd, ret, 6, status );
-- write( str, string'("TRD_STATUS: " )); hwrite( str, status );
--
-- block_read( cmd, ret, 4, 16, data ); -- STATUS
-- write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
--
-- if( data(4)='1' ) then
 
 
-- kk:=kk+1;
-- if( kk=4 ) then
-- exit;
-- end if;
-- end if;
-- writeline( log, str );
--
-- wait for 500 ns;
--
--
-- end loop;
--
 
-- dma_complete := 0;
-- for ii in 0 to 100 loop
--
-- block_read( cmd, ret, 4, 16, data ); -- STATUS
-- write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
-- if( data(5)='1' ) then
 
-- dma_complete := 1;
--
 
--
-- end if;
-- writeline( log, str );
--
-- if( dma_complete=1 ) then
-- exit;
-- end if;
--
-- wait for 1 us;
--
-- end loop;
--
-- writeline( log, str );
--
-- if( dma_complete=0 ) then
 
-- writeline( log, str );
-- error:=error+1;
-- end if;
--
-- end if;
--
-- for ii in 0 to 3 loop
--
-- block_read( cmd, ret, 4, 16, data ); -- STATUS
-- write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
-- writeline( log, str );
-- wait for 500 ns;
--
-- end loop;
--
--
-- block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL - STOP
--
 
-- writeline( log, str );
--
-- for ii in 0 to 15 loop
--
-- adr:= x"00800000";
-- adr:=adr + ii*4;
-- int_mem_read( cmd, ret, adr, data );
--
-- write( str, ii ); write( str, string'(" " )); hwrite( str, data );
-- writeline( log, str );
--
-- end loop;
--
-- writeline( log, str );
--
 
-- writeline( log, str );
--
-- for ii in 0 to 15 loop
--
-- adr:= x"00801000";
-- adr:=adr + ii*4;
-- int_mem_read( cmd, ret, adr, data );
--
-- write( str, ii ); write( str, string'(" " )); hwrite( str, data );
-- writeline( log, str );
--
-- end loop;
--
 
-- writeline( log, str );
--
-- for ii in 0 to 15 loop
--
-- adr:= x"00802000";
-- adr:=adr + ii*4;
-- int_mem_read( cmd, ret, adr, data );
--
-- write( str, ii ); write( str, string'(" " )); hwrite( str, data );
-- writeline( log, str );
--
-- end loop;
--
--
 
-- writeline( log, str );
--
-- for ii in 0 to 15 loop
--
-- adr:= x"00803000";
-- adr:=adr + ii*4;
-- int_mem_read( cmd, ret, adr, data );
--
-- write( str, ii ); write( str, string'(" " )); hwrite( str, data );
-- writeline( log, str );
--
-- end loop;
--
---- block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
---- block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL
---- block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
--
--
-- writeline( log, str );
-- if( error=0 ) then
 
-- cnt_ok := cnt_ok + 1;
-- else
 
-- cnt_error := cnt_error + 1;
-- end if;
-- writeline( log, str );
-- writeline( log, str );
--
--end test_adm_read_16kb;
--
--
--
--
 
procedure test_adm_write_16kb (
 
 
)
is
 
variable adr : std_logic_vector( 31 downto 0 );
variable data : std_logic_vector( 31 downto 0 );
variable str : line;
 
variable error : integer:=0;
variable dma_complete : integer;
variable kk : integer;
variable status : std_logic_vector( 15 downto 0 );
 
variable data64 : std_logic_vector( 63 downto 0 );
variable data64n : std_logic_vector( 63 downto 0 );
 
begin
write( str, string'("TEST_ADM_WRITE_16KB" ));
writeline( log, str );
 
for ii in 0 to 256 loop
adr:= x"00100000";
adr:=adr + ii*4;
int_mem_write( cmd, ret, adr, x"00000000" );
end loop;
 
data64 :=x"0000000000000000";
data64n := not data64;
 
adr:= x"00800000";
data:=x"A5A50123";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
data:=x"00000000";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
for ii in 0 to 254 loop
int_mem_write( cmd, ret, adr, data64( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64( 63 downto 32 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
end loop;
 
adr:= x"00801000";
data:=x"A5A50123";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
data:=x"00000001";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
for ii in 0 to 254 loop
int_mem_write( cmd, ret, adr, data64( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64( 63 downto 32 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
end loop;
 
adr:= x"00802000";
data:=x"A5A50123";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
data:=x"00000002";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
for ii in 0 to 254 loop
int_mem_write( cmd, ret, adr, data64( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64( 63 downto 32 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
end loop;
 
adr:= x"00803000";
data:=x"A5A50123";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
data:=x"00000003";
int_mem_write( cmd, ret, adr, data );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
for ii in 0 to 254 loop
int_mem_write( cmd, ret, adr, data64( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64( 63 downto 32 ) );
adr:=adr + 4;
 
int_mem_write( cmd, ret, adr, data64n( 31 downto 0 ) );
adr:=adr + 4;
int_mem_write( cmd, ret, adr, data64n( 63 downto 32 ) );
adr:=adr + 4;
 
data64:=data64 + 1;
data64n := not data64;
end loop;
-- for ii in 0 to 256 loop
-- adr:= x"00802000";
-- adr:=adr + ii*4;
-- data:=x"00A20000";
-- data:=data + ii;
-- int_mem_write( cmd, ret, adr, data );
-- end loop;
--
-- for ii in 0 to 256 loop
-- adr:= x"00803000";
-- adr:=adr + ii*4;
-- data:=x"00A30000";
-- data:=data + ii;
-- int_mem_write( cmd, ret, adr, data );
-- end loop;
 
 
int_mem_write( cmd, ret, x"00100000", x"00008000" );
 
 
 
int_mem_write( cmd, ret, x"00100008", x"00008010" );
 
 
 
 
int_mem_write( cmd, ret, x"00100014", x"00000000" );
int_mem_write( cmd, ret, x"001001F8", x"00000000" );
int_mem_write( cmd, ret, x"001001FC", x"14A44953" );
 
 
 
int_mem_write( cmd, ret, x"00100200", x"00008020" );
 
 
 
int_mem_write( cmd, ret, x"00100208", x"00008030" );
 
int_mem_write( cmd, ret, x"001003F8", x"00000000" );
int_mem_write( cmd, ret, x"001003FC", x"D6BC4953" );
 
 
 
block_write( cmd, ret, 5, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
block_write( cmd, ret, 5, 20, x"00100000" ); -- PCI_ADRL
block_write( cmd, ret, 5, 21, x"00100000" ); -- PCI_ADRH
block_write( cmd, ret, 5, 23, x"00001000" ); -- LOCAL_ADR
 
 
 
--
 
 
 
wb_block_check_write( cmd, ret, REG_TEST_CHECK_CTRL, x"00000000" );
 
write( str, string'("BLOCK TEST_CHECK ID: " ));
hwrite( str, data );
writeline( log, str );
 
 
--
--
--
data:=wb_block_check_burst_ctrl_build('1', 40, 473);
wb_block_check_write( cmd, ret, REG_TEST_CHECK_WBS_BURST_CTRL, data);
--
--
--
block_write( cmd, ret, 5, 9, x"00000001" ); -- DMA_CTRL - START
 
 
--
 
--
 
wait for 20 us;
for ii in 0 to 20 loop
block_read( cmd, ret, 5, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data( 8 )='1' ) then
 
error := 0;
exit;
else
 
error := error + 1;
wait for 10 us;
end if;
writeline( log, str );
end loop;
if( error=0 ) then
kk:=0;
loop
-- trd_status( cmd, ret, 6, status );
-- write( str, string'("TRD_STATUS: " )); hwrite( str, status );
block_read( cmd, ret, 5, 16, data ); -- STATUS
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data(4)='1' ) then
 
 
kk:=kk+1;
if( kk=4 ) then
exit;
end if;
end if;
writeline( log, str );
wait for 500 ns;
end loop;
 
dma_complete := 0;
for ii in 0 to 100 loop
block_read( cmd, ret, 5, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data(4)='1' ) then
 
 
end if;
writeline( log, str );
if( data(5)='1' ) then
 
dma_complete := 1;
 
end if;
writeline( log, str );
if( dma_complete=1 ) then
exit;
end if;
wait for 1 us;
end loop;
writeline( log, str );
if( dma_complete=0 ) then
 
writeline( log, str );
error:=error+1;
end if;
 
end if;
for ii in 0 to 3 loop
block_read( cmd, ret, 5, 16, data ); -- STATUS
write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
writeline( log, str );
wait for 500 ns;
end loop;
wait for 10 us;
wb_block_check_read( cmd, ret, REG_TEST_CHECK_BL_RD, data );
 
hwrite( str, data );
kk := conv_integer( data );
if( 4/=kk ) then
 
error := error + 1;
else
write( str, string'( " - Ok" ) );
end if;
writeline( log, str );
wb_block_check_read( cmd, ret, REG_TEST_CHECK_BL_OK, data );
write( str, string'( "TEST_CHECK_BL_OK: " ) );
hwrite( str, data );
kk := conv_integer( data );
if( 3/=kk ) then
 
error := error + 1;
else
write( str, string'( " - Ok" ) );
end if;
writeline( log, str );
wb_block_check_read( cmd, ret, REG_TEST_CHECK_BL_ERROR, data );
write( str, string'( "TEST_CHECK_BL_ERROR: " ) );
hwrite( str, data );
kk := conv_integer( data );
if( 0/=kk ) then
 
error := error + 1;
else
write( str, string'( " - Ok" ) );
end if;
writeline( log, str );
block_write( cmd, ret, 5, 9, x"00000000" ); -- DMA_CTRL - STOP
-- block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
-- block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL
-- block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
writeline( log, str );
if( error=0 ) then
 
cnt_ok := cnt_ok + 1;
else
 
cnt_error := cnt_error + 1;
end if;
writeline( log, str );
writeline( log, str );
 
end test_adm_write_16kb;
---------------------------------------------------------------------------------------------------
--
-- My procedure for test Updated Design (test_read_4kb like refenernce)
--
procedure test_num_1 (
 
 
) is
variable adr : std_logic_vector( 31 downto 0 );
variable data : std_logic_vector( 31 downto 0 );
variable str : line;
variable error : integer:=0;
variable dma_complete : integer:=0;
begin
-- Init Header
write( str, string'("TEST#1: simple test of WB CORSS logic - read from empty place" ));
writeline( log, str );
--
 
for ii in 0 to 127 loop
adr:= x"00100000";
adr:=adr + ii*4;
int_mem_write( cmd, ret, adr, x"00000000" );
end loop;
-- HOST MEM Writes:
int_mem_write( cmd, ret, x"00100000", x"00008000" ); --
int_mem_write( cmd, ret, x"00100004", x"00000100" ); --
int_mem_write( cmd, ret, x"001001F8", x"00000000" ); --
int_mem_write( cmd, ret, x"001001FC", x"762C4953" ); --
--
 
block_write( cmd, ret, 4, 8, x"00000027" ); -- DMA_MODE - DEMAND_MODE==ON
block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
block_write( cmd, ret, 4, 20, x"00100000" ); -- PCI_ADRL
block_write( cmd, ret, 4, 21, x"00100000" ); -- PCI_ADRH
block_write( cmd, ret, 4, 23, x"0000A400" ); -- LOCAL_ADR : xA400 addr - check WB CROSS logic, rx value must be EQU to p_TEST_DATA_64BIT in current design
block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
--
 
wait for 1 us;
block_write( cmd, ret, 4, 8, x"00000025" ); -- DMA_MODE - DEMAND_MODE==OFF
--
-- Delay for design
wait for 20 us;
--
-- Read STATUS
block_read( cmd, ret, 4, 16, data );
-- Construct LOG MSG in accordance to STATUS value and update ERR counter
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data( 8 )='1' ) then
write( str, string'(" - Descriptor==OK" ));
else
write( str, string'(" - Descriptor RD ERR" ));
error := error + 1;
end if;
writeline( log, str ); -- upd LOGFILE
--
-- Deal with STATUS Results:
if( error=0 ) then -- w8ing for DMA final
dma_complete := 0;
for ii in 0 to 100 loop -- 100 loop cycles of STATUS-process with 1us delay after
-- Read STATUS
block_read( cmd, ret, 4, 16, data );
-- Construct LOG MSG in accordance to STATUS value and update "dma_complete"
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data(5)='1' ) then
write( str, string'(" - DMA finished" ));
dma_complete := 1;
end if;
writeline( log, str );
-- Check "dma_complete"
if( dma_complete=1 ) then
exit; -- EXIT Loop on FINAL
else
wait for 1 us; -- DELAY in other case
end if;
end loop;
writeline( log, str ); -- upd LOGFILE
if( dma_complete=0 ) then -- check "dma_complete" after all
write( str, string'("ERR - DMA not finished " ));
writeline( log, str );
error:=error+1;
end if;
end if;
--
-- Print STATUS now
for ii in 0 to 3 loop -- print STATUS value 4 times with 0.5us delay after
-- Read STATUS
block_read( cmd, ret, 4, 16, data );
-- Construct LOG MSG in accordance to STATUS value
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
-- upd LOGFILE
writeline( log, str );
wait for 500 ns;
end loop;
--
-- Now STOP Design
block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL - STOP
--
-- Now print RX values:
--
-- Construct Header:
writeline( log, str );
write( str, string'("PRINT 1st 15 RX values: " ));
writeline( log, str );
-- Get first 15 DATA values and print it:
for ii in 0 to 15 loop
adr:= x"00800000"; -- init ADDR value
adr:=adr + ii*4; -- upd addr to curr idx
int_mem_read( cmd, ret, adr, data ); -- HOST MEM Read
-- Construct LOG MSG in accordance to HOST MEM Read value
--write( str, ii ); write( str, string'(" " )); hwrite( str, data );
hwrite( str, CONV_STD_LOGIC_VECTOR(ii, 8) );write( str, string'(" - " )); hwrite( str, data );
writeline( log, str ); -- upd LOGFILE
end loop;
writeline( log, str ); -- upd LOGFILE
--
-- Final CHECK errors:
if( error=0 ) then
write( str, string'("SUCCSESSFULL FINAL " ));
cnt_ok := cnt_ok + 1;
else
write( str, string'("FAILED FINAL " ));
cnt_error := cnt_error + 1;
end if;
writeline( log, str ); -- upd LOGFILE
writeline( log, str ); -- upd LOGFILE
--
-- END
end test_num_1;
--
--
--
procedure test_num_2 (
 
 
) is
variable adr : std_logic_vector( 31 downto 0 );
variable data : std_logic_vector( 31 downto 0 );
variable data64 : std_logic_vector( 63 downto 0 );
variable str : line;
variable error : integer:=0;
variable dma_complete : integer:=0;
begin
-- Init Header
write( str, string'("TEST#2: Get data from TEST_GEN.WB_BURST_SLAVE" ));
writeline( log, str );
--
 
for ii in 0 to 127 loop
adr:= x"00100000";
adr:=adr + ii*4;
int_mem_write( cmd, ret, adr, x"00000000" );
end loop;
-- HOST MEM Writes:
int_mem_write( cmd, ret, x"00100000", x"00008000" ); --
int_mem_write( cmd, ret, x"00100004", x"00000100" ); --
int_mem_write( cmd, ret, x"001001F8", x"00000000" ); --
int_mem_write( cmd, ret, x"001001FC", x"762C4953" ); --
--
-- TEST_GEN.WB_CFG_SLAVE: config TEST_GEN
adr :=x"20002048"; -- TEST_GEN.WB_CFG_SLAVE.TEST_GEN_SIZE
data64 :=x"0000000000000001"; -- TEST_GEN_SIZE=x01
data_write64(cmd, ret, adr, data64);-- PCIE WR
adr :=x"20002040"; -- TEST_GEN.WB_CFG_SLAVE.TEST_GEN_CTRL
data64 :=x"0000000000000022"; -- TEST_GEN_CTRL=x22 (START=1, TEST_GEN.di_start=1)
data_write64(cmd, ret, adr, data64);-- PCIE WR
-- PE_EXT_FIFO module config: --> have a bug in PE_EXT_FIFO, for check WB we will make a trick:
block_write( cmd, ret, 4, 8, x"00000027" ); -- DMA_MODE - DEMAND_MODE==ON
block_write( cmd, ret, 4, 9, x"00000010" ); -- DMA_CTRL - RESET FIFO
block_write( cmd, ret, 4, 20, x"00100000" ); -- PCI_ADRL
block_write( cmd, ret, 4, 21, x"00100000" ); -- PCI_ADRH
block_write( cmd, ret, 4, 23, x"00003000" ); -- LOCAL_ADR: TEST_GEN.WB_BURST_SLAVE
block_write( cmd, ret, 4, 9, x"00000001" ); -- DMA_CTRL - START
--
 
wait for 1 us;
block_write( cmd, ret, 4, 8, x"00000025" ); -- DMA_MODE - DEMAND_MODE==OFF
--
-- Delay for design
wait for 20 us;
--
-- Read STATUS (check RD DESCR status):
block_read( cmd, ret, 4, 16, data );
-- Construct LOG MSG in accordance to STATUS value and update ERR counter
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data( 8 )='1' ) then
write( str, string'(" - Descriptor==OK" ));
else
write( str, string'(" - Descriptor RD ERR" ));
error := error + 1;
end if;
writeline( log, str ); -- upd LOGFILE
--
-- W8ing for DMA finish:
if( error=0 ) then -- w8ing for DMA final
dma_complete := 0;
for ii in 0 to 100 loop -- 100 loop cycles of STATUS-process with 1us delay after
-- Read STATUS
block_read( cmd, ret, 4, 16, data );
-- Construct LOG MSG in accordance to STATUS value and update "dma_complete"
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
if( data(5)='1' ) then
write( str, string'(" - DMA finished" ));
dma_complete := 1;
end if;
writeline( log, str );
-- Check "dma_complete"
if( dma_complete=1 ) then
exit; -- EXIT Loop on FINAL
else
wait for 1 us; -- DELAY in other case
end if;
end loop;
writeline( log, str ); -- upd LOGFILE
if( dma_complete=0 ) then -- check "dma_complete" after all
write( str, string'("ERR - DMA not finished " ));
writeline( log, str );
error:=error+1;
end if;
end if;
--
-- Print STATUS in ERR
if (error /= 0 ) then
for ii in 0 to 3 loop -- print STATUS value 4 times with 0.5us delay after
-- Read STATUS
block_read( cmd, ret, 4, 16, data );
-- Construct LOG MSG in accordance to STATUS value
write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
-- upd LOGFILE
writeline( log, str );
wait for 500 ns;
end loop;
end if;
--
-- Now STOP Design
block_write( cmd, ret, 4, 9, x"00000000" ); -- DMA_CTRL - STOP
--
-- Now print RX values:
--
-- Construct Header:
writeline( log, str );
write( str, string'("PRINT 1st 15 RX values: " ));
writeline( log, str );
-- Get first 15 DATA values and print it:
for ii in 0 to 15 loop
adr:= x"00800000"; -- init ADDR value
adr:=adr + ii*4; -- upd addr to curr idx
int_mem_read( cmd, ret, adr, data ); -- HOST MEM Read
-- Construct LOG MSG in accordance to HOST MEM Read value
--write( str, ii ); write( str, string'(" " )); hwrite( str, data );
hwrite( str, CONV_STD_LOGIC_VECTOR(ii, 8) );write( str, string'(" - " )); hwrite( str, data );
writeline( log, str ); -- upd LOGFILE
end loop;
writeline( log, str ); -- upd LOGFILE
--
-- Final CHECK errors:
if( error=0 ) then
write( str, string'(" stb SUCCSESSFULL FINAL " ));
cnt_ok := cnt_ok + 1;
else
write( str, string'(" stb FAILED FINAL " ));
cnt_error := cnt_error + 1;
end if;
writeline( log, str ); -- upd LOGFILE
writeline( log, str ); -- upd LOGFILE
--
-- END
end test_num_2;
---------------------------------------------------------------------------------------------------
--
-- My procedure for test WB stuff in Design:
-- ==> TEST_CHECK.WB_CFG_SLAVE
--
procedure test_wb_1 (
 
 
) is
variable adr : std_logic_vector( 31 downto 0 );
variable data32 : std_logic_vector( 31 downto 0 );
variable data64 : std_logic_vector( 63 downto 0 );
variable str : line;
variable error : integer:=0;
variable dma_complete : integer:=0;
--
--
type wb_cfg_slave_value is array (natural range<>) of std_logic_vector( 63 downto 0 );
type wb_cfg_slave_data is record
const : wb_cfg_slave_value(7 downto 0);
cmd : wb_cfg_slave_value(7 downto 0);
sts : wb_cfg_slave_value(7 downto 0);
end record;
--
--
variable st_wb_cfg_slave_data_0 : wb_cfg_slave_data;
variable st_wb_cfg_slave_data_1 : wb_cfg_slave_data;
variable st_wb_cfg_slave_data_2 : wb_cfg_slave_data;
begin
-- Init Header
write( str, string'("START TEST_WB#1: TEST_CHECK.WB_CFG_SLAVE"));
writeline( log, str );
--
-- Read "TEST_CHECK.WB_CFG_SLAVE"
write( str, string'("1) Read 'TEST_CHECK.WB_CFG_SLAVE'"));
writeline( log, str );
adr := x"20000000";
TEST_CHECK_WB_CFG_SLAVE_RD_00 : for i in 0 to 2 loop
TEST_CHECK_WB_CFG_SLAVE_RD_01 : for j in 0 to 7 loop
-- PCIE RD
data_read64(cmd, ret, adr, data64);
-- Put RD_Value to apropriate holder
if (i=0) then -- const
st_wb_cfg_slave_data_0.const(j) := data64;
elsif (i=1) then -- cmd
st_wb_cfg_slave_data_0.cmd(j) := data64;
else -- sts
st_wb_cfg_slave_data_0.sts(j) := data64;
end if;
-- Incr ADDR
adr := adr + x"00000008";
-- Print RD_Value
hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
writeline( log, str );
end loop TEST_CHECK_WB_CFG_SLAVE_RD_01;
end loop TEST_CHECK_WB_CFG_SLAVE_RD_00;
--
-- Write
write( str, string'("2) Write 'TEST_CHECK.WB_CFG_SLAVE'"));
writeline( log, str );
adr := x"20000000";
TEST_CHECK_WB_CFG_SLAVE_WR_00 : for i in 0 to 2 loop
TEST_CHECK_WB_CFG_SLAVE_WR_01 : for j in 0 to 7 loop
-- Prepare WR_Value
data64 := conv_std_logic_vector(i*100+j*10+5, 64);
-- PCIE WR
data_write64(cmd, ret, adr, data64);
-- Put WR_Value to apropriate holder
if (i=0) then -- const
st_wb_cfg_slave_data_1.const(j) := data64;
elsif (i=1) then -- cmd
st_wb_cfg_slave_data_1.cmd(j) := data64;
else -- sts
st_wb_cfg_slave_data_1.sts(j) := data64;
end if;
-- Incr ADDR
adr := adr + x"00000008";
-- Print WR_Value
hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
writeline( log, str );
end loop TEST_CHECK_WB_CFG_SLAVE_WR_01;
end loop TEST_CHECK_WB_CFG_SLAVE_WR_00;
--
-- Read
write( str, string'("3) Read 'TEST_CHECK.WB_CFG_SLAVE'"));
writeline( log, str );
adr := x"20000000";
TEST_CHECK_WB_CFG_SLAVE_RD_10 : for i in 0 to 2 loop
TEST_CHECK_WB_CFG_SLAVE_RD_11 : for j in 0 to 7 loop
-- PCIE RD
data_read64(cmd, ret, adr, data64);
-- Put RD_Value to apropriate holder
if (i=0) then -- const
st_wb_cfg_slave_data_2.const(j) := data64;
elsif (i=1) then -- cmd
st_wb_cfg_slave_data_2.cmd(j) := data64;
else -- sts
st_wb_cfg_slave_data_2.sts(j) := data64;
end if;
-- Incr ADDR
adr := adr + x"00000008";
-- Print RD_Value
hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
writeline( log, str );
end loop TEST_CHECK_WB_CFG_SLAVE_RD_11;
end loop TEST_CHECK_WB_CFG_SLAVE_RD_10;
--
-- Compare results
write( str, string'("4) Process Results:"));
writeline( log, str );
-- cmp#0 - constants
CMP_CONST : for i in 0 to 7 loop
if (st_wb_cfg_slave_data_0.const(i) /= st_wb_cfg_slave_data_2.const(i) ) then -- before WR and afetr WR must be EQU (RO)
write( str, string'(" ==> CONST ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
writeline( log, str );
error := error + 1;
end if;
end loop CMP_CONST;
-- cmp#1 - commands
CMP_CMD : for i in 0 to 7 loop
if ( st_wb_cfg_slave_data_1.cmd(i) /= st_wb_cfg_slave_data_2.cmd(i) ) then -- WR value and RD value must be EQU (RW)
write( str, string'(" ==> CMD ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
writeline( log, str );
error := error + 1;
end if;
end loop CMP_CMD;
-- cmp#2 - status
CMP_STATUS : for i in 0 to 7 loop
if (st_wb_cfg_slave_data_0.sts(i) /= st_wb_cfg_slave_data_2.sts(i) ) then -- before WR and afetr WR must be EQU (RO)
write( str, string'(" ==> STATUS ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
writeline( log, str );
error := error + 1;
end if;
end loop CMP_STATUS;
-- print OK
if (error = 0) then
write( str, string'(" Results==OK"));
writeline( log, str );
cnt_ok := cnt_ok + 1;
else
cnt_error := cnt_error + 1;
end if;
-- Final Header
write( str, string'("STOP TEST_WB#1: TEST_CHECK.WB_CFG_SLAVE" ));
writeline( log, str ); -- upd LOGFILE
--
-- END
end test_wb_1;
---------------------------------------------------------------------------------------------------
--
-- My procedure for test WB stuff in Design:
-- ==> TEST_GEN.WB_CFG_SLAVE
--
procedure test_wb_2 (
 
 
) is
variable adr : std_logic_vector( 31 downto 0 );
variable data32 : std_logic_vector( 31 downto 0 );
variable data64 : std_logic_vector( 63 downto 0 );
variable str : line;
variable error : integer:=0;
variable dma_complete : integer:=0;
--
--
type wb_cfg_slave_value is array (natural range<>) of std_logic_vector( 63 downto 0 );
type wb_cfg_slave_data is record
const : wb_cfg_slave_value(7 downto 0);
cmd : wb_cfg_slave_value(7 downto 0);
sts : wb_cfg_slave_value(7 downto 0);
end record;
--
--
variable st_wb_cfg_slave_data_0 : wb_cfg_slave_data;
variable st_wb_cfg_slave_data_1 : wb_cfg_slave_data;
variable st_wb_cfg_slave_data_2 : wb_cfg_slave_data;
begin
-- Init Header
write( str, string'("START TEST_WB#2: TEST_GEN.WB_CFG_SLAVE"));
writeline( log, str );
--
-- Read "TEST_CHECK.WB_CFG_SLAVE"
write( str, string'("1) Read 'TEST_GEN.WB_CFG_SLAVE'"));
writeline( log, str );
adr := x"20002000";
TEST_CHECK_WB_CFG_SLAVE_RD_00 : for i in 0 to 2 loop
TEST_CHECK_WB_CFG_SLAVE_RD_01 : for j in 0 to 7 loop
-- PCIE RD
data_read64(cmd, ret, adr, data64);
-- Put RD_Value to apropriate holder
if (i=0) then -- const
st_wb_cfg_slave_data_0.const(j) := data64;
elsif (i=1) then -- cmd
st_wb_cfg_slave_data_0.cmd(j) := data64;
else -- sts
st_wb_cfg_slave_data_0.sts(j) := data64;
end if;
-- Incr ADDR
adr := adr + x"00000008";
-- Print RD_Value
hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
writeline( log, str );
end loop TEST_CHECK_WB_CFG_SLAVE_RD_01;
end loop TEST_CHECK_WB_CFG_SLAVE_RD_00;
--
-- Write
write( str, string'("2) Write 'TEST_GEN.WB_CFG_SLAVE'"));
writeline( log, str );
adr := x"20002000";
TEST_GEN_WB_CFG_SLAVE_WR_00 : for i in 0 to 2 loop
TEST_GEN_WB_CFG_SLAVE_WR_01 : for j in 0 to 7 loop
-- Prepare WR_Value
data64 := conv_std_logic_vector(i*100+j*10+5, 64);
-- PCIE WR
data_write64(cmd, ret, adr, data64);
-- Put WR_Value to apropriate holder
if (i=0) then -- const
st_wb_cfg_slave_data_1.const(j) := data64;
elsif (i=1) then -- cmd
st_wb_cfg_slave_data_1.cmd(j) := data64;
else -- sts
st_wb_cfg_slave_data_1.sts(j) := data64;
end if;
-- Incr ADDR
adr := adr + x"00000008";
-- Print WR_Value
hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
writeline( log, str );
end loop TEST_GEN_WB_CFG_SLAVE_WR_01;
end loop TEST_GEN_WB_CFG_SLAVE_WR_00;
--
-- Read
write( str, string'("3) Read 'TEST_GEN.WB_CFG_SLAVE'"));
writeline( log, str );
adr := x"20002000";
TEST_GEN_WB_CFG_SLAVE_RD_10 : for i in 0 to 2 loop
TEST_GEN_WB_CFG_SLAVE_RD_11 : for j in 0 to 7 loop
-- PCIE RD
data_read64(cmd, ret, adr, data64);
-- Put RD_Value to apropriate holder
if (i=0) then -- const
st_wb_cfg_slave_data_2.const(j) := data64;
elsif (i=1) then -- cmd
st_wb_cfg_slave_data_2.cmd(j) := data64;
else -- sts
st_wb_cfg_slave_data_2.sts(j) := data64;
end if;
-- Incr ADDR
adr := adr + x"00000008";
-- Print RD_Value
hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
writeline( log, str );
end loop TEST_GEN_WB_CFG_SLAVE_RD_11;
end loop TEST_GEN_WB_CFG_SLAVE_RD_10;
--
-- Compare results
write( str, string'("4) Process Results:"));
writeline( log, str );
-- cmp#0 - constants
CMP_CONST : for i in 0 to 7 loop
if (st_wb_cfg_slave_data_0.const(i) /= st_wb_cfg_slave_data_2.const(i) ) then -- before WR and afetr WR must be EQU (RO)
write( str, string'(" ==> CONST ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
writeline( log, str );
error := error + 1;
end if;
end loop CMP_CONST;
-- cmp#1 - commands
CMP_CMD : for i in 0 to 7 loop
if ( st_wb_cfg_slave_data_1.cmd(i) /= st_wb_cfg_slave_data_2.cmd(i) ) then -- WR value and RD value must be EQU (RW)
write( str, string'(" ==> CMD ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
writeline( log, str );
error := error + 1;
end if;
end loop CMP_CMD;
-- cmp#2 - status
CMP_STATUS : for i in 0 to 7 loop
if (st_wb_cfg_slave_data_0.sts(i) /= st_wb_cfg_slave_data_2.sts(i) ) then -- before WR and afetr WR must be EQU (RO)
write( str, string'(" ==> STATUS ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
writeline( log, str );
error := error + 1;
end if;
end loop CMP_STATUS;
-- print OK
if (error = 0) then
write( str, string'(" Results==OK"));
writeline( log, str );
cnt_ok := cnt_ok + 1;
else
cnt_error := cnt_error + 1;
end if;
-- Final Header
write( str, string'("STOP TEST_WB#2: TEST_GEN.WB_CFG_SLAVE" ));
writeline( log, str ); -- upd LOGFILE
--
-- END
end test_wb_2;
---------------------------------------------------------------------------------------------------
end package body test_pkg;
/testbench/wb_block_pkg.vhd
0,0 → 1,168
---------------------------------------------------------------------------------------------------
--
-- Title : wb_block_pkg.vhd
-- Author : Dmitry Smekhov
-- Company : Instrumental Systems
-- E-mail : dsmv@insys.ru
--
-- Version : 1.0
---------------------------------------------------------------------------------------------------
--
 
--
---------------------------------------------------------------------------------------------------
--
-- Version 1.0 01.11.2011
 
--
---------------------------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_unsigned.all;
 
library work;
use work.cmd_sim_pkg.all;
 
use std.textio.all;
use std.textio;
 
---------------------------------------------------------------------------------------------------
package wb_block_pkg is
--
-- Define TEST_CHECK reg id (addr in 64b cells)
--
constant REG_BLOCK_ID : integer:=0;
constant REG_BLOCK_VER : integer:=1;
 
constant REG_TEST_CHECK_CTRL : integer:=8;
constant REG_TEST_CHECK_SIZE : integer:=9;
constant REG_TEST_CHECK_ERR_ADR : integer:=16#0A#;
constant REG_TEST_CHECK_WBS_BURST_CTRL : integer:=16#0B#;
 
constant REG_TEST_CHECK_BL_RD : integer:=16#10#;
constant REG_TEST_CHECK_BL_OK : integer:=16#11#;
constant REG_TEST_CHECK_BL_ERROR : integer:=16#12#;
constant REG_TEST_CHECK_TOTAL_ERROR : integer:=16#13#;
constant REG_TEST_CHECK_ERR_DATA : integer:=16#14#;
--
-- Define TEST_GEN reg id (addr in 64b cells)
--
constant REG_TEST_GEN_CTRL : integer:=8;
constant REG_TEST_GEN_SIZE : integer:=9;
constant REG_TEST_GEN_CNT1 : integer:=16#0A#;
constant REG_TEST_GEN_CNT2 : integer:=16#0B#;
constant REG_TEST_GEN_BL_WR : integer:=16#11#;
--
-- Define SoPC ADDR (must be EQU to: ...\src\top\sp605_lx45t_wishbone_sopc_wb.vhd)
--
constant TEST_CHECK_WB_CFG_SLAVE : std_logic_vector( 31 downto 0) := x"20000000";
constant TEST_CHECK_WB_BURST_SLAVE : std_logic_vector( 31 downto 0) := x"20001000"; -- check data: write-only
constant TEST_GEN_WB_CFG_SLAVE : std_logic_vector( 31 downto 0) := x"20002000";
constant TEST_GEN_WB_BURST_SLAVE : std_logic_vector( 31 downto 0) := x"20003000"; -- generate data: read-only
 
 
procedure wb_block_check_write (
 
 
 
 
);
 
 
procedure wb_block_check_read (
 
 
 
 
);
 
 
procedure wb_block_gen_write (
 
 
 
 
);
 
 
procedure wb_block_gen_read (
 
 
 
 
);
-- Construct value for REG_TEST_CHECK_WBS_BURST_CTRL
function wb_block_check_burst_ctrl_build (i_ena : in std_logic; ii_ack_dly : in integer; ii_dly_pos : in integer) return std_logic_vector;
 
end package wb_block_pkg;
---------------------------------------------------------------------------------------------------
package body wb_block_pkg is
 
 
procedure wb_block_check_write (
 
 
 
 
) is
begin
data_write( cmd, ret, TEST_CHECK_WB_CFG_SLAVE+conv_std_logic_vector(reg*8+0, 32), data );
end;
 
 
procedure wb_block_check_read (
 
 
 
 
) is
begin
data_read( cmd, ret, TEST_CHECK_WB_CFG_SLAVE+conv_std_logic_vector(reg*8+0, 32), data );
end;
 
 
procedure wb_block_gen_write (
 
 
 
 
) is
begin
data_write( cmd, ret, TEST_GEN_WB_CFG_SLAVE+conv_std_logic_vector(reg*8+0, 32), data );
end;
 
 
procedure wb_block_gen_read (
 
 
 
 
) is
begin
data_read( cmd, ret, TEST_GEN_WB_CFG_SLAVE+conv_std_logic_vector(reg*8+0, 32), data );
end;
 
-- Construct value for REG_TEST_CHECK_WBS_BURST_CTRL
function wb_block_check_burst_ctrl_build (i_ena : in std_logic; ii_ack_dly : in integer; ii_dly_pos : in integer) return std_logic_vector is
variable iv_ret : std_logic_vector(31 downto 0):=(others => '0');
begin
iv_ret:= x"0000" & i_ena & conv_std_logic_vector( ii_ack_dly, 6) & conv_std_logic_vector( ii_dly_pos, 9);
return iv_ret;
end wb_block_check_burst_ctrl_build;
 
 
end package body wb_block_pkg;
 
/testbench/stend_ambpex5_wishbone.vhd
0,0 → 1,213
-------------------------------------------------------------------------------
--
-- Title : stend_ambpex5_wishbone
-- Author : Dmitry Smekhov
-- Company : Instrumental Systems
-- E-mail : dsmv@insys.ru
--
-- Version : 1.0
--
-------------------------------------------------------------------------------
--
-- Description : Stend for test ambpex5_sx50t_wishbone
--
-------------------------------------------------------------------------------
--
-- Version 1.2 20.04.2013
-- Created from stend_sp605_wishbone
--
-------------------------------------------------------------------------------
 
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_textio.all;
 
library work;
 
use work.cmd_sim_pkg.all;
use work.block_pkg.all;
use work.ambpex5_sx50t_wishbone_pkg.all;
use work.xilinx_pcie_rport_m2_pkg.all;
 
use work.test_pkg.all;
 
use std.textio.all;
use std.textio;
 
entity stend_ambpex5_wishbone is
generic(
 
 
);
end stend_ambpex5_wishbone;
 
 
architecture stend_ambpex5_wishbone of stend_ambpex5_wishbone is
--
--function set_file_name( test_log : in string; test_id: in integer ) return string is
--variable str : line;
--variable ret : string( 255 downto 1 );
--begin
--
-- write( str, test_log );
-- write( str, string'("_id_") );
-- write( str, test_id );
--
-- ret:=conv_string( str );
-- return ret;
--
--
--end set_file_name;
 
constant fname_test_log : string:= test_log & integer'image(test_id) & ".log";
 
 
signal clk250 : std_logic:='0';
signal clk250p : std_logic;
signal clk250n : std_logic;
 
signal clk100 : std_logic:='0';
signal clk100p : std_logic;
signal clk100n : std_logic;
 
signal reset : std_logic;
 
signal txp : std_logic_vector( 7 downto 0 ):=(others=>'0');
signal txn : std_logic_vector( 7 downto 0 ):=(others=>'1');
signal rxp : std_logic_vector( 7 downto 0 ):=(others=>'0');
signal rxn : std_logic_vector( 7 downto 0 ):=(others=>'1');
 
signal rp_txp : std_logic_vector( 0 downto 0 ):=(others=>'0');
signal rp_txn : std_logic_vector( 0 downto 0 ):=(others=>'1');
signal rp_rxp : std_logic_vector( 0 downto 0 ):=(others=>'0');
signal rp_rxn : std_logic_vector( 0 downto 0 ):=(others=>'1');
 
signal tp : std_logic_vector( 3 downto 1 );
signal led1 : std_logic;
signal led2 : std_logic;
signal led3 : std_logic;
signal led4 : std_logic;
 
 
 
 
 
 
begin
 
dut: ambpex5_sx50t_wishbone
generic map(
 
)
port map(
---- PCI-Express ----
txp => txp,
txn => txn,
rxp => rxp,
rxn => rxn,
mgt251_p => clk250p,
mgt251_n => clk250n,
bperst => reset
);
rp : xilinx_pcie_rport_m2
generic map (
REF_CLK_FREQ => 0,
ALLOW_X8_GEN2 => FALSE,
PL_FAST_TRAIN => TRUE,
LINK_CAP_MAX_LINK_SPEED => X"1",
DEVICE_ID => X"6011",
LINK_CAP_MAX_LINK_WIDTH => X"01",
LINK_CAP_MAX_LINK_WIDTH_int => 1,
LINK_CTRL2_TARGET_LINK_SPEED => X"1",
LTSSM_MAX_LINK_WIDTH => X"01",
DEV_CAP_MAX_PAYLOAD_SUPPORTED => 2,
VC0_TX_LASTPACKET => 29,
VC0_RX_RAM_LIMIT => X"7FF",
VC0_TOTAL_CREDITS_PD => (308),
VC0_TOTAL_CREDITS_CD => (308),
USER_CLK_FREQ => 1
)
port map (
 
sys_clk => clk100,
sys_reset_n => reset,
pci_exp_txn => rp_txn,
pci_exp_txp => rp_txp,
pci_exp_rxn => rp_rxn,
pci_exp_rxp => rp_rxp,
 
 
);
 
 
clk250 <= not clk250 after 2 ns;
 
clk250p <= clk250;
clk250n <= not clk250;
 
clk100 <= not clk100 after 5 ns;
 
clk100p <= clk100;
clk100n <= not clk100;
 
rxp(0) <= rp_txp(0);
rxn(0) <= rp_txn(0);
 
rp_rxp(0) <= txp(0);
rp_rxn(0) <= txn(0);
 
reset <= '0', '1' after 5002 ns;
 
pr_main: process
 
variable data : std_logic_vector( 31 downto 0 );
variable str : LINE; -- pointer to string
 
begin
-- test_init( "test.log" );
test_init( fname_test_log );
wait for 180 us;
case( test_id ) is
when 0 => test_dsc_incorrect( cmd, ret );
when 1 => test_read_4kb( cmd, ret ); -- was original
when 2 => test_adm_read_8kb( cmd, ret );
--when 3 => test_adm_read_16kb( cmd, ret );
--when 4 => test_adm_write_16kb( cmd, ret );
--when 5 => test_block_main( cmd, ret );
when others => null;
end case;
--test_num_1(cmd, ret);
--test_num_2(cmd, ret);
--test_wb_1(cmd, ret);
--test_wb_2(cmd, ret);
test_close;
--
-- Print Final Banner
-- report "Init END OF TEST" severity WARNING;
-- assert false
-- report "End of TEST; Ending simulation (not a Failure)"
-- severity FAILURE;
wait;
end process pr_main;
 
end stend_ambpex5_wishbone;
/top/ambpex5_sx50t_wishbone.vhd
0,0 → 1,158
-------------------------------------------------------------------------------
--
-- Title : ambpex5_sx50t_wishbone
-- Author : Dmitry Smekhov
-- Company : Instrumental Systems
-- E-mail : dsmv@insys.ru
--
-- Version : 1.0
--
-------------------------------------------------------------------------------
--
-- Description : Top-level module for PCIE_CORE64_WISHBONE_M8
--
-------------------------------------------------------------------------------
--
-- Version 1.0 20.04.2013
-- Created from sp605_lx45t_wishbone
--
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
 
package ambpex5_sx50t_wishbone_pkg is
 
component ambpex5_sx50t_wishbone is
generic
(
is_simulation : integer:=0 --! 0 - synthesis, 1 - simulation
);
port
(
---- PCI-Express ----
txp : out std_logic_vector( 7 downto 0 );
txn : out std_logic_vector( 7 downto 0 );
rxp : in std_logic_vector( 7 downto 0 ):=(others=>'0');
rxn : in std_logic_vector( 7 downto 0 ):=(others=>'0');
mgt251_p : in std_logic:='0'; -- reference clock 250 MHz from PCI_Express
mgt251_n : in std_logic:='0';
bperst : in std_logic:='0'; -- 0 - reset
--btp : out std_logic_vector(3 downto 1); -- testpoint
---- Led ----
bled1 : out std_logic;
bled2 : out std_logic;
bled3 : out std_logic;
bled4 : out std_logic
);
 
end component ambpex5_sx50t_wishbone;
 
end package ambpex5_sx50t_wishbone_pkg;
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
--use ieee.std_logic_arith.all;
--use ieee.std_logic_unsigned.all;
 
library unisim;
use unisim.vcomponents.all;
 
library work;
use work.ambpex5_sx50t_wishbone_sopc_wb_pkg.all;
 
entity ambpex5_sx50t_wishbone is
generic
(
is_simulation : integer:=0 --! 0 - synthesis, 1 - simulation
);
port
(
---- PCI-Express ----
txp : out std_logic_vector( 7 downto 0 );
txn : out std_logic_vector( 7 downto 0 );
rxp : in std_logic_vector( 7 downto 0 ):=(others=>'0');
rxn : in std_logic_vector( 7 downto 0 ):=(others=>'0');
mgt251_p : in std_logic:='0'; -- reference clock 250 MHz from PCI_Express
mgt251_n : in std_logic:='0';
bperst : in std_logic:='0'; -- 0 - reset
--btp : out std_logic_vector(3 downto 1); -- testpoint
---- Led ----
bled1 : out std_logic;
bled2 : out std_logic;
bled3 : out std_logic;
bled4 : out std_logic
);
end ambpex5_sx50t_wishbone;
 
architecture rtl of ambpex5_sx50t_wishbone is
-------------------------------------------------------------------------------
--
-- PCIE SYS_CON stuff:
signal mgt250 : std_logic;
signal perst : std_logic;
-------------------------------------------------------------------------------
--
-- OUTRPUT LED stuff:
signal sv_led_h : std_logic_vector(3 downto 0);
signal sv_led_h_p : std_logic_vector(3 downto 0);
-------------------------------------------------------------------------------
begin
-------------------------------------------------------------------------------
--
-- Module In/Out deal:
--
--
sv_led_h_p <= not sv_led_h;
--
xled1 : obuf_s_16 port map( bled1, sv_led_h_p(0) );
xled2 : obuf_s_16 port map( bled2, sv_led_h_p(1) );
xled3 : obuf_s_16 port map( bled3, sv_led_h_p(2) );
xled4 : obuf_s_16 port map( bled4, sv_led_h_p(3) );
 
--
xmgtclk : IBUFDS port map (O => mgt250, I => mgt251_p, IB => mgt251_n );
xmperst: ibuf port map( perst, bperst );
 
-------------------------------------------------------------------------------
--
-- Instantiate Wishbone SysteM (with all stuff inside)
--
WB_SOPC : ambpex5_sx50t_wishbone_sopc_wb
generic map
(
 
)
port map
(
 
---- PCI-Express ----
txp => txp,
txn => txn,
rxp => rxp,
rxn => rxn,
-- sys_con
mgt250 => mgt250,
perst => perst,
--
-- GPIO_LED outputs:
led => sv_led_h
);
-------------------------------------------------------------------------------
end rtl;
/top/ambpex5_sx50t_wishbone_sopc_wb.vhd
0,0 → 1,845
-------------------------------------------------------------------------------
--
-- Title : pcie_core64_m1
-- Author : Dmitry Smekhov
-- Company : Instrumental Systems
-- E-mail : dsmv@insys.ru
--
-- Version : 1.0
--
-------------------------------------------------------------------------------
--
-- Description : Top-level module for PCIE_CORE64 WB SoPC
-- (System have 32Bit ADDR BUS and 64bit DATA BUS)
--
-- Memory Map for SoPC (based on WB_CROSS setup):
-- 1) TEST_CHECK.WB_CFG_SLAVE:
-- ADDR Range ==> 0x0000_0000 : 0x0000_0FFF ( Valid 1st 256B only, detailed MM at test_check_wb_config_slave.vhd)
--
-- 2) TEST_CHECK.WB_BURST_SLAVE
-- ADDR Range ==> 0x0000_1000 : 0x0000_1FFF (support only Constant-Addr-Burst for 512x64bit cell (full 4KB range), Input ONLY)
--
-- 3) TEST_GEN.WB_CFG_SLAVE
-- ADDR Range ==> 0x0000_2000 : 0x0000_2FFF ( Valid 1st 256B only, detailed MM at test_generate_wb_config_slave.vhd)
--
-- 4) TEST_GEN.WB_BURST_SLAVE
-- ADDR Range ==> 0x0000_3000 : 0x0000_3FFF (support only Constant-Addr-Burst for 512x64bit cell (full 4KB range), Output ONLY)
--
-------------------------------------------------------------------------------
--
-- Version 1.0 20.04.2013
-- Created from sp605_lx45t_wishbone_sopc_wb
--
----------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
package ambpex5_sx50t_wishbone_sopc_wb_pkg is
 
component ambpex5_sx50t_wishbone_sopc_wb is
generic
(
is_simulation : integer --! 0 - synthesis, 1 - simulation
);
port
(
 
---- PCI-Express ----
txp : out std_logic_vector( 7 downto 0 );
txn : out std_logic_vector( 7 downto 0 );
rxp : in std_logic_vector( 7 downto 0 ):=(others=>'0');
rxn : in std_logic_vector( 7 downto 0 ):=(others=>'0');
mgt250 : in std_logic:='0'; -- reference clock 250 MHz from PCI_Express
perst : in std_logic:='0'; -- 0 - reset
tp : out std_logic_vector(3 downto 1); -- testpoint
---- Led ----
led : out std_logic_vector( 4 downto 1 )
);
end component ambpex5_sx50t_wishbone_sopc_wb;
 
end package ambpex5_sx50t_wishbone_sopc_wb_pkg;
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
library work;
use work.wb_conmax_top_pkg.all;
use work.pcie_core64_wishbone_m8_pkg.all;
use work.block_test_check_wb_pkg.all;
use work.block_test_generate_wb_pkg.all;
 
 
entity ambpex5_sx50t_wishbone_sopc_wb is
generic
(
is_simulation : integer --! 0 - synthesis, 1 - simulation
);
port
(
 
---- PCI-Express ----
txp : out std_logic_vector( 7 downto 0 );
txn : out std_logic_vector( 7 downto 0 );
rxp : in std_logic_vector( 7 downto 0 ):=(others=>'0');
rxn : in std_logic_vector( 7 downto 0 ):=(others=>'0');
mgt250 : in std_logic:='0'; -- reference clock 250 MHz from PCI_Express
perst : in std_logic:='0'; -- 0 - reset
tp : out std_logic_vector(3 downto 1); -- testpoint
---- Led ----
led : out std_logic_vector( 4 downto 1 )
);
end ambpex5_sx50t_wishbone_sopc_wb;
 
architecture rtl of ambpex5_sx50t_wishbone_sopc_wb is
----------------------------------------------------------------------------------
--
-- Declare PCIE_CORE64_WB stuff:
signal sv_control_points : std_logic_vector( 7 downto 0 );
signal sv_pcie_lstatus : std_logic_vector( 15 downto 0 );
signal s_pcie_link_up_n : std_logic;
-------------------------------------------------------------------------------
--
-- Declare WB_CROSS stuff:
signal st_master_port_data_in : wb_master_port_data;
signal st_master_port_data_out : wb_master_port_data;
signal st_master_port_addr : wb_master_port_addr;
signal st_master_port_sel : wb_master_port_sel;
signal st_master_port_we : wb_master_port_we;
signal st_master_port_cyc : wb_master_port_cyc;
signal st_master_port_stb : wb_master_port_stb;
signal st_master_port_ack : wb_master_port_ack;
signal st_master_port_err : wb_master_port_err;
signal st_master_port_rty : wb_master_port_rty;
signal st_master_port_cti : wb_master_port_cti;
signal st_master_port_bte : wb_master_port_bte;
 
signal st_slave_port_data_in : wb_slave_port_data;
signal st_slave_port_data_out : wb_slave_port_data;
signal st_slave_port_addr : wb_slave_port_addr;
signal st_slave_port_sel : wb_slave_port_sel;
signal st_slave_port_we : wb_slave_port_we;
signal st_slave_port_cyc : wb_slave_port_cyc;
signal st_slave_port_stb : wb_slave_port_stb;
signal st_slave_port_ack : wb_slave_port_ack;
signal st_slave_port_err : wb_slave_port_err;
signal st_slave_port_rty : wb_slave_port_rty;
signal st_slave_port_cti : wb_slave_port_cti;
signal st_slave_port_bte : wb_slave_port_bte;
-------------------------------------------------------------------------------
--
-- Declare Module Output Req stuff:
signal sv_pcie_line_num : std_logic_vector(2 downto 0);
-------------------------------------------------------------------------------
--
-- Declare WB stuff
-- SYS_CON
signal s_wb_clk : std_logic;
signal s_wb_rst : std_logic;
-- PCIE_CORE64 wb
signal sv_wbm_addr_pcie_core64_wb : std_logic_vector(p_WB_CROSS_ADDR_W-1 downto 0);
signal sv_wbm_data_out_pcie_core64_wb : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal sv_wbm_sel_pcie_core64_wb : std_logic_vector(p_WB_CROSS_DATA_W/8-1 downto 0);
signal s_wbm_we_pcie_core64_wb : std_logic;
signal s_wbm_cyc_pcie_core64_wb : std_logic;
signal s_wbm_stb_pcie_core64_wb : std_logic;
signal sv_wbm_cti_pcie_core64_wb : std_logic_vector(2 downto 0);
signal sv_wbm_bte_pcie_core64_wb : std_logic_vector(1 downto 0);
signal sv_wbm_data_in_pcie_core64_wb : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal s_wbm_ack_pcie_core64_wb : std_logic;
signal s_wbm_err_pcie_core64_wb : std_logic;
signal s_wbm_rty_pcie_core64_wb : std_logic;
signal sv_wbm_dmar_irq_pcie_core64_wb : std_logic_vector(1 downto 0);
-- TEST_CHECK.WB_CFG_SLAVE
signal sv_wbs_cfg_addr_test_check : std_logic_vector(p_WB_CROSS_ADDR_W-1 downto 0);
signal sv_wbs_cfg_data_in_test_check : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal sv_wbs_cfg_sel_test_check : std_logic_vector(p_WB_CROSS_DATA_W/8-1 downto 0);
signal s_wbs_cfg_we_test_check : std_logic;
signal s_wbs_cfg_cyc_test_check : std_logic;
signal s_wbs_cfg_stb_test_check : std_logic;
signal sv_wbs_cfg_cti_test_check : std_logic_vector(2 downto 0);
signal sv_wbs_cfg_bte_test_check : std_logic_vector(1 downto 0);
signal sv_wbs_cfg_data_out_test_check : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal s_wbs_cfg_ack_test_check : std_logic;
signal s_wbs_cfg_err_test_check : std_logic;
signal s_wbs_cfg_rty_test_check : std_logic;
signal s_wbs_irq_dmar_test_check : std_logic; -- TEST_CHECK WB DMAR IRQ
-- TEST_CHECK.WB_BURST_SLAVE
signal sv_wbs_burst_addr_test_check : std_logic_vector(p_WB_CROSS_ADDR_W-1 downto 0);
signal sv_wbs_burst_data_in_test_check : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal sv_wbs_burst_sel_test_check : std_logic_vector(p_WB_CROSS_DATA_W/8-1 downto 0);
signal s_wbs_burst_we_test_check : std_logic;
signal s_wbs_burst_cyc_test_check : std_logic;
signal s_wbs_burst_stb_test_check : std_logic;
signal sv_wbs_burst_cti_test_check : std_logic_vector(2 downto 0);
signal sv_wbs_burst_bte_test_check : std_logic_vector(1 downto 0);
signal s_wbs_burst_ack_test_check : std_logic;
signal s_wbs_burst_err_test_check : std_logic;
signal s_wbs_burst_rty_test_check : std_logic;
-- TEST_GEN.WB_CFG_SLAVE
signal sv_wbs_cfg_addr_test_gen : std_logic_vector(p_WB_CROSS_ADDR_W-1 downto 0);
signal sv_wbs_cfg_data_in_test_gen : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal sv_wbs_cfg_sel_test_gen : std_logic_vector(p_WB_CROSS_DATA_W/8-1 downto 0);
signal s_wbs_cfg_we_test_gen : std_logic;
signal s_wbs_cfg_cyc_test_gen : std_logic;
signal s_wbs_cfg_stb_test_gen : std_logic;
signal sv_wbs_cfg_cti_test_gen : std_logic_vector(2 downto 0);
signal sv_wbs_cfg_bte_test_gen : std_logic_vector(1 downto 0);
signal sv_wbs_cfg_data_out_test_gen : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal s_wbs_cfg_ack_test_gen : std_logic;
signal s_wbs_cfg_err_test_gen : std_logic;
signal s_wbs_cfg_rty_test_gen : std_logic;
signal s_wbs_irq_dmar_test_gen : std_logic; -- TEST_GEN WB DMAR IRQ
-- TEST_GEN.WB_BURST_SLAVE
signal sv_wbs_burst_addr_test_gen : std_logic_vector(p_WB_CROSS_ADDR_W-1 downto 0);
signal sv_wbs_burst_data_out_test_gen : std_logic_vector(p_WB_CROSS_DATA_W-1 downto 0);
signal sv_wbs_burst_sel_test_gen : std_logic_vector(p_WB_CROSS_DATA_W/8-1 downto 0);
signal s_wbs_burst_we_test_gen : std_logic;
signal s_wbs_burst_cyc_test_gen : std_logic;
signal s_wbs_burst_stb_test_gen : std_logic;
signal sv_wbs_burst_cti_test_gen : std_logic_vector(2 downto 0);
signal sv_wbs_burst_bte_test_gen : std_logic_vector(1 downto 0);
signal s_wbs_burst_ack_test_gen : std_logic;
signal s_wbs_burst_err_test_gen : std_logic;
signal s_wbs_burst_rty_test_gen : std_logic;
----------------------------------------------------------------------------------
begin
-------------------------------------------------------------------------------
--
-- Instantiate PCIE_CORE64_WB module (provide main PCIE finctionality):
--
PCIE_CORE64_WB : pcie_core64_wishbone_m8
generic map
(
 
 
 
 
)
port map
(
---- PCI-Express ----
txp => txp,
txn => txn,
rxp => rxp,
rxn => rxn,
 
 
 
 
 
---- Wishbone SYS_CON -----
o_wb_clk => s_wb_clk,
o_wb_rst => s_wb_rst,
---- Wishbone BUS -----
ov_wbm_addr => sv_wbm_addr_pcie_core64_wb,
ov_wbm_data => sv_wbm_data_out_pcie_core64_wb,
ov_wbm_sel => sv_wbm_sel_pcie_core64_wb,
o_wbm_we => s_wbm_we_pcie_core64_wb,
o_wbm_cyc => s_wbm_cyc_pcie_core64_wb,
o_wbm_stb => s_wbm_stb_pcie_core64_wb,
ov_wbm_cti => sv_wbm_cti_pcie_core64_wb, -- Cycle Type Identifier Address Tag
ov_wbm_bte => sv_wbm_bte_pcie_core64_wb, -- Burst Type Extension Address Tag
iv_wbm_data => sv_wbm_data_in_pcie_core64_wb,
i_wbm_ack => s_wbm_ack_pcie_core64_wb,
i_wbm_err => s_wbm_err_pcie_core64_wb, -- error input - abnormal cycle termination
i_wbm_rty => s_wbm_rty_pcie_core64_wb, -- retry input - interface is not ready
i_wdm_irq_0 => '0', -- NC for now
iv_wbm_irq_dmar => sv_wbm_dmar_irq_pcie_core64_wb --
);
-- Construct DMAR WB IR Input:
sv_wbm_dmar_irq_pcie_core64_wb <= s_wbs_irq_dmar_test_check & s_wbs_irq_dmar_test_gen; -- Bit#1 - TEST_CHECK, Bit#0 - TEST_GEN
-------------------------------------------------------------------------------
--
-- Instantiate TEST_CHECK (provide check of input data):
--
TEST_CHECK : block_test_check_wb
port map
(
--
-- SYS_CON
i_clk => s_wb_clk,
i_rst => s_wb_rst,
--
-- WB CFG SLAVE IF
iv_wbs_cfg_addr => sv_wbs_cfg_addr_test_check( 7 downto 0), -- Route only req addr wires: 256B ADDR Range
iv_wbs_cfg_data => sv_wbs_cfg_data_in_test_check,
iv_wbs_cfg_sel => sv_wbs_cfg_sel_test_check,
i_wbs_cfg_we => s_wbs_cfg_we_test_check,
i_wbs_cfg_cyc => s_wbs_cfg_cyc_test_check,
i_wbs_cfg_stb => s_wbs_cfg_stb_test_check,
iv_wbs_cfg_cti => sv_wbs_cfg_cti_test_check,
iv_wbs_cfg_bte => sv_wbs_cfg_bte_test_check,
ov_wbs_cfg_data => sv_wbs_cfg_data_out_test_check,
o_wbs_cfg_ack => s_wbs_cfg_ack_test_check,
o_wbs_cfg_err => s_wbs_cfg_err_test_check,
o_wbs_cfg_rty => s_wbs_cfg_rty_test_check,
--
-- WB BURST SLAVE IF (WRITE-ONLY IF)
iv_wbs_burst_addr => sv_wbs_burst_addr_test_check( 11 downto 0), -- Route only req addr wires: 4KB ADDR Range
iv_wbs_burst_data => sv_wbs_burst_data_in_test_check,
iv_wbs_burst_sel => sv_wbs_burst_sel_test_check,
i_wbs_burst_we => s_wbs_burst_we_test_check,
i_wbs_burst_cyc => s_wbs_burst_cyc_test_check,
i_wbs_burst_stb => s_wbs_burst_stb_test_check,
iv_wbs_burst_cti => sv_wbs_burst_cti_test_check,
iv_wbs_burst_bte => sv_wbs_burst_bte_test_check,
o_wbs_burst_ack => s_wbs_burst_ack_test_check,
o_wbs_burst_err => s_wbs_burst_err_test_check,
o_wbs_burst_rty => s_wbs_burst_rty_test_check,
--
-- WB IRQ lines
o_wbs_irq_0 => OPEN, -- NC for now
o_wbs_irq_dmar => s_wbs_irq_dmar_test_check --
);
-------------------------------------------------------------------------------
--
-- Instantiate TEST_GEN (provide generation of test data):
--
TEST_GEN : block_test_generate_wb
port map
(
--
-- SYS_CON
i_clk => s_wb_clk,
i_rst => s_wb_rst,
--
-- WB CFG SLAVE IF
iv_wbs_cfg_addr => sv_wbs_cfg_addr_test_gen( 7 downto 0), -- Route only req addr wires: 256B ADDR Range
iv_wbs_cfg_data => sv_wbs_cfg_data_in_test_gen,
iv_wbs_cfg_sel => sv_wbs_cfg_sel_test_gen,
i_wbs_cfg_we => s_wbs_cfg_we_test_gen,
i_wbs_cfg_cyc => s_wbs_cfg_cyc_test_gen,
i_wbs_cfg_stb => s_wbs_cfg_stb_test_gen,
iv_wbs_cfg_cti => sv_wbs_cfg_cti_test_gen,
iv_wbs_cfg_bte => sv_wbs_cfg_bte_test_gen,
ov_wbs_cfg_data => sv_wbs_cfg_data_out_test_gen,
o_wbs_cfg_ack => s_wbs_cfg_ack_test_gen,
o_wbs_cfg_err => s_wbs_cfg_err_test_gen,
o_wbs_cfg_rty => s_wbs_cfg_rty_test_gen,
--
-- WB BURST SLAVE IF (READ-ONLY IF)
iv_wbs_burst_addr => sv_wbs_burst_addr_test_gen( 11 downto 0), -- Route only req addr wires: 4KB ADDR Range
iv_wbs_burst_sel => sv_wbs_burst_sel_test_gen,
i_wbs_burst_we => s_wbs_burst_we_test_gen,
i_wbs_burst_cyc => s_wbs_burst_cyc_test_gen,
i_wbs_burst_stb => s_wbs_burst_stb_test_gen,
iv_wbs_burst_cti => sv_wbs_burst_cti_test_gen,
iv_wbs_burst_bte => sv_wbs_burst_bte_test_gen,
ov_wbs_burst_data => sv_wbs_burst_data_out_test_gen,
o_wbs_burst_ack => s_wbs_burst_ack_test_gen,
o_wbs_burst_err => s_wbs_burst_err_test_gen,
o_wbs_burst_rty => s_wbs_burst_rty_test_gen,
--
-- WB IRQ lines
o_wbs_irq_0 => OPEN, -- NC for now
o_wbs_irq_dmar => s_wbs_irq_dmar_test_gen --
);
-------------------------------------------------------------------------------
--
-- Instantiate WB_CROSS
-- ==> MOST HEAVY PART of DESIGN (from port-quantity point of view)
--
WB_CROSS : wb_conmax_top
generic map
(
dw => p_WB_CROSS_DATA_W, -- WB_DATA_WIDTH==64bit (defined at wb_conmax_top_pkg.vhd)
aw => p_WB_CROSS_ADDR_W -- WB_ADDR_WIDTH==32bit (defined at wb_conmax_top_pkg.vhd)
)
port map
(
--
-- SYS_CON
clk_i => s_wb_clk,
rst_i => s_wb_rst,
--
-- Master 0 Interface
m0_data_i => st_master_port_data_in(0),
m0_data_o => st_master_port_data_out(0),
m0_addr_i => st_master_port_addr(0),
m0_sel_i => st_master_port_sel(0),
m0_we_i => st_master_port_we(0),
m0_cyc_i => st_master_port_cyc(0),
m0_stb_i => st_master_port_stb(0),
m0_ack_o => st_master_port_ack(0),
m0_err_o => st_master_port_err(0),
m0_rty_o => st_master_port_rty(0),
m0_cti_i => st_master_port_cti(0),
m0_bte_i => st_master_port_bte(0),
--
-- Master 1 Interface
m1_data_i => st_master_port_data_in(1),
m1_data_o => st_master_port_data_out(1),
m1_addr_i => st_master_port_addr(1),
m1_sel_i => st_master_port_sel(1),
m1_we_i => st_master_port_we(1),
m1_cyc_i => st_master_port_cyc(1),
m1_stb_i => st_master_port_stb(1),
m1_ack_o => st_master_port_ack(1),
m1_err_o => st_master_port_err(1),
m1_rty_o => st_master_port_rty(1),
m1_cti_i => st_master_port_cti(1),
m1_bte_i => st_master_port_bte(1),
--
-- Master 2 Interface
m2_data_i => st_master_port_data_in(2),
m2_data_o => st_master_port_data_out(2),
m2_addr_i => st_master_port_addr(2),
m2_sel_i => st_master_port_sel(2),
m2_we_i => st_master_port_we(2),
m2_cyc_i => st_master_port_cyc(2),
m2_stb_i => st_master_port_stb(2),
m2_ack_o => st_master_port_ack(2),
m2_err_o => st_master_port_err(2),
m2_rty_o => st_master_port_rty(2),
m2_cti_i => st_master_port_cti(2),
m2_bte_i => st_master_port_bte(2),
--
-- Master 3 Interface
m3_data_i => st_master_port_data_in(3),
m3_data_o => st_master_port_data_out(3),
m3_addr_i => st_master_port_addr(3),
m3_sel_i => st_master_port_sel(3),
m3_we_i => st_master_port_we(3),
m3_cyc_i => st_master_port_cyc(3),
m3_stb_i => st_master_port_stb(3),
m3_ack_o => st_master_port_ack(3),
m3_err_o => st_master_port_err(3),
m3_rty_o => st_master_port_rty(3),
m3_cti_i => st_master_port_cti(3),
m3_bte_i => st_master_port_bte(3),
--
-- Master 4 Interface
m4_data_i => st_master_port_data_in(4),
m4_data_o => st_master_port_data_out(4),
m4_addr_i => st_master_port_addr(4),
m4_sel_i => st_master_port_sel(4),
m4_we_i => st_master_port_we(4),
m4_cyc_i => st_master_port_cyc(4),
m4_stb_i => st_master_port_stb(4),
m4_ack_o => st_master_port_ack(4),
m4_err_o => st_master_port_err(4),
m4_rty_o => st_master_port_rty(4),
m4_cti_i => st_master_port_cti(4),
m4_bte_i => st_master_port_bte(4),
--
-- Master 5 Interface
m5_data_i => st_master_port_data_in(5),
m5_data_o => st_master_port_data_out(5),
m5_addr_i => st_master_port_addr(5),
m5_sel_i => st_master_port_sel(5),
m5_we_i => st_master_port_we(5),
m5_cyc_i => st_master_port_cyc(5),
m5_stb_i => st_master_port_stb(5),
m5_ack_o => st_master_port_ack(5),
m5_err_o => st_master_port_err(5),
m5_rty_o => st_master_port_rty(5),
m5_cti_i => st_master_port_cti(5),
m5_bte_i => st_master_port_bte(5),
--
-- Master 6 Interface
m6_data_i => st_master_port_data_in(6),
m6_data_o => st_master_port_data_out(6),
m6_addr_i => st_master_port_addr(6),
m6_sel_i => st_master_port_sel(6),
m6_we_i => st_master_port_we(6),
m6_cyc_i => st_master_port_cyc(6),
m6_stb_i => st_master_port_stb(6),
m6_ack_o => st_master_port_ack(6),
m6_err_o => st_master_port_err(6),
m6_rty_o => st_master_port_rty(6),
m6_cti_i => st_master_port_cti(6),
m6_bte_i => st_master_port_bte(6),
--
-- Master 7 Interface
m7_data_i => st_master_port_data_in(7),
m7_data_o => st_master_port_data_out(7),
m7_addr_i => st_master_port_addr(7),
m7_sel_i => st_master_port_sel(7),
m7_we_i => st_master_port_we(7),
m7_cyc_i => st_master_port_cyc(7),
m7_stb_i => st_master_port_stb(7),
m7_ack_o => st_master_port_ack(7),
m7_err_o => st_master_port_err(7),
m7_rty_o => st_master_port_rty(7),
m7_cti_i => st_master_port_cti(7),
m7_bte_i => st_master_port_bte(7),
--
--
-- Slave 0 Interface
s0_data_i => st_slave_port_data_in(0),
s0_data_o => st_slave_port_data_out(0),
s0_addr_o => st_slave_port_addr(0),
s0_sel_o => st_slave_port_sel(0),
s0_we_o => st_slave_port_we(0),
s0_cyc_o => st_slave_port_cyc(0),
s0_stb_o => st_slave_port_stb(0),
s0_ack_i => st_slave_port_ack(0),
s0_err_i => st_slave_port_err(0),
s0_rty_i => st_slave_port_rty(0),
s0_cti_o => st_slave_port_cti(0),
s0_bte_o => st_slave_port_bte(0),
--
-- Slave 1 Interface
s1_data_i => st_slave_port_data_in(1),
s1_data_o => st_slave_port_data_out(1),
s1_addr_o => st_slave_port_addr(1),
s1_sel_o => st_slave_port_sel(1),
s1_we_o => st_slave_port_we(1),
s1_cyc_o => st_slave_port_cyc(1),
s1_stb_o => st_slave_port_stb(1),
s1_ack_i => st_slave_port_ack(1),
s1_err_i => st_slave_port_err(1),
s1_rty_i => st_slave_port_rty(1),
s1_cti_o => st_slave_port_cti(1),
s1_bte_o => st_slave_port_bte(1),
--
-- Slave 2 Interface
s2_data_i => st_slave_port_data_in(2),
s2_data_o => st_slave_port_data_out(2),
s2_addr_o => st_slave_port_addr(2),
s2_sel_o => st_slave_port_sel(2),
s2_we_o => st_slave_port_we(2),
s2_cyc_o => st_slave_port_cyc(2),
s2_stb_o => st_slave_port_stb(2),
s2_ack_i => st_slave_port_ack(2),
s2_err_i => st_slave_port_err(2),
s2_rty_i => st_slave_port_rty(2),
s2_cti_o => st_slave_port_cti(2),
s2_bte_o => st_slave_port_bte(2),
--
-- Slave 3 Interface
s3_data_i => st_slave_port_data_in(3),
s3_data_o => st_slave_port_data_out(3),
s3_addr_o => st_slave_port_addr(3),
s3_sel_o => st_slave_port_sel(3),
s3_we_o => st_slave_port_we(3),
s3_cyc_o => st_slave_port_cyc(3),
s3_stb_o => st_slave_port_stb(3),
s3_ack_i => st_slave_port_ack(3),
s3_err_i => st_slave_port_err(3),
s3_rty_i => st_slave_port_rty(3),
s3_cti_o => st_slave_port_cti(3),
s3_bte_o => st_slave_port_bte(3),
--
-- Slave 4 Interface
s4_data_i => st_slave_port_data_in(4),
s4_data_o => st_slave_port_data_out(4),
s4_addr_o => st_slave_port_addr(4),
s4_sel_o => st_slave_port_sel(4),
s4_we_o => st_slave_port_we(4),
s4_cyc_o => st_slave_port_cyc(4),
s4_stb_o => st_slave_port_stb(4),
s4_ack_i => st_slave_port_ack(4),
s4_err_i => st_slave_port_err(4),
s4_rty_i => st_slave_port_rty(4),
s4_cti_o => st_slave_port_cti(4),
s4_bte_o => st_slave_port_bte(4),
--
-- Slave 5 Interface
s5_data_i => st_slave_port_data_in(5),
s5_data_o => st_slave_port_data_out(5),
s5_addr_o => st_slave_port_addr(5),
s5_sel_o => st_slave_port_sel(5),
s5_we_o => st_slave_port_we(5),
s5_cyc_o => st_slave_port_cyc(5),
s5_stb_o => st_slave_port_stb(5),
s5_ack_i => st_slave_port_ack(5),
s5_err_i => st_slave_port_err(5),
s5_rty_i => st_slave_port_rty(5),
s5_cti_o => st_slave_port_cti(5),
s5_bte_o => st_slave_port_bte(5),
--
-- Slave 6 Interface
s6_data_i => st_slave_port_data_in(6),
s6_data_o => st_slave_port_data_out(6),
s6_addr_o => st_slave_port_addr(6),
s6_sel_o => st_slave_port_sel(6),
s6_we_o => st_slave_port_we(6),
s6_cyc_o => st_slave_port_cyc(6),
s6_stb_o => st_slave_port_stb(6),
s6_ack_i => st_slave_port_ack(6),
s6_err_i => st_slave_port_err(6),
s6_rty_i => st_slave_port_rty(6),
s6_cti_o => st_slave_port_cti(6),
s6_bte_o => st_slave_port_bte(6),
--
-- Slave 7 Interface
s7_data_i => st_slave_port_data_in(7),
s7_data_o => st_slave_port_data_out(7),
s7_addr_o => st_slave_port_addr(7),
s7_sel_o => st_slave_port_sel(7),
s7_we_o => st_slave_port_we(7),
s7_cyc_o => st_slave_port_cyc(7),
s7_stb_o => st_slave_port_stb(7),
s7_ack_i => st_slave_port_ack(7),
s7_err_i => st_slave_port_err(7),
s7_rty_i => st_slave_port_rty(7),
s7_cti_o => st_slave_port_cti(7),
s7_bte_o => st_slave_port_bte(7),
--
-- Slave 8 Interface
s8_data_i => st_slave_port_data_in(8),
s8_data_o => st_slave_port_data_out(8),
s8_addr_o => st_slave_port_addr(8),
s8_sel_o => st_slave_port_sel(8),
s8_we_o => st_slave_port_we(8),
s8_cyc_o => st_slave_port_cyc(8),
s8_stb_o => st_slave_port_stb(8),
s8_ack_i => st_slave_port_ack(8),
s8_err_i => st_slave_port_err(8),
s8_rty_i => st_slave_port_rty(8),
s8_cti_o => st_slave_port_cti(8),
s8_bte_o => st_slave_port_bte(8),
--
-- Slave 9 Interface
s9_data_i => st_slave_port_data_in(9),
s9_data_o => st_slave_port_data_out(9),
s9_addr_o => st_slave_port_addr(9),
s9_sel_o => st_slave_port_sel(9),
s9_we_o => st_slave_port_we(9),
s9_cyc_o => st_slave_port_cyc(9),
s9_stb_o => st_slave_port_stb(9),
s9_ack_i => st_slave_port_ack(9),
s9_err_i => st_slave_port_err(9),
s9_rty_i => st_slave_port_rty(9),
s9_cti_o => st_slave_port_cti(9),
s9_bte_o => st_slave_port_bte(9),
--
-- Slave 10 Interface
s10_data_i => st_slave_port_data_in(10),
s10_data_o => st_slave_port_data_out(10),
s10_addr_o => st_slave_port_addr(10),
s10_sel_o => st_slave_port_sel(10),
s10_we_o => st_slave_port_we(10),
s10_cyc_o => st_slave_port_cyc(10),
s10_stb_o => st_slave_port_stb(10),
s10_ack_i => st_slave_port_ack(10),
s10_err_i => st_slave_port_err(10),
s10_rty_i => st_slave_port_rty(10),
s10_cti_o => st_slave_port_cti(10),
s10_bte_o => st_slave_port_bte(10),
--
-- Slave 11 Interface
s11_data_i => st_slave_port_data_in(11),
s11_data_o => st_slave_port_data_out(11),
s11_addr_o => st_slave_port_addr(11),
s11_sel_o => st_slave_port_sel(11),
s11_we_o => st_slave_port_we(11),
s11_cyc_o => st_slave_port_cyc(11),
s11_stb_o => st_slave_port_stb(11),
s11_ack_i => st_slave_port_ack(11),
s11_err_i => st_slave_port_err(11),
s11_rty_i => st_slave_port_rty(11),
s11_cti_o => st_slave_port_cti(11),
s11_bte_o => st_slave_port_bte(11),
--
-- Slave 12 Interface
s12_data_i => st_slave_port_data_in(12),
s12_data_o => st_slave_port_data_out(12),
s12_addr_o => st_slave_port_addr(12),
s12_sel_o => st_slave_port_sel(12),
s12_we_o => st_slave_port_we(12),
s12_cyc_o => st_slave_port_cyc(12),
s12_stb_o => st_slave_port_stb(12),
s12_ack_i => st_slave_port_ack(12),
s12_err_i => st_slave_port_err(12),
s12_rty_i => st_slave_port_rty(12),
s12_cti_o => st_slave_port_cti(12),
s12_bte_o => st_slave_port_bte(12),
--
-- Slave 13 Interface
s13_data_i => st_slave_port_data_in(13),
s13_data_o => st_slave_port_data_out(13),
s13_addr_o => st_slave_port_addr(13),
s13_sel_o => st_slave_port_sel(13),
s13_we_o => st_slave_port_we(13),
s13_cyc_o => st_slave_port_cyc(13),
s13_stb_o => st_slave_port_stb(13),
s13_ack_i => st_slave_port_ack(13),
s13_err_i => st_slave_port_err(13),
s13_rty_i => st_slave_port_rty(13),
s13_cti_o => st_slave_port_cti(13),
s13_bte_o => st_slave_port_bte(13),
--
-- Slave 14 Interface
s14_data_i => st_slave_port_data_in(14),
s14_data_o => st_slave_port_data_out(14),
s14_addr_o => st_slave_port_addr(14),
s14_sel_o => st_slave_port_sel(14),
s14_we_o => st_slave_port_we(14),
s14_cyc_o => st_slave_port_cyc(14),
s14_stb_o => st_slave_port_stb(14),
s14_ack_i => st_slave_port_ack(14),
s14_err_i => st_slave_port_err(14),
s14_rty_i => st_slave_port_rty(14),
s14_cti_o => st_slave_port_cti(14),
s14_bte_o => st_slave_port_bte(14),
--
-- Slave 15 Interface
s15_data_i => st_slave_port_data_in(15),
s15_data_o => st_slave_port_data_out(15),
s15_addr_o => st_slave_port_addr(15),
s15_sel_o => st_slave_port_sel(15),
s15_we_o => st_slave_port_we(15),
s15_cyc_o => st_slave_port_cyc(15),
s15_stb_o => st_slave_port_stb(15),
s15_ack_i => st_slave_port_ack(15),
s15_err_i => st_slave_port_err(15),
s15_rty_i => st_slave_port_rty(15),
s15_cti_o => st_slave_port_cti(15),
s15_bte_o => st_slave_port_bte(15)
);
-------------------------------------------------------------------------------
--
-- Module Inner route:
--
-- 1st route WB_CROSS MASTER signals:
-- ==> Deal with PCIE_CORE64_WB Ports:
st_master_port_data_in(0) <= sv_wbm_data_out_pcie_core64_wb; -- from WBM to WB_CROSS
st_master_port_addr(0) <= sv_wbm_addr_pcie_core64_wb; -- ...
st_master_port_sel(0) <= sv_wbm_sel_pcie_core64_wb; -- ...
st_master_port_we(0) <= s_wbm_we_pcie_core64_wb; -- ...
st_master_port_cyc(0) <= s_wbm_cyc_pcie_core64_wb; -- ...
st_master_port_stb(0) <= s_wbm_stb_pcie_core64_wb; -- ...
st_master_port_cti(0) <= sv_wbm_cti_pcie_core64_wb; -- ...
st_master_port_bte(0) <= sv_wbm_bte_pcie_core64_wb; -- ...
 
sv_wbm_data_in_pcie_core64_wb <= st_master_port_data_out(0); -- from WB_CROSS to WBM
s_wbm_ack_pcie_core64_wb <= st_master_port_ack(0); -- ...
s_wbm_err_pcie_core64_wb <= st_master_port_err(0); -- ...
s_wbm_rty_pcie_core64_wb <= st_master_port_rty(0); -- ...
-- ==> Deal with Unused Ports:
gen_conn_to_unused_mports : for i in (0+1) to p_WB_CROSS_MASTER_Q-1 generate
st_master_port_data_in(i) <= (others => '0');
st_master_port_addr(i) <= (others => '0');
st_master_port_sel(i) <= (others => '0');
st_master_port_we(i) <= '0';
st_master_port_cyc(i) <= '0';
st_master_port_stb(i) <= '0';
st_master_port_cti(i) <= (others => '0');
st_master_port_bte(i) <= (others => '0');
--st_master_port_data_out(i) <= ;
--st_master_port_ack(i) <= ;
--st_master_port_err(i) <= ;
--st_master_port_rty(i) <= ;
end generate gen_conn_to_unused_mports;
--
-- 2nd route WB_CROSS SLAVE signals:
-- Deal with TEST_CHECK.WB_CFG_SLAVE
sv_wbs_cfg_data_in_test_check <= st_slave_port_data_out(0); -- from WB_CROSS to WBS
sv_wbs_cfg_addr_test_check <= st_slave_port_addr(0); -- ...
sv_wbs_cfg_sel_test_check <= st_slave_port_sel(0); -- ...
s_wbs_cfg_we_test_check <= st_slave_port_we(0); -- ...
s_wbs_cfg_cyc_test_check <= st_slave_port_cyc(0); -- ...
s_wbs_cfg_stb_test_check <= st_slave_port_stb(0); -- ...
sv_wbs_cfg_cti_test_check <= st_slave_port_cti(0); -- ...
sv_wbs_cfg_bte_test_check <= st_slave_port_bte(0); -- ...
 
st_slave_port_data_in(0) <= sv_wbs_cfg_data_out_test_check; -- from WBS to WB_CROSS
st_slave_port_ack(0) <= s_wbs_cfg_ack_test_check; -- ...
st_slave_port_err(0) <= s_wbs_cfg_err_test_check; -- ...
st_slave_port_rty(0) <= s_wbs_cfg_rty_test_check; -- ...
-- Deal with TEST_CHECK.WB_BURST_SLAVE
sv_wbs_burst_data_in_test_check <= st_slave_port_data_out(1); -- from WB_CROSS to WBS
sv_wbs_burst_addr_test_check <= st_slave_port_addr(1); -- ...
sv_wbs_burst_sel_test_check <= st_slave_port_sel(1); -- ...
s_wbs_burst_we_test_check <= st_slave_port_we(1); -- ...
s_wbs_burst_cyc_test_check <= st_slave_port_cyc(1); -- ...
s_wbs_burst_stb_test_check <= st_slave_port_stb(1); -- ...
sv_wbs_burst_cti_test_check <= st_slave_port_cti(1);
sv_wbs_burst_bte_test_check <= st_slave_port_bte(1);
 
st_slave_port_data_in(1) <= (others => '0'); -- from WBS to WB_CROSS
st_slave_port_ack(1) <= s_wbs_burst_ack_test_check; -- ...
st_slave_port_err(1) <= s_wbs_burst_err_test_check; -- ...
st_slave_port_rty(1) <= s_wbs_burst_rty_test_check; -- ...
-- Deal with TEST_GEN.WB_CFG_SLAVE
sv_wbs_cfg_data_in_test_gen <= st_slave_port_data_out(2); -- from WB_CROSS to WBS
sv_wbs_cfg_addr_test_gen <= st_slave_port_addr(2); -- ...
sv_wbs_cfg_sel_test_gen <= st_slave_port_sel(2); -- ...
s_wbs_cfg_we_test_gen <= st_slave_port_we(2); -- ...
s_wbs_cfg_cyc_test_gen <= st_slave_port_cyc(2); -- ...
s_wbs_cfg_stb_test_gen <= st_slave_port_stb(2); -- ...
sv_wbs_cfg_cti_test_gen <= st_slave_port_cti(2); -- ...
sv_wbs_cfg_bte_test_gen <= st_slave_port_bte(2); -- ...
 
st_slave_port_data_in(2) <= sv_wbs_cfg_data_out_test_gen; -- from WBS to WB_CROSS
st_slave_port_ack(2) <= s_wbs_cfg_ack_test_gen; -- ...
st_slave_port_err(2) <= s_wbs_cfg_err_test_gen; -- ...
st_slave_port_rty(2) <= s_wbs_cfg_rty_test_gen; -- ...
-- Deal with TEST_GEN.WB_BURST_SLAVE
--st_slave_port_data_out(3)
sv_wbs_burst_addr_test_gen <= st_slave_port_addr(3);
sv_wbs_burst_sel_test_gen <= st_slave_port_sel(3);
s_wbs_burst_we_test_gen <= st_slave_port_we(3);
s_wbs_burst_cyc_test_gen <= st_slave_port_cyc(3);
s_wbs_burst_stb_test_gen <= st_slave_port_stb(3);
sv_wbs_burst_cti_test_gen <= st_slave_port_cti(3);
sv_wbs_burst_bte_test_gen <= st_slave_port_bte(3);
 
st_slave_port_data_in(3) <= sv_wbs_burst_data_out_test_gen;
st_slave_port_ack(3) <= s_wbs_burst_ack_test_gen;
st_slave_port_err(3) <= s_wbs_burst_err_test_gen;
st_slave_port_rty(3) <= s_wbs_burst_rty_test_gen;
-- Deal with Unused SALVE Ports
gen_conn_to_unused_sports : for i in (3+1) to p_WB_CROSS_SLAVE_Q-1 generate
--st_slave_port_data_out(i) <= ;
--st_slave_port_addr(i) <= ;
--st_slave_port_sel(i) <= ;
--st_slave_port_we(i) <= ;
--st_slave_port_cyc(i) <= ;
--st_slave_port_stb(i) <= ;
--st_slave_port_cti(i) <= ;
--st_slave_port_bte(i) <= ;
st_slave_port_data_in(i) <= p_TEST_DATA_64BIT;
st_slave_port_ack(i) <= '1'; -- ALWAYS READY (always answer to MASTER with "p_TEST_DATA_64BIT" value)
st_slave_port_err(i) <= '0';
st_slave_port_rty(i) <= '0';
end generate gen_conn_to_unused_sports;
--
-- Construct PCIE Line-width value:
sv_pcie_line_num <= sv_pcie_lstatus(6 downto 4) when s_pcie_link_up_n='0'
else "000";
 
-------------------------------------------------------------------------------
--
-- Module Outputs deal:
--
led(1) <= s_pcie_link_up_n after 1ns when rising_edge(s_wb_clk); -- LED#0 - PCIE_LINK_UP
--
led(3 downto 2) <= sv_pcie_line_num( 1 downto 0 ) after 1ns when rising_edge(s_wb_clk); -- LED#1 - show PCIE line-width: x1->1, x2->2, etc...
 
-------------------------------------------------------------------------------
end rtl;
/.
. Property changes : Added: svn:externals ## -0,0 +1,2 ## +pcie_src http://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk/core/ds_dma64/pcie_src +wishbone http://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk/core/wishbone

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.