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

Subversion Repositories aemb

[/] [aemb/] [trunk/] [sim/] [verilog/] [aemb2.v] - Blame information for rev 92

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

Line No. Rev Author Line
1 92 sybreon
/* $Id: aemb2.v,v 1.2 2007-12-18 18:54:37 sybreon Exp $
2 79 sybreon
**
3
** AEMB2 TEST BENCH
4
**
5
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
**
7
** This file is part of AEMB.
8
**
9
** AEMB is free software: you can redistribute it and/or modify it
10
** under the terms of the GNU Lesser General Public License as
11
** published by the Free Software Foundation, either version 3 of the
12
** License, or (at your option) any later version.
13
**
14
** AEMB is distributed in the hope that it will be useful, but WITHOUT
15
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
17
** Public License for more details.
18
**
19
** You should have received a copy of the GNU Lesser General Public
20
** License along with AEMB. If not, see <http:**www.gnu.org/licenses/>.
21
*/
22
 
23
module aemb2 ();
24
   parameter IWB=16;
25
   parameter DWB=16;
26
 
27
   parameter TXE = 1; ///< thread execution enable
28
 
29
   parameter MUL = 1; ///< enable hardware multiplier
30
   parameter BSF = 1; ///< enable barrel shifter
31
   parameter FSL = 1; ///< enable FSL bus
32
   parameter DIV = 0; ///< enable hardware divider   
33
 
34
`include "random.v"
35
 
36
   /*AUTOWIRE*/
37
   // Beginning of automatic wires (for undeclared instantiated-module outputs)
38 92 sybreon
   wire [6:2]           cwb_adr_o;              // From dut of aeMB2_sim.v
39
   wire [31:0]           cwb_dat_o;              // From dut of aeMB2_sim.v
40
   wire [3:0]            cwb_sel_o;              // From dut of aeMB2_sim.v
41
   wire                 cwb_stb_o;              // From dut of aeMB2_sim.v
42
   wire [1:0]            cwb_tga_o;              // From dut of aeMB2_sim.v
43
   wire                 cwb_wre_o;              // From dut of aeMB2_sim.v
44
   wire [DWB-1:2]       dwb_adr_o;              // From dut of aeMB2_sim.v
45
   wire                 dwb_cyc_o;              // From dut of aeMB2_sim.v
46
   wire [31:0]           dwb_dat_o;              // From dut of aeMB2_sim.v
47
   wire [3:0]            dwb_sel_o;              // From dut of aeMB2_sim.v
48
   wire                 dwb_stb_o;              // From dut of aeMB2_sim.v
49
   wire                 dwb_tga_o;              // From dut of aeMB2_sim.v
50
   wire                 dwb_wre_o;              // From dut of aeMB2_sim.v
51
   wire [IWB-1:2]       iwb_adr_o;              // From dut of aeMB2_sim.v
52
   wire                 iwb_stb_o;              // From dut of aeMB2_sim.v
53
   wire                 iwb_tga_o;              // From dut of aeMB2_sim.v
54
   wire                 iwb_wre_o;              // From dut of aeMB2_sim.v
55 79 sybreon
   // End of automatics
56
   /*AUTOREGINPUT*/
57
   // Beginning of automatic reg inputs (for undeclared instantiated-module inputs)
58 92 sybreon
   reg                  cwb_ack_i;              // To dut of aeMB2_sim.v
59
   reg                  dwb_ack_i;              // To dut of aeMB2_sim.v
60
   reg                  iwb_ack_i;              // To dut of aeMB2_sim.v
61
   reg                  sys_clk_i;              // To dut of aeMB2_sim.v
62
   reg                  sys_int_i;              // To dut of aeMB2_sim.v
63
   reg                  sys_rst_i;              // To dut of aeMB2_sim.v
64 79 sybreon
   // End of automatics
65
 
66
   // INITIAL SETUP //////////////////////////////////////////////////////
67
 
68
   //reg                        sys_clk_i, sys_rst_i, sys_int_i, sys_exc_i;
69
   reg       svc;
70
   integer   inttime;
71
   integer   seed;
72
   integer   theend;
73
 
74
   always #5 sys_clk_i = ~sys_clk_i;
75
 
76
   initial begin
77
      //$dumpfile("dump.vcd");
78
      //$dumpvars(1,dut, dut.bpcu);
79
   end
80
 
81
   initial begin
82
      seed = randseed;
83
      theend = 0;
84
      svc = 0;
85
      sys_clk_i = $random(seed);
86
      sys_rst_i = 1;
87
      sys_int_i = 0;
88
      #50 sys_rst_i = 0;
89
      #3500000 $finish;
90
   end
91
 
92
   // FAKE MEMORY ////////////////////////////////////////////////////////
93
 
94
   reg [31:0]  rom [0:65535];
95
   reg [31:0]  ram[0:65535];
96
   reg [31:0]  dwblat;
97
   reg [15:2]  dadr, iadr;
98
 
99
   wire [31:0] dwb_dat_t = ram[dwb_adr_o];
100
   wire [31:0] iwb_dat_i = ram[iadr];
101
   wire [31:0] dwb_dat_i = ram[dadr];
102
   wire [31:0] cwb_dat_i = cwb_adr_o;
103
 
104
`ifdef POSEDGE
105
`else // !`ifdef POSEDGE
106
 
107
   always @(negedge sys_clk_i)
108
     if (sys_rst_i) begin
109
        /*AUTORESET*/
110
        // Beginning of autoreset for uninitialized flops
111
        cwb_ack_i <= 1'h0;
112
        dwb_ack_i <= 1'h0;
113
        iwb_ack_i <= 1'h0;
114
        // End of automatics
115
     end else begin
116
        iwb_ack_i <= #1 iwb_stb_o;
117
        dwb_ack_i <= #1 dwb_stb_o;
118
        cwb_ack_i <= #1 cwb_stb_o;
119
     end // else: !if(sys_rst_i)
120
 
121
   always @(negedge sys_clk_i) begin
122
      iadr <= #1 iwb_adr_o;
123
      dadr <= #1 dwb_adr_o;
124
 
125
      if (dwb_wre_o & dwb_stb_o) begin
126
         case (dwb_sel_o)
127
           4'h1: ram[dwb_adr_o] <= {dwb_dat_t[31:8], dwb_dat_o[7:0]};
128
           4'h2: ram[dwb_adr_o] <= {dwb_dat_t[31:16], dwb_dat_o[15:8], dwb_dat_t[7:0]};
129
           4'h4: ram[dwb_adr_o] <= {dwb_dat_t[31:24], dwb_dat_o[23:16], dwb_dat_t[15:0]};
130
           4'h8: ram[dwb_adr_o] <= {dwb_dat_o[31:24], dwb_dat_t[23:0]};
131
           4'h3: ram[dwb_adr_o] <= {dwb_dat_t[31:16], dwb_dat_o[15:0]};
132
           4'hC: ram[dwb_adr_o] <= {dwb_dat_o[31:16], dwb_dat_t[15:0]};
133
           4'hF: ram[dwb_adr_o] <= {dwb_dat_o};
134
         endcase // case (dwb_sel_o)
135
      end // if (dwb_we_o & dwb_stb_o)
136
   end // always @ (negedge sys_clk_i)
137
 
138
`endif // !`ifdef POSEDGE
139
 
140
 
141
   integer i;
142
   initial begin
143
      for (i=0;i<65535;i=i+1) begin
144
         ram[i] <= $random;
145
      end
146
      #1 $readmemh("dump.vmem",ram);
147
   end
148
 
149
   // DISPLAY OUTPUTS ///////////////////////////////////////////////////
150
 
151
   integer rnd;
152
 
153
   always @(posedge sys_clk_i) begin
154 92 sybreon
 
