📄 mem_test.vhd
字号:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE IEEE.numeric_std.ALL;-- use packageUSE work.procmem_definitions.ALL;-------------------------------------------------------------------------------ENTITY t_memory ISEND t_memory;-------------------------------------------------------------------------------ARCHITECTURE tbench OF t_memory ISCOMPONENT memory ISPORT (clk : IN STD_ULOGIC;rst_n : IN STD_ULOGIC;MemRead : IN STD_ULOGIC;MemWrite : IN STD_ULOGIC;mem_address : IN STD_ULOGIC_VECTOR(width-1 DOWNTO 0);data_in : IN STD_ULOGIC_VECTOR(width-1 DOWNTO 0);data_out : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0) );END COMPONENT;-- component portsSIGNAL clk : STD_ULOGIC;SIGNAL rst_n : STD_ULOGIC;SIGNAL MemRead : STD_ULOGIC;SIGNAL MemWrite : STD_ULOGIC;SIGNAL mem_address : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);SIGNAL data_in : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);SIGNAL data_out : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);-- definition of a clock periodCONSTANT period : time := 10 ns;-- switch for clock generatorSIGNAL clken_p : boolean := true;-- STD_ULOGIC_VECTOR TO STRINGFUNCTION TO_string(arg : std_ulogic_vector) RETURN string ISALIAS u : STD_ULOGIC_VECTOR(arg'length DOWNTO 1) IS arg;VARIABLE result : string(arg'length DOWNTO 1);BEGINFOR i IN u'range LOOPCASE u(i) ISWHEN 'U' => result(i) := 'U';WHEN 'X' => result(i) := 'X';WHEN '0' => result(i) := '0';WHEN '1' => result(i) := '1';WHEN 'Z' => result(i) := 'Z';WHEN 'W' => result(i) := 'W';WHEN 'L' => result(i) := 'L';WHEN 'H' => result(i) := 'H';WHEN '-' => result(i) := '-';END CASE;END LOOP;RETURN result;END TO_string;-- UNSIGNED TO STRINGFUNCTION TO_string(arg : unsigned) RETURN string ISALIAS u : unsigned(arg'length DOWNTO 1) IS arg;VARIABLE result : string(arg'length DOWNTO 1);BEGINFOR i IN u'range LOOPCASE u(i) ISWHEN 'U' => result(i) := 'U';WHEN 'X' => result(i) := 'X';WHEN '0' => result(i) := '0';WHEN '1' => result(i) := '1';WHEN 'Z' => result(i) := 'Z';WHEN 'W' => result(i) := 'W';WHEN 'L' => result(i) := 'L';WHEN 'H' => result(i) := 'H';WHEN '-' => result(i) := '-';END CASE;END LOOP;RETURN result;END TO_string;BEGIN -- tbench-- component instantiationDUT: memoryPORT MAP (clk => clk,rst_n => rst_n,MemRead => MemRead,MemWrite => MemWrite,mem_address => mem_address,data_in => data_in,data_out => data_out );-- clock generationclock_proc : PROCESSBEGINWHILE clken_p LOOPclk <= '0'; WAIT FOR period/2;clk <= '1'; WAIT FOR period/2;END LOOP;WAIT;END PROCESS;-- reset generationreset : rst_n <= '0', '1' AFTER period;-- waveform generationWaveGen_Proc : PROCESSVARIABLE mem_temp : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);TYPE array_vector IS ARRAY (0 TO 5) OFSTD_ULOGIC_VECTOR(width-1 DOWNTO 0);VARIABLE addr_pattern : array_vector;VARIABLE data_pattern : array_vector;BEGIN-- initializationMemRead <= '1';MemWrite <= '0';mem_address <= (OTHERS => '0');-- addr_patternaddr_pattern := ( -- block: 3, 2, 1, 0x"00000000", -- use correct word addressx"00000004",x"00000008",x"0000000C",x"00000010",x"00000014");data_pattern := ( -- data arises every bytex"01020304",x"05060708",x"090A0B0C",x"0D0E0F10",x"11121314",x"15161718");-- resetWAIT FOR period;-- write pattern to memMemRead <= '0';MemWrite <= '1';FOR i in data_pattern'RANGE LOOPdata_in <= data_pattern(i);mem_address <= addr_pattern(i);WAIT FOR period;END LOOP;-- read memory and compare with patternMemRead <= '1';MemWrite <= '0';FOR k in data_pattern'RANGE LOOPmem_address <= addr_pattern(k);WAIT FOR period;ASSERT data_out = data_pattern(k)REPORT "p.no. " & TO_STRING(TO_UNSIGNED(k, data_pattern'LENGTH-1)) & lf& "act. address: " & lf & TO_STRING(mem_address) & lf& "actual value: " & lf & TO_STRING(data_out) & lf& "expected value: " & lf & TO_STRING(data_pattern(k))SEVERITY note;END LOOP;WAIT FOR period;clken_p <= false;WAIT;END PROCESS WaveGen_Proc;END tbench;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -