]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - tb/tb_mcc_master.vhd
7b99fb1215cce7b2469d5260b46ae2772d0f01e9
[fpga/pwm.git] / tb / tb_mcc_master.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
5
6 entity tb_mcc_master is
7 end tb_mcc_master;
8
9 --------------------------------------------------------------------------------
10
11 architecture testbench of tb_mcc_master is
12
13   constant period : time := 1 us;
14   constant offset : time := 0 us;
15
16   constant LUT_DAT_W     : integer := 10;
17   constant LUT_ADR_W     : integer := 9;
18   constant LUT_INIT_FILE : string  := "../sin.lut";
19   constant IRF_ADR_W     : integer := 5;
20
21   constant WAVE_SIZE : integer := 2**LUT_ADR_W;
22   
23
24   signal ACK_O : std_logic;
25   signal CLK_I : std_logic;
26   signal RST_I : std_logic;
27   signal STB_I : std_logic;
28
29   signal IRF_ACK_I : std_logic;
30   signal IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
31   signal IRF_CYC_O : std_logic;
32   signal IRF_DAT_I : std_logic_vector (15 downto 0);
33   signal IRF_DAT_O : std_logic_vector (15 downto 0);
34   signal IRF_STB_O : std_logic;
35   signal IRF_WE_O  : std_logic;
36
37   signal LUT_ADR_O : std_logic_vector (LUT_ADR_W-1 downto 0);
38   signal LUT_DAT_I : std_logic_vector (LUT_DAT_W-1 downto 0);
39   signal LUT_STB_O : std_logic;
40
41   signal MCC_ACK      : std_logic_vector (3 downto 0);
42   signal MCC_STB      : std_logic_vector (3 downto 0);
43   signal MCC_MUX_CODE : std_logic_vector (1 downto 0);
44   signal MCC_MUX_EN   : std_logic;
45
46
47   signal MASTER_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
48   signal MASTER_IRF_DAT_O : std_logic_vector (15 downto 0);
49   signal MASTER_IRF_STB_O : std_logic;
50   signal MASTER_IRF_WE_O  : std_logic;
51
52   signal VECTOR_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
53   signal VECTOR_IRF_DAT_O : std_logic_vector (15 downto 0);
54   signal VECTOR_IRF_STB_O : std_logic;
55   signal VECTOR_IRF_WE_O  : std_logic;
56
57   
58   subtype word_t is std_logic_vector (15 downto 0);
59   
60   signal dbg_mem0 : word_t    := "0000000000000010";  -- read only by UUT
61   signal dbg_mem1 : word_t    := (others => '0');     -- read only by vector_gen
62   signal dbg_mem2 : word_t    := (others => '0');
63   signal dbg_mem3 : word_t    := (others => '0');
64   signal dbg_mem4 : word_t    := (others => '0');
65   signal dbg_ack  : std_logic := '0';
66
67 --------------------------------------------------------------------------------
68
69 begin
70
71   IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
72                VECTOR_IRF_ADR_O when MCC_MUX_CODE = 1 else
73                (others => '-');
74
75   IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
76                VECTOR_IRF_DAT_O when MCC_MUX_CODE = 1 else
77                (others => '-');
78
79   IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
80                VECTOR_IRF_STB_O when MCC_MUX_CODE = 1 else
81                '0';
82
83   IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
84               VECTOR_IRF_WE_O when MCC_MUX_CODE = 1 else
85               '0';
86
87   
88   uut : entity work.mcc_master
89     generic map (
90       MCC_W     => 4,
91       MUX_W     => 2,
92       IRF_ADR_W => IRF_ADR_W)
93     port map (
94       ACK_O        => ACK_O,
95       CLK_I        => CLK_I,
96       RST_I        => RST_I,
97       STB_I        => STB_I,
98       MCC_STB_O    => MCC_STB,
99       MCC_ACK_I    => MCC_ACK,
100       MCC_MUX_CODE => MCC_MUX_CODE,
101       MCC_MUX_EN   => MCC_MUX_EN,
102       IRF_ACK_I    => IRF_ACK_I,
103       IRF_ADR_O    => MASTER_IRF_ADR_O,
104       IRF_DAT_I    => IRF_DAT_I,
105       IRF_DAT_O    => MASTER_IRF_DAT_O,
106       IRF_STB_O    => MASTER_IRF_STB_O,
107       IRF_WE_O     => MASTER_IRF_WE_O);
108
109   vector_gen_1 : entity work.vector_gen
110     generic map (
111       A_BASE => 1,
112       P_BASE => 2)
113     port map (
114       ACK_O     => MCC_ACK (1),
115       CLK_I     => CLK_I,
116       RST_I     => RST_I,
117       STB_I     => MCC_STB (1),
118       IRF_ACK_I => IRF_ACK_I,
119       IRF_ADR_O => VECTOR_IRF_ADR_O,
120       IRF_CYC_O => open,
121       IRF_DAT_I => IRF_DAT_I,
122       IRF_DAT_O => VECTOR_IRF_DAT_O,
123       IRF_STB_O => VECTOR_IRF_STB_O,
124       IRF_WE_O  => VECTOR_IRF_WE_O,
125       LUT_ADR_O => LUT_ADR_O,
126       LUT_DAT_I => LUT_DAT_I,
127       LUT_STB_O => LUT_STB_O);
128
129   wave_table_1 : entity work.wave_table
130     generic map (
131       DAT_W     => LUT_DAT_W,
132       ADR_W     => LUT_ADR_W,
133       INIT_FILE => LUT_INIT_FILE)
134     port map (
135       ACK_O => open,
136       ADR_I => LUT_ADR_O,
137       CLK_I => CLK_I,
138       DAT_I => (others => '0'),
139       DAT_O => LUT_DAT_I,
140       STB_I => LUT_STB_O,
141       WE_I  => '0');
142   
143   
144   SYSCON_CLK : process is
145   begin
146     CLK_I <= '0';
147     wait for offset;
148     loop
149       CLK_I <= '1';
150       wait for period/2;
151       CLK_I <= '0';
152       wait for period/2;
153     end loop;
154   end process;
155
156   SYSCON_RST : process is
157   begin
158     RST_I <= '0';
159     wait for offset;
160     wait for 0.75*period;
161     RST_I <= '1';
162     wait for 2*period;
163     RST_I <= '0';
164     wait;
165   end process;
166
167   
168   DBG_MEM : process (IRF_STB_O, CLK_I) is
169   begin
170     IRF_ACK_I <= IRF_STB_O and (IRF_WE_O or dbg_ack);
171
172     if rising_edge(CLK_I) then
173       dbg_ack <= IRF_STB_O;
174     end if;
175
176     if rising_edge(CLK_I) and IRF_STB_O = '1' then
177       if IRF_WE_O = '0' then
178         case conv_integer(IRF_ADR_O) is
179           when 0 => IRF_DAT_I <= dbg_mem0;
180           when 1 => IRF_DAT_I <= dbg_mem1;
181           when 2 => IRF_DAT_I <= dbg_mem2;
182           when 3 => IRF_DAT_I <= dbg_mem3;
183           when 4 => IRF_DAT_I <= dbg_mem4;
184           when others => IRF_DAT_I <= (others => '0');
185         end case;
186       else
187         case conv_integer(IRF_ADR_O) is
188           when 1 => dbg_mem1 <= IRF_DAT_O;
189           when 2 => dbg_mem2 <= IRF_DAT_O;
190           when 3 => dbg_mem3 <= IRF_DAT_O;
191           when 4 => dbg_mem4 <= IRF_DAT_O;
192           when others => null;
193         end case;
194       end if;
195     end if;
196   end process;
197   
198 --------------------------------------------------------------------------------
199
200   UUT_FEED : process is
201   begin
202     STB_I <= '0';
203         
204     wait for offset;
205     wait for 4*period;
206
207     for i in 0 to 1 loop
208       --dbg_mem0 <= (others => '0');
209       --dbg_mem0(LUT_ADR_O'RANGE) <= conv_std_logic_vector(i, LUT_ADR_W);
210       
211       STB_I <= '1';
212       wait until rising_edge(CLK_I) and ACK_O = '1';
213       STB_I <= '0';
214       wait for 4*period;
215     end loop;
216     
217     wait;
218   end process;
219   
220 end testbench;
221