diff --git a/libraries/base/mm/tb/vhdl/mm_waitrequest_model.vhd b/libraries/base/mm/tb/vhdl/mm_waitrequest_model.vhd index b0fced8b0f9a7ac930bbcca68b77892bcfaac715..fc530c0b9df5c8c0868441ba17b9344e333c7c29 100644 --- a/libraries/base/mm/tb/vhdl/mm_waitrequest_model.vhd +++ b/libraries/base/mm/tb/vhdl/mm_waitrequest_model.vhd @@ -42,6 +42,8 @@ -- . '1' for g_prsg_w mm_clk cycles -- . '0' for g_prsg_w-1 mm_clk cycles -- Remarks: +-- . To some extend the ASSERTs check the flow control. The testbench has to +-- verify the rddata to ensure more test coverage. -- ------------------------------------------------------------------------------- @@ -72,10 +74,12 @@ ARCHITECTURE rtl OF mm_waitrequest_model IS CONSTANT c_prsg_init : NATURAL := g_seed + 1; -- PRSG init must be > 0 SIGNAL prsg : STD_LOGIC_VECTOR(g_prsg_w-1 DOWNTO 0) := TO_UVEC(c_prsg_init, g_prsg_w); - SIGNAL nxt_prsg : STD_LOGIC_VECTOR(g_prsg_w-1 DOWNTO 0); SIGNAL waitrequest : STD_LOGIC; + SIGNAL prev_bus_mosi : t_mem_mosi; + SIGNAL prev_waitrequest : STD_LOGIC; + BEGIN no_waitrequest : IF g_waitrequest=FALSE GENERATE @@ -93,7 +97,11 @@ BEGIN p_reg : PROCESS(mm_clk) BEGIN IF rising_edge(mm_clk) THEN - prsg <= func_common_random(prsg); + -- random waitrequest flow control + prsg <= func_common_random(prsg); + -- check MM access + prev_bus_mosi <= bus_mosi; + prev_waitrequest <= waitrequest; END IF; END PROCESS; @@ -114,6 +122,17 @@ BEGIN slave_mosi.rd <= bus_mosi.rd AND NOT waitrequest; END PROCESS; + -- Verify that MM access is not removed before it is acknowledged by waitrequest + p_verify : PROCESS(bus_mosi, prev_bus_mosi, prev_waitrequest) + BEGIN + IF prev_waitrequest = '1' THEN + IF prev_bus_mosi.wr = '1' AND bus_mosi.wr = '0' THEN REPORT "Aborted slave write." SEVERITY ERROR; END IF; + IF prev_bus_mosi.rd = '1' AND bus_mosi.rd = '0' THEN REPORT "Aborted slave read." SEVERITY ERROR; END IF; + IF prev_bus_mosi.wr = '1' AND bus_mosi.address /= prev_bus_mosi.address THEN REPORT "Address change during pending slave write." SEVERITY ERROR; END IF; + IF prev_bus_mosi.rd = '1' AND bus_mosi.address /= prev_bus_mosi.address THEN REPORT "Address change during pending slave read." SEVERITY ERROR; END IF; + END IF; + END PROCESS; + END GENERATE; END rtl;