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

Subversion Repositories mips_16

[/] [mips_16/] [trunk/] [bench/] [ID_stage/] [ID_stage_tb_0.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Doyya
/***************************************************
2
 * Module: ID_stage_tb_0_v
3
 * Project: mips_16
4
 * Author: fzy
5
 * Description:
6
 *
7
 *
8
 * Revise history:
9
 *
10
 ***************************************************/
11
`timescale 1ns/1ps
12
`include "mips_16_defs.v"
13
 
14
module ID_stage_tb_0_v;
15
        reg                                     clk;
16
        reg                                     rst;
17
        reg                                     instruction_decode_en;
18
 
19
        // to EX_stage
20
        wire    [56:0]           pipeline_reg_out;       //      [56:22],35bits: ex_alu_cmd[2:0], ex_alu_src1[15:0], ex_alu_src2[15:0]
21
                                                                                                //      [21:5],17bits:  mem_write_en, mem_write_data[15:0]
22
                                                                                                //      [4:0],5bits:    write_back_en, write_back_dest[2:0], write_back_result_mux, 
23
 
24
        // to IF_stage
25
        reg             [15:0]           instruction;
26
        wire    [5:0]            branch_offset_imm;
27
        wire                            branch_taken;
28
 
29
        // to register file
30
        wire    [2:0]            reg_read_addr_1;        // register file read port 1 address
31
        wire    [2:0]            reg_read_addr_2;        // register file read port 2 address
32
        reg             [15:0]           reg_read_data_1;        // register file read port 1 data
33
        reg             [15:0]           reg_read_data_2;        // register file read port 2 data
34
 
35
        // to hazard detection unit
36
        wire    [2:0]            decoding_op_src1;               //source_1 register number
37
        wire    [2:0]            decoding_op_src2;               //source_2 register number
38
 
39
 
40
 
41
 
42
        parameter CLK_PERIOD = 10;
43
        integer test;
44
 
45
        ID_stage uut(
46
                .clk(clk),
47
                .rst(rst),
48
                .instruction_decode_en(instruction_decode_en),
49
                .pipeline_reg_out(pipeline_reg_out),
50
                .instruction(instruction),
51
                .branch_offset_imm(branch_offset_imm),
52
                .branch_taken(branch_taken),
53
                .reg_read_addr_1(reg_read_addr_1),      //
54
                .reg_read_addr_2(reg_read_addr_2),      //
55
                .reg_read_data_1(reg_read_data_1),      //
56
                .reg_read_data_2(reg_read_data_2),      //
57
                .decoding_op_src1(decoding_op_src1),
58
                .decoding_op_src2(decoding_op_src2)
59
        );
60
 
61
        always #(CLK_PERIOD /2)
62
                clk =~clk;
63
 
64
        initial begin
65
                // Initialize Inputs
66
                clk = 0;
67
                rst = 0;
68
                instruction_decode_en = 0;
69
                instruction = 0;
70
                reg_read_data_1 = 0;
71
                reg_read_data_2 = 0;
72
                test = 0;
73
 
74
                // Wait 100 ns for global reset to finish
75
                #100;
76
        display_debug_message;
77
                #(CLK_PERIOD/2)
78
                test1;
79
 
80
                $stop;
81
 
82
                $finish;
83
 
84
        end
85
 
86
 
87
        task display_debug_message;
88
                begin
89
                        $display("\n***************************");
90
                        $display("ID_stage test");
91
                        $display("***************************\n");
92
                end
93
        endtask
94
 
95
        task sys_reset;
96
                begin
97
                        rst = 0;
98
                        #(CLK_PERIOD*1) rst = 1;
99
                        #(CLK_PERIOD*1) rst = 0;
100
                end
101
        endtask
102
 
103
        task test1;
104
                begin
105
 
106
                        sys_reset;
107
                        #1
108
                        instruction_decode_en = 1;
109
                        #(CLK_PERIOD) test = 1;
110
 
111
                        #(CLK_PERIOD*100) test = 0;
112
                        sys_reset;
113
 
114
                end
115
        endtask
116
 
117
        // register file behavior
118
        always@(*) begin
119
                reg_read_data_1 = 0;
120
                reg_read_data_2 = 0;
121
 
122
                if(reg_read_addr_1 == 1)
123
                        reg_read_data_1 = 31;
124
                if(reg_read_addr_1 == 5)
125
                        reg_read_data_1 = 7;
126
                if(reg_read_addr_1 == 7)
127
                        reg_read_data_1 = 0;// ==0, BZ will taken
128
                        // reg_read_data_1 = 3;  // !=0, BZ will not taken
129
 
130
                if(reg_read_addr_2 == 2)
131
                        reg_read_data_2 = 28;
132
                if(reg_read_addr_2 == 4)
133
                        reg_read_data_2 = 16'h9a3c;
134
                if(reg_read_addr_2 == 6)
135
                        reg_read_data_2 = 16'hc32e;
136
        end
137
 
138
        always @ (test) begin
139
            case(test)
140
                        1: begin
141
                            $display("running test1\n");
142
                                $display("check datapath control logic S1~S6 correct or not\n");
143
                                //while(test == 1) begin
144
                                        // NOP
145
                                        #(CLK_PERIOD) instruction = { `OP_NOP, 12'b0};
146
                                        $display("OP_NOP\n");
147
 
148
                                        // ADD
149
                                        #(CLK_PERIOD) instruction = { `OP_ADD, 3'd0, 3'd1, 3'd2, 3'd0};
150
                                        $display("OP_ADD\n");
151
                                        #(CLK_PERIOD)
152
                                        if(
153
                                                uut.write_back_en                       != 1            ||      // S3
154
                                                uut.write_back_result_mux       != 0             ||      // S1
155
                                                uut.ex_alu_cmd                          != `ALU_ADD     ||      // S2
156
                                                uut.alu_src2_mux                        != 0             ||      // S4
157
                                                uut.decoding_op_is_branch       != 0             ||      // S5
158
                                                uut.decoding_op_is_store        != 0             ||      // S6
159
                                                decoding_op_src1                        != 1            ||
160
                                                decoding_op_src2                        != 2            ||
161
                                                branch_taken                            != 0             ||
162
                                                branch_offset_imm                       != 6'b010000||
163
                                                reg_read_addr_1                         != 1            ||
164
                                                reg_read_addr_2                         != 2
165
                                        )
166
                                                $display("error1\n");
167
                                        #(CLK_PERIOD)
168
                                        if(
169
                                                pipeline_reg_out[56:54]         != `ALU_ADD     ||      // S2 ex_alu_cmd
170
                                                pipeline_reg_out[53:38]         != 31           ||      //    alu src1
171
                                                pipeline_reg_out[37:22]         != 28           ||      //    alu src2
172
                                                pipeline_reg_out[21]            != 0             ||      //    mem_write_en
173
                                                pipeline_reg_out[20:5]          != 28           ||      //        mem_write_data
174
                                                pipeline_reg_out[4]                     != 1            ||      // S3 write_back_en
175
                                                pipeline_reg_out[3:1]           != 0             ||      //    write_back_dest
176
                                                pipeline_reg_out[0]                      != 0                     // S1 write_back_result_mux
177
 
178
                                        )
179
                                                $display("error2\n");
180
 
181
                                        // ST
182
                                        #(CLK_PERIOD) instruction = { `OP_ST, 3'd4, 3'd5, 6'd31};
183
                                        $display("OP_ST\n");
184
                                        #(CLK_PERIOD)
185
                                        if(
186
                                                uut.write_back_en                       != 0             ||      // S3
187
                                                uut.write_back_result_mux       != 1'bx         ||      // S1
188
                                                uut.ex_alu_cmd                          != `ALU_ADD     ||      // S2
189
                                                uut.alu_src2_mux                        != 1            ||      // S4
190
                                                uut.decoding_op_is_branch       != 0             ||      // S5
191
                                                uut.decoding_op_is_store        != 1            ||      // S6
192
                                                decoding_op_src1                        != 5            ||
193
                                                decoding_op_src2                        != 4            ||
194
                                                branch_taken                            != 0             ||
195
                                                branch_offset_imm                       != 6'd31        ||
196
                                                reg_read_addr_1                         != 5            ||
197
                                                reg_read_addr_2                         != 4
198
                                        )
199
                                                $display("error1\n");
200
                                        #(CLK_PERIOD)
201
                                        if(
202
                                                pipeline_reg_out[53:38]         != 7            ||      //    ex_alu_src1
203
                                                pipeline_reg_out[37:22]         != 31           ||      //    ex_alu_src2
204
                                                pipeline_reg_out[21]            != 1            ||      //    mem_write_en
205
                                                pipeline_reg_out[20:5]          != 16'h9a3c     ||      //        mem_write_data
206
                                                pipeline_reg_out[3:1]           != 4                    //    write_back_dest
207
                                        )
208
                                                $display("error2\n");
209
 
210
                                        // BZ
211
                                        #(CLK_PERIOD) instruction = { `OP_BZ, 3'd0, 3'd7, -6'd10};
212
                                        $display("OP_BZ\n");
213
                                        #(CLK_PERIOD)
214
                                        if(
215
                                                uut.write_back_en                       != 0             ||      // S3
216
                                                uut.write_back_result_mux       != 1'bx         ||      // S1
217
                                                uut.ex_alu_cmd                          != `ALU_NC      ||      // S2
218
                                                uut.alu_src2_mux                        != 1            ||      // S4
219
                                                uut.decoding_op_is_branch       != 1            ||      // S5
220
                                                uut.decoding_op_is_store        != 0             ||      // S6
221
                                                decoding_op_src1                        != 7            ||
222
                                                decoding_op_src2                        != 0             ||
223
                                                branch_taken                            != 1            ||
224
                                                // branch_taken                         != 0            ||
225
                                                branch_offset_imm                       != -6'd10       ||
226
                                                reg_read_addr_1                         != 7            ||
227
                                                reg_read_addr_2                         != 3'b110
228
                                        )
229
                                                $display("error1\n");
230
                                        #(CLK_PERIOD)
231
                                        if(
232
                                                pipeline_reg_out[53:38]         != 0             ||      //    ex_alu_src1
233
                                                // pipeline_reg_out[53:38]              != 3            ||      //    ex_alu_src1
234
                                                pipeline_reg_out[37:22]         != -6'd10       ||      //    ex_alu_src2
235
                                                pipeline_reg_out[21]            != 0             ||      //    mem_write_en
236
                                                pipeline_reg_out[20:5]          != 16'hc32e     ||      //        mem_write_data
237
                                                pipeline_reg_out[3:1]           != 0                     //    write_back_dest
238
                                        )
239
                                                $display("error2\n");
240
 
241
                                //end
242
                        end
243
 
244
 
245
 
246
                endcase
247
        end
248
 
249
 
250
 
251
endmodule

powered by: WebSVN 2.1.0

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