155
      // Interrupt Monitors
156
      if (!dut.sim.rMSR_IE) begin
157
         rnd = $random % 30;
158
         inttime = $stime + 1000 + (rnd*rnd * 10);
159
      end
160
      if ($stime > inttime) begin
161
         sys_int_i = 1;
162
         svc = 0;
163
      end
164
      if (($stime > inttime + 500) && !svc) begin
165
         $display("\n\t*** INTERRUPT TIMEOUT ***", inttime);
166
         $finish;
167
      end
168
      if (dwb_wre_o & (dwb_dat_o == "RTNI")) sys_int_i = 0;
169
      /*
170
      if (dut.regf.fRDWE && (dut.rRD == 5'h0e) && !svc && dut.gena) begin
171
         svc = 1;
172
         //$display("\nLATENCY: ", ($stime - inttime)/10);
173
      end
174
       */
175
 
176 79 sybreon
      // Pass/Fail Monitors
177
      if (dwb_wre_o & (dwb_dat_o == "FAIL")) begin
178
         $display("\n\tFAIL");
179
         $finish;
180
      end
181
 
182
      if (iwb_dat_i == 32'hb8000000) begin
183
         theend = theend + 1;
184
      end
185
 
186
      if (theend == 5) begin
187
         $display("\n\t*** PASSED ALL TESTS ***");
188
         $finish;
189
      end
190
 
191
   end // always @ (posedge sys_clk_i)
192
 
193
   // INTERNAL WIRING ////////////////////////////////////////////////////
194
 
195 92 sybreon
   aeMB2_sim
196
     #(/*AUTOINSTPARAM*/)
197 79 sybreon
   dut (/*AUTOINST*/
198
        // Outputs
199
        .cwb_adr_o                      (cwb_adr_o[6:2]),
200
        .cwb_dat_o                      (cwb_dat_o[31:0]),
201
        .cwb_sel_o                      (cwb_sel_o[3:0]),
202
        .cwb_stb_o                      (cwb_stb_o),
203
        .cwb_tga_o                      (cwb_tga_o[1:0]),
204
        .cwb_wre_o                      (cwb_wre_o),
205
        .dwb_adr_o                      (dwb_adr_o[DWB-1:2]),
206
        .dwb_cyc_o                      (dwb_cyc_o),
207
        .dwb_dat_o                      (dwb_dat_o[31:0]),
208
        .dwb_sel_o                      (dwb_sel_o[3:0]),
209
        .dwb_stb_o                      (dwb_stb_o),
210 92 sybreon
        .dwb_tga_o                      (dwb_tga_o),
211 79 sybreon
        .dwb_wre_o                      (dwb_wre_o),
212
        .iwb_adr_o                      (iwb_adr_o[IWB-1:2]),
213
        .iwb_stb_o                      (iwb_stb_o),
214 92 sybreon
        .iwb_tga_o                      (iwb_tga_o),
215 79 sybreon
        .iwb_wre_o                      (iwb_wre_o),
216
        // Inputs
217
        .cwb_ack_i                      (cwb_ack_i),
218
        .cwb_dat_i                      (cwb_dat_i[31:0]),
219
        .dwb_ack_i                      (dwb_ack_i),
220
        .dwb_dat_i                      (dwb_dat_i[31:0]),
221
        .iwb_ack_i                      (iwb_ack_i),
222
        .iwb_dat_i                      (iwb_dat_i[31:0]),
223
        .sys_clk_i                      (sys_clk_i),
224
        .sys_int_i                      (sys_int_i),
225
        .sys_rst_i                      (sys_rst_i));
226
 
227
endmodule // edk32
228
 
229 92 sybreon
 
230 79 sybreon
/* $Log $ */
231
 
232
// Local Variables:
233
// verilog-library-directories:("." "../../rtl/verilog/")
234
// verilog-library-files:("")
235 92 sybreon
// End:

powered by: WebSVN 2.1.0

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