OpenCores
URL https://opencores.org/ocsvn/rise/rise/trunk

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [tb_ex_stage_unit.vhd] - Blame information for rev 8

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 jlechner
-------------------------------------------------------------------------------
2
-- File: ex_stage.vhd
3
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
4
-- Created: 2006-11-29
5
-- Last updated: 2006-11-29
6
 
7
-- Description:
8
-- Execute stage
9
-------------------------------------------------------------------------------
10
 
11
library ieee;
12
use ieee.std_logic_1164.all;
13
use ieee.std_logic_signed.all;
14
use ieee.numeric_std.all;
15
use IEEE.STD_LOGIC_ARITH.all;
16
use work.rise_pack.all;
17
 
18
entity tb_ex_stage_unit_vhd is
19
end tb_ex_stage_unit_vhd;
20
 
21
architecture behavior of tb_ex_stage_unit_vhd is
22
 
23
  -- component Declaration for the Unit Under Test (UUT)
24
  component ex_stage is
25
 
26
                       port (
27
                         clk                 : in std_logic;
28
                         reset               : in std_logic;
29
 
30
                         id_ex_register      : in ID_EX_REGISTER_T;
31
                         ex_mem_register     : out EX_MEM_REGISTER_T;
32
 
33
                         branch              : out std_logic;
34
                         stall_in            : in std_logic;
35
                         clear_in            : in std_logic;
36
                         clear_out           : out std_logic);
37
 
38
  end component;
39
 
40
  constant clk_period : time := 10 ns;
41
 
42
  --inputs
43
  signal clk            : std_logic := '0';
44
  signal reset          : std_logic := '0';
45
  signal id_ex_register : ID_EX_REGISTER_T;
46
 
47
  signal stall_in       : std_logic     := '0';
48
  signal clear_in       : std_logic     := '0';
49
 
50
  --Outputs
51
  signal ex_mem_register : EX_MEM_REGISTER_T;
52
  signal branch          : std_logic;
53
  signal clear_out       : std_logic;
54
 
55
begin
56
 
57
  -- instantiate the Unit Under Test (UUT)
58
  uut : ex_stage port map(
59
    clk            => clk,
60
    reset          => reset,
61
 
62
    id_ex_register   => id_ex_register,
63
    ex_mem_register  => ex_mem_register,
64
 
65
    branch           => branch,
66
    stall_in         => stall_in,
67
    clear_in         => clear_in,
68
    clear_out        => clear_out);
69
 
70
 
71
  cg : process
72
  begin
73
    clk <= '1';
74
    wait for clk_period/2;
75
    clk <= '0';
76
    wait for clk_period/2;
77
  end process;
78
 
79
  tb : process
80
  begin
81
    reset <= '0';
82
    wait for 10 * clk_period;
83
    reset <= '1';
84
 
85
 
86
    id_ex_register.sr <= (others => '0');
87
    id_ex_register.pc <= CONV_STD_LOGIC_VECTOR(3, PC_WIDTH);
88
    id_ex_register.opcode <= OPCODE_NOP;
89
    id_ex_register.cond <= COND_UNCONDITIONAL;
90
    id_ex_register.rX_addr <= CONV_STD_LOGIC_VECTOR(2, REGISTER_ADDR_WIDTH);
91
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(0, REGISTER_WIDTH);
92
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(0, REGISTER_WIDTH);
93
    id_ex_register.rZ <= CONV_STD_LOGIC_VECTOR(0, REGISTER_WIDTH);
94
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(0, IMMEDIATE_WIDTH);
95
 
96
 
97
    ---------------------------------------------------------------------------
98
    -- test computation results
99
    ---------------------------------------------------------------------------
100
    -- load/store
101
    wait for clk_period;
102
    id_ex_register.opcode <= OPCODE_LD_IMM;
103
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(1, REGISTER_WIDTH);
104
    wait for clk_period;
105
    id_ex_register.opcode <= OPCODE_LD_IMM_HB;
106
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(1, REGISTER_WIDTH);
107
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
108
    wait for clk_period;
109
    id_ex_register.opcode <= OPCODE_LD_DISP;
110
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
111
    id_ex_register.rZ <= CONV_STD_LOGIC_VECTOR(1, REGISTER_WIDTH);
112
    wait for clk_period;
113
    id_ex_register.opcode <= OPCODE_LD_DISP_MS;
114
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
115
    id_ex_register.rZ <= CONV_STD_LOGIC_VECTOR(1, REGISTER_WIDTH);
116
    wait for clk_period;
117
    id_ex_register.opcode <= OPCODE_LD_REG;
118
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(6, REGISTER_WIDTH);
119
    wait for clk_period;
120
    id_ex_register.opcode <= OPCODE_ST_DISP;
121
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
122
    id_ex_register.rZ <= CONV_STD_LOGIC_VECTOR(1, REGISTER_WIDTH);
123
    wait for clk_period;
124
    -- arithmetic opcodes
125
    id_ex_register.opcode <= OPCODE_ADD;
126
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(8, REGISTER_WIDTH);
127
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(3, REGISTER_WIDTH);
128
    wait for clk_period;
129
    id_ex_register.opcode <= OPCODE_ADD;
130
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(-8, REGISTER_WIDTH);
131
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
132
    wait for clk_period;
133
    id_ex_register.opcode <= OPCODE_ADD_IMM;
134
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(3, REGISTER_WIDTH);
135
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
136
    wait for clk_period;
137
    id_ex_register.opcode <= OPCODE_ADD_IMM;
138
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(3, REGISTER_WIDTH);
139
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(-2, REGISTER_WIDTH);
140
    wait for clk_period;
141
    id_ex_register.opcode <= OPCODE_SUB;
142
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
143
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
144
    wait for clk_period;
145
    id_ex_register.opcode <= OPCODE_SUB;
146
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
147
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(6, REGISTER_WIDTH);
148
    wait for clk_period;
149
    id_ex_register.opcode <= OPCODE_SUB_IMM;
150
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(-4, REGISTER_WIDTH);
151
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(6, REGISTER_WIDTH);
152
    wait for clk_period;
153
    id_ex_register.opcode <= OPCODE_SUB_IMM;
154
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
155
    id_ex_register.immediate <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
156
    wait for clk_period;
157
    id_ex_register.opcode <= OPCODE_NEG;
158
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
159
    wait for clk_period;
160
    id_ex_register.opcode <= OPCODE_ARS;
161
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
162
    wait for clk_period;
163
    id_ex_register.opcode <= OPCODE_ALS;
164
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
165
    -- als with overflow
166
    wait for clk_period;
167
    id_ex_register.opcode <= OPCODE_ALS;
168
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(30000, REGISTER_WIDTH);
169
    -- als with overflow
170
    wait for clk_period;
171
    id_ex_register.opcode <= OPCODE_ALS;
172
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(-30000, REGISTER_WIDTH);
173
 
174
    -- logical opcodes
175
    wait for clk_period;
176
    id_ex_register.opcode <= OPCODE_AND;
177
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
178
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
179
    wait for clk_period;
180
    id_ex_register.opcode <= OPCODE_NOT;
181
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
182
    wait for clk_period;
183
    id_ex_register.opcode <= OPCODE_EOR;
184
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
185
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
186
    wait for clk_period;
187
    id_ex_register.opcode <= OPCODE_LS;
188
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
189
    wait for clk_period;
190
    id_ex_register.opcode <= OPCODE_RS;
191
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(4, REGISTER_WIDTH);
192
 
193
    -- other
194
    wait for clk_period;
195
    id_ex_register.opcode <= OPCODE_JMP;
196
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(8, REGISTER_WIDTH);
197
 
198
    ---------------------------------------------------------------------------
199
    -- test stall/clear
200
    ---------------------------------------------------------------------------
201
    wait for clk_period;
202
    stall_in <= '1';
203
    id_ex_register.opcode <= OPCODE_JMP;
204
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(8, REGISTER_WIDTH);
205
    wait for clk_period;
206
    stall_in <= '0';
207
    id_ex_register.rX_addr <= CONV_STD_LOGIC_VECTOR(6, REGISTER_ADDR_WIDTH);
208
    id_ex_register.opcode <= OPCODE_LD_REG;
209
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(6, REGISTER_WIDTH);
210
    wait for clk_period;
211
    clear_in <= '1';
212
    wait for clk_period;
213
    clear_in <= '0';
214
 
215
    ---------------------------------------------------------------------------
216
    -- branch (i.e. load instruction with PC as destination)
217
    ---------------------------------------------------------------------------
218
    wait for clk_period;
219
    id_ex_register.rX_addr <= PC_ADDR;
220
    id_ex_register.opcode <= OPCODE_LD_REG;
221
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(6, REGISTER_WIDTH);
222
 
223
    wait for clk_period;
224
    id_ex_register.rX_addr <= CONV_STD_LOGIC_VECTOR(6, REGISTER_ADDR_WIDTH);
225
    id_ex_register.opcode <= OPCODE_LD_REG;
226
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(6, REGISTER_WIDTH);
227
 
228
    ---------------------------------------------------------------------------
229
    -- test conditionals
230
    ---------------------------------------------------------------------------
231
    wait for clk_period;
232
    id_ex_register.cond <= COND_ZERO;
233
    id_ex_register.sr <= (SR_ZERO_BIT => '0', others => '0');
234
    id_ex_register.opcode <= OPCODE_ADD;
235
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(8, REGISTER_WIDTH);
236
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(3, REGISTER_WIDTH);
237
    wait for clk_period;
238
    id_ex_register.cond <= COND_UNCONDITIONAL;
239
    id_ex_register.opcode <= OPCODE_ADD;
240
    id_ex_register.rX <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
241
    id_ex_register.rY <= CONV_STD_LOGIC_VECTOR(2, REGISTER_WIDTH);
242
 
243
    wait;                               -- will wait forever
244
  end process;
245
 
246
end;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.