Commit ea24fca9 authored by Tristan Gingold's avatar Tristan Gingold

Add a testbench for the vmecore_test board.

parent 5128aee2
files = ["vme64x_sim_pkg.vhd"]
This diff is collapsed.
action = "simulation"
target = "xilinx"
sim_tool = "ghdl"
sim_top = "tb_vmecore_test"
vcom_opt = "-93 -mixedsvvh"
ghdl_opt = "-fsynopsys"
svec_template_ucf = []
syn_device = "xc6slx150t" # For rams.
board = "svec"
ctrls = ["bank4_64b_32b"]
# Allow the user to override fetchto using:
# hdlmake -p "fetchto='xxx'"
if locals().get('fetchto', None) is None:
fetchto = "../../ip_cores"
#include_dirs=[fetchto + "/vme64x-core/hdl/sim/vme64x_bfm",
# fetchto + "/general-cores/sim"]
files = [ "buildinfo_pkg.vhd", "tb_vmecore_test.vhd"]
modules = {
"local" : [
"../../sim/vhdl_sim",
"../../top/vmecore_test" ],
"git" : [
# "https://ohwr.org/project/wr-cores.git",
"https://ohwr.org/project/general-cores.git",
"https://ohwr.org/project/vme64x-core.git",
# "https://ohwr.org/project/ddr3-sp6-core.git",
],
}
# Do not fail during hdlmake fetch
try:
exec(open(fetchto + "/general-cores/tools/gen_buildinfo.py").read())
except:
pass
use std.textio.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.vme64x_pkg.all;
use work.vme64x_sim_pkg.all;
entity tb_vmecore_test is
end tb_vmecore_test;
architecture behav of tb_vmecore_test is
signal rst_n_i : std_logic;
signal clk_20m_vcxo_i : std_logic := '0';
signal vme_write_n_i : std_logic;
signal vme_sysreset_n_i : std_logic;
signal vme_retry_oe_o : std_logic;
signal vme_retry_n_o : std_logic;
signal vme_lword_n_b : std_logic;
signal vme_iackout_n_o : std_logic;
signal vme_iackin_n_i : std_logic;
signal vme_iack_n_i : std_logic;
signal vme_gap_i : std_logic;
signal vme_dtack_oe_o : std_logic;
signal vme_dtack_n_o : std_logic;
signal vme_ds_n_i : std_logic_vector(1 downto 0);
signal vme_data_oe_n_o : std_logic;
signal vme_data_dir_o : std_logic;
signal vme_berr_o : std_logic;
signal vme_as_n_i : std_logic;
signal vme_addr_oe_n_o : std_logic;
signal vme_addr_dir_o : std_logic;
signal vme_irq_o : std_logic_vector(7 downto 1);
signal vme_ga_i : std_logic_vector(4 downto 0);
signal vme_data_b : std_logic_vector(31 downto 0);
signal vme_am_i : std_logic_vector(5 downto 0);
signal vme_addr_b : std_logic_vector(31 downto 1);
signal pcbrev_i : std_logic_vector(4 downto 0);
signal fp_led_line_oen_o : std_logic_vector(1 downto 0);
signal fp_led_line_o : std_logic_vector(1 downto 0);
signal fp_led_column_o : std_logic_vector(3 downto 0);
signal fp_gpio1_b : std_logic;
signal fp_gpio2_b : std_logic;
signal fp_gpio3_b : std_logic;
signal fp_gpio4_b : std_logic;
signal fp_term_en_o : std_logic_vector(4 downto 1);
signal fp_gpio1_a2b_o : std_logic;
signal fp_gpio2_a2b_o : std_logic;
signal fp_gpio34_a2b_o : std_logic;
signal vme_in : t_vme64x_in;
signal vme_out : t_vme64x_out;
signal vme_timeout : boolean := false;
signal stop : boolean := false;
begin
-- Clock.
process
begin
clk_20m_vcxo_i <= '0';
wait for 25 ns;
clk_20m_vcxo_i <= '1';
wait for 25 ns;
if stop then
wait;
end if;
end process;
process
is
procedure dump32 (base : natural; nword : natural)
is
variable addr : std_logic_vector (31 downto 0);
variable d32 : lword_t;
begin
for i in 0 to nword - 1 loop
addr := std_logic_vector(to_unsigned(base + i * 4, 32));
read32 (vme_in, vme_out, vme_timeout, x"00_10_00_00" or addr,
c_AM_A24, d32);
write(output, hex(addr) & ": " & hex(d32) & LF);
end loop;
end dump32;
variable d8 : byte_t;
variable d16 : word_t;
variable d32 : lword_t;
begin
-- Each scenario starts with a reset.
-- VME reset
report "VME reset";
vme_in.ga <= '1' & slave_ga;
rst_n_i <= '0';
VME_in.RST_n <= '0';
VME_in.AS_n <= '1';
VME_in.ADDR <= (others => '1');
VME_in.AM <= (others => '1');
VME_in.DS_n <= "11";
VME_in.iackin_n <= '1';
wait for 40 ns;
VME_in.RST_n <= '1';
rst_n_i <= '1';
wait for 40 ns;
report "Set ADER";
-- Set ADER
write8_conf (vme_in, vme_out, vme_timeout, x"7_ff77", x"10");
write8_conf (vme_in, vme_out, vme_timeout, x"7_ff7f", c_AM_A24 & "00");
read8_conf (vme_in, vme_out, vme_timeout, x"7_ff77", d8);
assert d8 = x"10" report "bad ADER0 value" severity error;
report "Set ENable";
-- Enable card
write8_conf (vme_in, vme_out, vme_timeout, x"7_fffb", b"0001_0000");
read8_conf (vme_in, vme_out, vme_timeout, x"7_fffb", d8);
assert d8 = b"0001_0000" report "module must be enabled"
severity error;
report "read data: " & hex (d8);
-- dump_CR (vme_in, vme_out, vme_timeout);
report "Dump patterns";
dump32 (16#c000#, 4);
if false then
report "VME CR";
dump_CR (vme_in, vme_out, vme_timeout);
end if;
report "done";
stop <= true;
wait;
end process;
vme_data_b <= vme_in.data when not (vme_out.data_oe_n = '0'
and vme_out.data_dir = '1')
else (others => 'H');
vme_out.data <= vme_data_b;
vme_addr_b <= vme_in.addr when not (vme_out.addr_oe_n = '0'
and vme_out.addr_dir = '1')
else (others => 'H');
vme_out.addr <= vme_addr_b;
vme_lword_n_b <= vme_in.lword_n when not (vme_out.addr_oe_n = '0'
and vme_out.addr_dir = '1')
else 'H';
vme_out.lword_n <= vme_lword_n_b;
-- ga is inverted.
vme_ga_i <= not vme_in.ga (4 downto 0);
vme_gap_i <= vme_in.ga(5);
vme_out.berr_n <= not vme_berr_o;
dut: entity work.svec_vmecore_test_top
generic map (
g_SIMULATION => True
)
port map (
rst_n_i => rst_n_i,
clk_20m_vcxo_i => clk_20m_vcxo_i,
vme_gap_i => vme_gap_i,
vme_ga_i => vme_ga_i,
vme_as_n_i => vme_in.as_n,
vme_sysreset_n_i => vme_in.rst_n,
vme_write_n_i => vme_in.write_n,
vme_am_i => vme_in.am,
vme_ds_n_i => vme_in.ds_n,
vme_iack_n_i => vme_in.iack_n,
vme_iackin_n_i => vme_in.iackin_n,
vme_iackout_n_o => vme_out.iackout_n,
vme_dtack_n_o => vme_out.dtack_n,
vme_dtack_oe_o => vme_out.dtack_oe,
vme_data_dir_o => vme_out.data_dir,
vme_data_oe_n_o => vme_out.data_oe_n,
vme_addr_dir_o => vme_out.addr_dir,
vme_addr_oe_n_o => vme_out.addr_oe_n,
vme_retry_n_o => vme_out.retry_n,
vme_retry_oe_o => vme_out.retry_oe,
vme_berr_o => vme_berr_o,
vme_irq_o => vme_irq_o,
vme_lword_n_b => vme_lword_n_b,
vme_data_b => vme_data_b,
vme_addr_b => vme_addr_b,
fp_led_line_oen_o => fp_led_line_oen_o,
fp_led_line_o => fp_led_line_o,
fp_led_column_o => fp_led_column_o);
end behav;
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
-- Author(s) : Tristan Gingold <tristan.gingold@cern.ch> -- Author(s) : Tristan Gingold <tristan.gingold@cern.ch>
-- Company : CERN (BE-CO-HT) -- Company : CERN (BE-CO-HT)
-- Created : 2017-09-19 -- Created : 2017-09-19
-- Last update: 2020-03-12 -- Last update: 2020-05-29
-- Standard : VHDL'93 -- Standard : VHDL'93
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Description: Top-level file for the test design . -- Description: Top-level file for the test design .
...@@ -48,6 +48,9 @@ library unisim; ...@@ -48,6 +48,9 @@ library unisim;
use unisim.vcomponents.all; use unisim.vcomponents.all;
entity svec_vmecore_test_top is entity svec_vmecore_test_top is
generic (
g_SIMULATION : boolean := False
);
port ( port (
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
-- Clocks/resets -- Clocks/resets
...@@ -199,80 +202,94 @@ architecture top of svec_vmecore_test_top is ...@@ -199,80 +202,94 @@ architecture top of svec_vmecore_test_top is
signal sys_locked : std_logic; signal sys_locked : std_logic;
begin -- architecture top begin -- architecture top
p_powerup_reset : process(clk_sys) gen_pll: if not g_SIMULATION generate
begin p_powerup_reset : process(clk_sys)
if rising_edge(clk_sys) then begin
if(vme_sysreset_n_i = '0' or rst_n_i = '0') then if rising_edge(clk_sys) then
powerup_rst_n <= '0'; if(vme_sysreset_n_i = '0' or rst_n_i = '0') then
elsif sys_locked = '1' then powerup_rst_n <= '0';
if(powerup_reset_cnt = "11111111") then elsif sys_locked = '1' then
powerup_rst_n <= '1'; if(powerup_reset_cnt = "11111111") then
powerup_rst_n <= '1';
else
powerup_rst_n <= '0';
powerup_reset_cnt <= powerup_reset_cnt + 1;
end if;
else else
powerup_rst_n <= '0'; powerup_rst_n <= '0';
powerup_reset_cnt <= powerup_reset_cnt + 1; powerup_reset_cnt <= "00000000";
end if; end if;
else
powerup_rst_n <= '0';
powerup_reset_cnt <= "00000000";
end if; end if;
end if; end process;
end process;
--------------------------------------------------------------------------
------------------------------------------------------------------------------- -- Clock distribution/PLL and reset
-- Clock distribution/PLL and reset --------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Input is 20Mhz
-- Input is 20Mhz U_cmp_sys_pll : PLL_BASE
U_cmp_sys_pll : PLL_BASE generic map (
generic map ( BANDWIDTH => "OPTIMIZED",
BANDWIDTH => "OPTIMIZED", CLK_FEEDBACK => "CLKFBOUT",
CLK_FEEDBACK => "CLKFBOUT", COMPENSATION => "INTERNAL",
COMPENSATION => "INTERNAL", DIVCLK_DIVIDE => 1,
DIVCLK_DIVIDE => 1, CLKFBOUT_MULT => 50, -- 1Ghz
CLKFBOUT_MULT => 50, -- 1Ghz CLKFBOUT_PHASE => 0.000,
CLKFBOUT_PHASE => 0.000, CLKOUT0_DIVIDE => 8, -- 2*62.5 MHz
CLKOUT0_DIVIDE => 8, -- 2*62.5 MHz CLKOUT0_PHASE => 0.000,
CLKOUT0_PHASE => 0.000, CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT0_DUTY_CYCLE => 0.500, CLKOUT1_DIVIDE => 8, -- 2*62.5 MHz
CLKOUT1_DIVIDE => 8, -- 2*62.5 MHz CLKOUT1_PHASE => 0.000,
CLKOUT1_PHASE => 0.000, CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT1_DUTY_CYCLE => 0.500, CLKOUT2_DIVIDE => 8,
CLKOUT2_DIVIDE => 8, CLKOUT2_PHASE => 0.000,
CLKOUT2_PHASE => 0.000, CLKOUT2_DUTY_CYCLE => 0.500,
CLKOUT2_DUTY_CYCLE => 0.500, CLKIN_PERIOD => 50.0,
CLKIN_PERIOD => 50.0, REF_JITTER => 0.016)
REF_JITTER => 0.016) port map (
port map ( CLKFBOUT => pllout_clk_fb_sys,
CLKFBOUT => pllout_clk_fb_sys, CLKOUT0 => pllout_clk_sys,
CLKOUT0 => pllout_clk_sys, CLKOUT1 => open, -- pllout_clk_sys,
CLKOUT1 => open, -- pllout_clk_sys, CLKOUT2 => open,
CLKOUT2 => open, CLKOUT3 => open,
CLKOUT3 => open, CLKOUT4 => open,
CLKOUT4 => open, CLKOUT5 => open,
CLKOUT5 => open, LOCKED => sys_locked,
LOCKED => sys_locked, RST => '0',
RST => '0', CLKFBIN => pllout_clk_fb_sys,
CLKFBIN => pllout_clk_fb_sys, CLKIN => clk_20m_vcxo_buf);
CLKIN => clk_20m_vcxo_buf);
U_Sync_Reset : gc_sync_ffs
U_Sync_Reset : gc_sync_ffs port map (
port map ( clk_i => clk_sys,
clk_i => clk_sys, rst_n_i => '1',
rst_n_i => '1', data_i => powerup_rst_n,
data_i => powerup_rst_n, synced_o => local_reset_n);
synced_o => local_reset_n);
U_cmp_clk_vcxo_buf : BUFG
U_cmp_clk_vcxo_buf : BUFG port map (
port map ( O => clk_20m_vcxo_buf,
O => clk_20m_vcxo_buf, I => clk_20m_vcxo_i);
I => clk_20m_vcxo_i);
U_cmp_clk_sys_buf : BUFG
U_cmp_clk_sys_buf : BUFG port map (
port map ( O => clk_sys,
O => clk_sys, I => pllout_clk_sys);
I => pllout_clk_sys); end generate;
gen_nopll: if g_SIMULATION generate
process
begin
clk_sys <= '0';
wait for 8 ns;
clk_sys <= '1';
wait for 8 ns;
end process;
local_reset_n <= '0', '1' after 16 ns;
end generate;
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- VME64x Core and buffers -- VME64x Core and buffers
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment