diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd index cc324b02be20e218e80fb36a349df2316361e4d6..de95f06df8c346c6d4cad59940d90493abf1f8fb 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd @@ -41,11 +41,11 @@ USE dp_lib.dp_stream_pkg.ALL; ENTITY ddrctrl_address_counter IS GENERIC ( - g_tech_ddr : t_c_tech_ddr; + g_tech_ddr : t_c_tech_ddr; g_sim_model : BOOLEAN := TRUE ); PORT ( - clk : IN STD_LOGIC; + clk : IN STD_LOGIC; rst : IN STD_LOGIC; in_sosi : IN t_dp_sosi; out_mosi : OUT t_mem_ctlr_mosi @@ -55,11 +55,11 @@ END ddrctrl_address_counter; ARCHITECTURE rtl OF ddrctrl_address_counter IS - CONSTANT c_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr ); --576 - CONSTANT c_adr_w : NATURAL := sel_a_b(g_sim_model, 4, func_tech_ddr_ctlr_address_w( g_tech_ddr )); --27; - CONSTANT c_max_adr: NATURAL := 2**(c_adr_w) - 1; + CONSTANT c_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr ); --576 + CONSTANT c_adr_w : NATURAL := sel_a_b(g_sim_model, 4, func_tech_ddr_ctlr_address_w( g_tech_ddr )); --27; + CONSTANT c_max_adr : NATURAL := 2**(c_adr_w) - 1; - SIGNAL s_adr : NATURAL range 0 to 2**(c_adr_w)-1 := 0; + SIGNAL s_adr : NATURAL range 0 to 2**(c_adr_w)-1 := 0; BEGIN diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd index 1e6105a8f9db8f07013b01e0f3ebb29e2a7ac522..079a5d2144326a747c5536b0f0cca957143bc438 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd @@ -61,11 +61,15 @@ ARCHITECTURE tb OF tb_ddrctrl_address_counter IS BEGIN - in_sosi.data(c_data_w - 1 DOWNTO 0) <= in_data(c_data_w - 1 DOWNTO 0); - in_sosi.valid <= in_data_enable; - + -- if these ASSERT's get uncommented u can see that modelsim does take a few itteration before the warning gets asserted. These asserts are also present in p_verify + --ASSERT in_sosi.data(c_data_w - 1 DOWNTO 0) = out_mosi.wrdata(c_data_w - 1 DOWNTO 0) REPORT "in_sosi.data does not match out_mosi.wrdata" SEVERITY ERROR; -- gives error if in_sosi and out_mosi do not match + --ASSERT in_sosi.valid = out_mosi.wr REPORT "in_sosi.valid does not match out_mosi.wr" SEVERITY ERROR; + --ASSERT in_sosi.data(c_data_w - 1 DOWNTO 0) /= out_mosi.wrdata(c_data_w - 1 DOWNTO 0) REPORT "in_sosi.data does match out_mosi.wrdata" SEVERITY WARNING; -- gives warning if in_sosi and out_mosi do match + --ASSERT in_sosi.valid /= out_mosi.wr REPORT "in_sosi.valid does match out_mosi.wr" SEVERITY WARNING; + in_sosi.data(c_data_w - 1 DOWNTO 0) <= in_data(c_data_w - 1 DOWNTO 0); + in_sosi.valid <= in_data_enable; clk <= NOT clk OR tb_end AFTER c_clk_period/2; @@ -81,15 +85,12 @@ BEGIN WAIT UNTIL rising_edge(clk); -- align to rising edge WAIT FOR c_clk_period*10; - ASSERT in_sosi.data(c_data_w - 1 DOWNTO 0) = out_mosi.wrdata(c_data_w - 1 DOWNTO 0) REPORT "Wrong wrdata 1" SEVERITY ERROR; - ASSERT in_sosi.valid = out_mosi.wr REPORT "Wrong wr 1" SEVERITY ERROR; - FOR I IN 0 TO 6 LOOP - in_data_enable <= '1'; - in_data <= NOT in_data; - ASSERT I = TO_UINT(out_mosi.address) REPORT "Wrong address 1" SEVERITY ERROR; + in_data_enable <= '1'; + in_data <= NOT in_data; + ASSERT I = TO_UINT(out_mosi.address) REPORT "Wrong address, I = " & NATURAL'image(I) SEVERITY ERROR; WAIT FOR c_clk_period*1; - in_data_enable <= '0'; + in_data_enable <= '0'; WAIT FOR c_clk_period*2; END LOOP; @@ -100,19 +101,30 @@ BEGIN WAIT FOR c_clk_period*1; FOR I IN 0 TO 20 LOOP - ASSERT I = TO_UINT(out_mosi.address) OR I - c_max_adr = TO_UINT(out_mosi.address) REPORT "Wrong address, I = " & NATURAL'image(I) SEVERITY ERROR; - in_data_enable <= '1'; - in_data <= NOT in_data; + ASSERT I = TO_UINT(out_mosi.address) OR I - c_max_adr = TO_UINT(out_mosi.address) REPORT "Wrong address, I = " & NATURAL'image(I) SEVERITY ERROR; + in_data_enable <= '1'; + in_data <= NOT in_data; WAIT FOR c_clk_period*1; - in_data_enable <= '0'; + in_data_enable <= '0'; WAIT FOR c_clk_period*2; END LOOP; WAIT FOR c_clk_period*20; - tb_end <= '1'; - + tb_end <= '1'; WAIT; + + END PROCESS; + + p_verify : PROCESS + BEGIN + WAIT UNTIL rising_edge(clk); + IF rising_edge(clk) THEN + ASSERT in_sosi.data(c_data_w - 1 DOWNTO 0) = out_mosi.wrdata(c_data_w - 1 DOWNTO 0) REPORT "in_sosi.data does not match out_mosi.wrdata" SEVERITY ERROR; -- gives error if in_sosi and out_mosi do not match + ASSERT in_sosi.valid = out_mosi.wr REPORT "in_sosi.valid does not match out_mosi.wr" SEVERITY ERROR; + --ASSERT in_sosi.data(c_data_w - 1 DOWNTO 0) /= out_mosi.wrdata(c_data_w - 1 DOWNTO 0) REPORT "in_sosi.data does match out_mosi.wrdata" SEVERITY WARNING; -- gives warning if in_sosi and out_mosi do match + --ASSERT in_sosi.valid /= out_mosi.wr REPORT "in_sosi.valid does match out_mosi.wr" SEVERITY WARNING; + END IF; END PROCESS; u_address_counter : ENTITY work.ddrctrl_address_counter