From a83dd0c5427987ee9284fb62f13c5b01444650f4 Mon Sep 17 00:00:00 2001 From: Erik Kooistra <kooistra@astron.nl> Date: Wed, 10 Dec 2014 13:12:19 +0000 Subject: [PATCH] Use g_no_dut instead of c_loopback_st. --- .../technology/eth_10g/tb_tb_tech_eth_10g.vhd | 14 +- .../technology/eth_10g/tb_tech_eth_10g.vhd | 160 +++++++++--------- 2 files changed, 89 insertions(+), 85 deletions(-) diff --git a/libraries/technology/eth_10g/tb_tb_tech_eth_10g.vhd b/libraries/technology/eth_10g/tb_tb_tech_eth_10g.vhd index 74fa70275e..d01d180131 100644 --- a/libraries/technology/eth_10g/tb_tb_tech_eth_10g.vhd +++ b/libraries/technology/eth_10g/tb_tb_tech_eth_10g.vhd @@ -43,23 +43,25 @@ ARCHITECTURE tb OF tb_tb_tech_eth_10g IS CONSTANT c_156 : TIME := 6.4 ns; CONSTANT c_data_type : NATURAL := c_tb_tech_mac_10g_data_type_symbols; - CONSTANT c_tb_end_vec : STD_LOGIC_VECTOR(1 DOWNTO 0) := (OTHERS=>'1'); - SIGNAL tb_end_vec : STD_LOGIC_VECTOR(1 DOWNTO 0) := c_tb_end_vec; -- sufficiently long to fit all tb instances + CONSTANT c_tb_end_vec : STD_LOGIC_VECTOR(7 DOWNTO 0) := (OTHERS=>'1'); + SIGNAL tb_end_vec : STD_LOGIC_VECTOR(7 DOWNTO 0) := c_tb_end_vec; -- sufficiently long to fit all tb instances BEGIN -- g_technology : NATURAL := c_tech_select_default; -- g_tb_end : BOOLEAN := TRUE; -- when TRUE then tb_end ends this simulation, else a higher multi-testbench will end the simulation --- g_sim_level : NATURAL := 0; -- 0 = use IP; 1 = use fast serdes model +-- g_no_dut : BOOLEAN := FALSE; -- default FALSE to verify the DUT, else use TRUE to verify the tb itself without the DUT +-- g_sim_level : NATURAL := 0; -- 0 = use IP; 1 = use fast serdes model -- g_ref_clk_644_period : TIME := tech_pll_clk_644_period; -- for 10GBASE-R -- g_ref_clk_156_period : TIME := 6.4 ns; -- for XAUI -- g_data_type : NATURAL := c_tb_tech_mac_10g_data_type_symbols; -- g_verify_link_recovery : BOOLEAN := TRUE; -- g_link_status_check : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0) := "11"; --- g_use_serial_rx_in : BOOLEAN := FALSE +-- g_use_serial_rx_in : BOOLEAN := FALSE -- default FALSE when this tb is ran standalone, else use TRUE to simulate a link between two instances of this tb - u_tech_eth_10g : ENTITY work.tb_tech_eth_10g GENERIC MAP (c_tech_select_default, FALSE, 0, c_644, c_156, c_data_type, TRUE, "11", FALSE) PORT MAP (tb_end_vec(0)); - u_sim_eth_10g : ENTITY work.tb_tech_eth_10g GENERIC MAP (c_tech_select_default, FALSE, 1, c_644, c_156, c_data_type, TRUE, "11", FALSE) PORT MAP (tb_end_vec(1)); + u_no_dut : ENTITY work.tb_tech_eth_10g GENERIC MAP (c_tech_select_default, FALSE, TRUE, 0, c_644, c_156, c_data_type, TRUE, "11", FALSE) PORT MAP (tb_end_vec(0)); + u_tech_eth_10g : ENTITY work.tb_tech_eth_10g GENERIC MAP (c_tech_select_default, FALSE, FALSE, 0, c_644, c_156, c_data_type, TRUE, "11", FALSE) PORT MAP (tb_end_vec(1)); + u_sim_eth_10g : ENTITY work.tb_tech_eth_10g GENERIC MAP (c_tech_select_default, FALSE, FALSE, 1, c_644, c_156, c_data_type, TRUE, "11", FALSE) PORT MAP (tb_end_vec(2)); p_tb_end : PROCESS BEGIN diff --git a/libraries/technology/eth_10g/tb_tech_eth_10g.vhd b/libraries/technology/eth_10g/tb_tech_eth_10g.vhd index 3350ce6b33..f57363aeda 100644 --- a/libraries/technology/eth_10g/tb_tech_eth_10g.vhd +++ b/libraries/technology/eth_10g/tb_tech_eth_10g.vhd @@ -48,13 +48,14 @@ ENTITY tb_tech_eth_10g IS GENERIC ( g_technology : NATURAL := c_tech_select_default; g_tb_end : BOOLEAN := TRUE; -- when TRUE then tb_end ends this simulation, else a higher multi-testbench will end the simulation - g_sim_level : NATURAL := 1; -- 0 = use IP; 1 = use fast serdes model + g_no_dut : BOOLEAN := FALSE; -- default FALSE to verify the DUT, else use TRUE to verify the tb itself without the DUT + g_sim_level : NATURAL := 1; -- 0 = use IP; 1 = use fast serdes model g_ref_clk_644_period : TIME := tech_pll_clk_644_period; -- for 10GBASE-R g_ref_clk_156_period : TIME := 6.4 ns; -- for XAUI g_data_type : NATURAL := c_tb_tech_mac_10g_data_type_symbols; g_verify_link_recovery : BOOLEAN := TRUE; g_link_status_check : STD_LOGIC_VECTOR(c_tech_mac_10g_link_status_w-1 DOWNTO 0) := "11"; - g_use_serial_rx_in : BOOLEAN := FALSE + g_use_serial_rx_in : BOOLEAN := FALSE -- default FALSE when this tb is ran standalone, else use TRUE to simulate a link between two instances of this tb ); PORT ( tb_end : OUT STD_LOGIC; @@ -70,12 +71,14 @@ END tb_tech_eth_10g; ARCHITECTURE tb OF tb_tech_eth_10g IS - CONSTANT phy_delay : TIME := 0 ns; + CONSTANT c_sim : BOOLEAN := TRUE; -- tr_xaui_align_dly has time delay ~ 1 sec, so not suitable for simulation + CONSTANT c_nof_channels : NATURAL := 1; -- fixed in this tb + CONSTANT cal_clk_period : TIME := 25 ns; -- 40 MHz + + CONSTANT phy_delay : TIME := 0 ns; CONSTANT c_phy_loopback : BOOLEAN := NOT g_use_serial_rx_in; - CONSTANT c_st_loopback : BOOLEAN := FALSE; -- default FALSE to verify the DUT, else use TRUE to verify the tb itself without the DUT - CONSTANT c_rl : NATURAL := 1; - CONSTANT c_nof_tx_not_valid : NATURAL := 0; -- when > 0 then pull tx valid low for c_nof_tx_not_valid beats during tx + CONSTANT c_pkt_length_arr1 : t_nat_natural_arr := array_init(0, 50, 1) & (1472, 1473) & 9000; -- frame longer than 1518-46 = 1472 is received with rx_sosi.err = 8 -- jumbo frame is 9018-46 = 8972 CONSTANT c_pkt_length_arr2 : t_nat_natural_arr := array_init(46, 10, 139) & 1472; @@ -99,6 +102,7 @@ ARCHITECTURE tb OF tb_tech_eth_10g IS -- Clocks and reset SIGNAL rx_end : STD_LOGIC := '0'; + SIGNAL cal_clk : STD_LOGIC := '1'; -- calibration clock SIGNAL mm_clk : STD_LOGIC := '0'; -- memory-mapped bus clock SIGNAL mm_rst : STD_LOGIC; -- reset synchronous with mm_clk @@ -125,26 +129,22 @@ ARCHITECTURE tb OF tb_tech_eth_10g IS -- 10G MAC control interface SIGNAL mm_init : STD_LOGIC := '1'; - SIGNAL mm_mosi : t_mem_mosi; - SIGNAL mm_mosi_wrdata : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit; - SIGNAL mm_miso : t_mem_miso; - SIGNAL mm_miso_rdval : STD_LOGIC; - SIGNAL mm_miso_rddata : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit; + SIGNAL mac_mosi : t_mem_mosi; + SIGNAL mac_mosi_wrdata : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit; + SIGNAL mac_miso : t_mem_miso; + SIGNAL mac_miso_rdval : STD_LOGIC; + SIGNAL mac_miso_rddata : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit; -- 10G MAC transmit interface -- . The tb is the ST source SIGNAL tx_siso : t_dp_siso; - SIGNAL tx_siso_arr : t_dp_siso_arr(0 DOWNTO 0); SIGNAL tx_sosi : t_dp_sosi; - SIGNAL tx_sosi_arr : t_dp_sosi_arr(0 DOWNTO 0); SIGNAL tx_sosi_data : STD_LOGIC_VECTOR(c_tech_mac_10g_data_w-1 DOWNTO 0); -- 64 bit -- 10G MAC receive interface -- . The tb is the ST sink SIGNAL rx_siso : t_dp_siso; - SIGNAL rx_siso_arr : t_dp_siso_arr(0 DOWNTO 0); SIGNAL rx_sosi : t_dp_sosi; - SIGNAL rx_sosi_arr : t_dp_sosi_arr(0 DOWNTO 0); SIGNAL rx_sosi_data : STD_LOGIC_VECTOR(c_tech_mac_10g_data_w-1 DOWNTO 0); -- 64 bit -- PHY serial IO @@ -166,10 +166,12 @@ ARCHITECTURE tb OF tb_tech_eth_10g IS BEGIN + cal_clk <= NOT cal_clk AFTER cal_clk_period/2; -- Calibration clock + -- debug signals to ease monitoring in wave window - mm_mosi_wrdata <= mm_mosi.wrdata(c_word_w-1 DOWNTO 0); - mm_miso_rddata <= mm_miso.rddata(c_word_w-1 DOWNTO 0); - mm_miso_rdval <= '1' WHEN mm_mosi.rd='1' AND mm_miso.waitrequest='0' ELSE '0'; -- c_rd_latency = 1 + mac_mosi_wrdata <= mac_mosi.wrdata(c_word_w-1 DOWNTO 0); + mac_miso_rddata <= mac_miso.rddata(c_word_w-1 DOWNTO 0); + mac_miso_rdval <= '1' WHEN mac_mosi.rd='1' AND mac_miso.waitrequest='0' ELSE '0'; -- c_rd_latency = 1 tx_sosi_data <= tx_sosi.data(c_tech_mac_10g_data_w-1 DOWNTO 0); rx_sosi_data <= rx_sosi.data(c_tech_mac_10g_data_w-1 DOWNTO 0); @@ -187,8 +189,8 @@ BEGIN mm_clk => mm_clk, mm_rst => mm_rst, mm_init => mm_init, - mm_mosi => mm_mosi, - mm_miso => mm_miso + mac_mosi => mac_mosi, + mac_miso => mac_miso ); -- Packet transmitter @@ -202,26 +204,19 @@ BEGIN PORT MAP ( mm_init => mm_init, total_header => total_header, - clk_156 => tb_tx_clk, + tx_clk => tb_tx_clk, tx_siso => tx_siso, tx_sosi => tx_sosi, link_fault => link_fault, tx_end => rx_end ); - -- Rewire DP to DP array type. - tx_sosi_arr(0) <= tx_sosi; - tx_siso <= tx_siso_arr(0); - - rx_siso_arr(0) <= rx_siso; - rx_sosi <= rx_sosi_arr(0); - -- Generate reference clocks gen_ref_clocks_xaui : IF g_technology=c_tech_stratixiv GENERATE tr_ref_clk_644 <= 'X'; tr_ref_clk_312 <= 'X'; tr_ref_clk_156 <= NOT tr_ref_clk_156 AFTER g_ref_clk_156_period/2; - tr_ref_rst_156 <= '0' AFTER g_ref_clk_156_period*5; + tr_ref_rst_156 <= '1', '0' AFTER g_ref_clk_156_period*5; END GENERATE; gen_ref_clocks_10gbase_r : IF g_technology=c_tech_arria10 GENERATE @@ -244,7 +239,7 @@ BEGIN u_tech_eth_10g_clocks : ENTITY work.tech_eth_10g_clocks GENERIC MAP ( g_technology => g_technology, - g_nof_channels => 1 + g_nof_channels => c_nof_channels ) PORT MAP ( -- Input clocks @@ -274,79 +269,86 @@ BEGIN eth_rx_rst_arr(0) => tb_rx_rst ); - no_dut : IF c_st_loopback=TRUE GENERATE + no_dut : IF g_no_dut=TRUE GENERATE + tx_rst_arr_out <= (OTHERS=>tr_ref_rst_156); + rx_clk_arr_out <= (OTHERS=>tr_ref_clk_156); + rx_rst_arr_out <= (OTHERS=>tr_ref_rst_156); + rx_sosi <= tx_sosi; tx_siso <= rx_siso; END GENERATE; - gen_dut : IF c_st_loopback=FALSE GENERATE + gen_dut : IF g_no_dut=FALSE GENERATE dut : ENTITY work.tech_eth_10g GENERIC MAP ( g_technology => g_technology, - g_sim => TRUE, + g_sim => c_sim, g_sim_level => g_sim_level, - g_nof_channels => 1, + g_nof_channels => c_nof_channels, g_link_status_check => g_link_status_check, g_pre_header_padding => TRUE ) PORT MAP ( -- Transceiver PLL reference clock - tr_ref_clk_644 => tb_ref_clk_644, - tr_ref_clk_312 => tb_ref_clk_312, - tr_ref_clk_156 => tb_ref_clk_156, - tr_ref_rst_156 => tb_ref_rst_156, + tr_ref_clk_644 => tb_ref_clk_644, + tr_ref_clk_312 => tb_ref_clk_312, + tr_ref_clk_156 => tb_ref_clk_156, + tr_ref_rst_156 => tb_ref_rst_156, + + -- Calibration & reconfig clock + cal_rec_clk => cal_clk, -- for XAUI -- MM - mm_clk => mm_clk, - mm_rst => mm_rst, + mm_clk => mm_clk, + mm_rst => mm_rst, - mac_mosi => mm_mosi, -- CSR = control status register - mac_miso => mm_miso, + mac_mosi => mac_mosi, -- CSR = control status register + mac_miso => mac_miso, -- XAUI clocks - tx_clk_arr_in(0) => tb_tx_clk, -- 156.25 MHz, externally connect tr_ref_clk_156 to tx_clk_arr or connect rx_clk_arr to tx_clk_arr - tx_rst_arr_out => tx_rst_arr_out, - rx_clk_arr_out => rx_clk_arr_out, - rx_clk_arr_in(0) => tb_rx_clk, -- externally connect to rx_clk_arr_out to avoid clock delta-delay - rx_rst_arr_out => rx_rst_arr_out, + tx_clk_arr_in(0) => tb_tx_clk, -- 156.25 MHz, externally connect tr_ref_clk_156 to tx_clk_arr or connect rx_clk_arr to tx_clk_arr + tx_rst_arr_out => tx_rst_arr_out, + rx_clk_arr_out => rx_clk_arr_out, + rx_clk_arr_in(0) => tb_rx_clk, -- externally connect to rx_clk_arr_out to avoid clock delta-delay + rx_rst_arr_out => rx_rst_arr_out, -- ST - tx_snk_in_arr => tx_sosi_arr, -- 64 bit data @ 156 tb_tx_clk - tx_snk_out_arr => tx_siso_arr, + tx_snk_in_arr(0) => tx_sosi, -- 64 bit data @ 156 tb_tx_clk + tx_snk_out_arr(0) => tx_siso, - rx_src_out_arr => rx_sosi_arr, -- 64 bit data @ 156 tb_rx_clk - rx_src_in_arr => rx_siso_arr, + rx_src_out_arr(0) => rx_sosi, -- 64 bit data @ 156 tb_rx_clk + rx_src_in_arr(0) => rx_siso, -- PHY serial IO -- . 10GBASE-R (single lane) - serial_tx_arr => serial_tx_arr, - serial_rx_arr => serial_rx_arr, + serial_tx_arr => serial_tx_arr, + serial_rx_arr => serial_rx_arr, -- . XAUI (four lanes) - xaui_tx_arr => xaui_tx_arr, - xaui_rx_arr => xaui_rx_arr + xaui_tx_arr => xaui_tx_arr, + xaui_rx_arr => xaui_rx_arr ); END GENERATE; u_link_connect : ENTITY tech_mac_10g_lib.tb_tech_mac_10g_link_connect GENERIC MAP ( - g_loopback => c_phy_loopback, -- default TRUE for loopback tx to rx, else use FALSE to connect tx-tx, rx-rx between two tb devices + g_loopback => c_phy_loopback, -- default TRUE for loopback tx to rx, else use FALSE to connect tx-tx, rx-rx between two tb devices g_link_delay => phy_delay ) PORT MAP ( - link_fault => link_fault, -- when '1' then forces rx_serial_arr(0)='0' + link_fault => link_fault, -- when '1' then forces rx_serial_arr(0)='0' -- 10GBASE-R serial layer connect - serial_tx_arr => serial_tx_arr, - serial_rx_arr => serial_rx_arr, -- connects to delayed tx_serial_arr(0) when g_loopback=TRUE else to rx_serial_in - serial_tx_out => serial_tx_out, -- connects to delayed tx_serial_arr(0) - serial_rx_in => serial_rx_in, -- used when g_loopback=FALSE + serial_tx => serial_tx_arr(0), + serial_rx => serial_rx_arr(0), -- connects to delayed tx_serial_arr(0) when g_loopback=TRUE else to rx_serial_in + serial_tx_out => serial_tx_out, -- connects to delayed tx_serial_arr(0) + serial_rx_in => serial_rx_in, -- used when g_loopback=FALSE -- XAUI serial layer connect - xaui_tx_arr => xaui_tx_arr, - xaui_rx_arr => xaui_rx_arr, -- connects to delayed xaui_tx_arr(0) when g_loopback=TRUE else to xaui_rx_in - xaui_tx_out => xaui_tx_out, -- connects to delayed xaui_tx_arr(0) - xaui_rx_in => xaui_rx_in -- used when g_loopback=FALSE + xaui_tx => xaui_tx_arr(0), + xaui_rx => xaui_rx_arr(0), -- connects to delayed xaui_tx_arr(0) when g_loopback=TRUE else to xaui_rx_in + xaui_tx_out => xaui_tx_out, -- connects to delayed xaui_tx_arr(0) + xaui_rx_in => xaui_rx_in -- used when g_loopback=FALSE ); -- Packet receiver @@ -357,7 +359,7 @@ BEGIN PORT MAP ( mm_init => mm_init, total_header => total_header, - clk_156 => tb_rx_clk, + rx_clk => tb_rx_clk, rx_sosi => rx_sosi, rx_siso => rx_siso, rx_toggle => rx_toggle @@ -366,28 +368,28 @@ BEGIN -- Verification u_verify_rx_at_eop : ENTITY tech_mac_10g_lib.tb_tech_mac_10_verify_rx_at_eop GENERIC MAP ( - g_no_padding => FALSE, + g_no_padding => g_no_dut, g_pkt_length_arr => c_pkt_length_arr ) PORT MAP ( - tx_clk_156 => tb_tx_clk, - tx_sosi => tx_sosi, - rx_clk_156 => tb_rx_clk, - rx_sosi => rx_sosi + tx_clk => tb_tx_clk, + tx_sosi => tx_sosi, + rx_clk => tb_rx_clk, + rx_sosi => rx_sosi ); u_verify_rx_pkt_cnt : ENTITY tech_mac_10g_lib.tb_tech_mac_10g_verify_rx_pkt_cnt GENERIC MAP ( - g_nof_pkt => c_nof_pkt + g_nof_pkt => c_nof_pkt ) PORT MAP ( - tx_clk_156 => tb_tx_clk, - tx_sosi => tx_sosi, - rx_clk_156 => tb_rx_clk, - rx_sosi => rx_sosi, - tx_pkt_cnt => tx_pkt_cnt, - rx_pkt_cnt => rx_pkt_cnt, - rx_end => rx_end + tx_clk => tb_tx_clk, + tx_sosi => tx_sosi, + rx_clk => tb_rx_clk, + rx_sosi => rx_sosi, + tx_pkt_cnt => tx_pkt_cnt, + rx_pkt_cnt => rx_pkt_cnt, + rx_end => rx_end ); p_tb_end : PROCESS -- GitLab