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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [fpga/] [actel_m1a3pl_dev_kit/] [bench/] [verilog/] [tb_openMSP430_fpga.v] - Blame information for rev 211

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

Line No. Rev Author Line
1 80 olivier.gi
//----------------------------------------------------------------------------
2
// Copyright (C) 2001 Authors
3
//
4
// This source file may be used and distributed without restriction provided
5
// that this copyright statement is not removed from the file and that any
6
// derivative work contains the original copyright notice and the associated
7
// disclaimer.
8
//
9
// This source file is free software; you can redistribute it and/or modify
10
// it under the terms of the GNU Lesser General Public License as published
11
// by the Free Software Foundation; either version 2.1 of the License, or
12
// (at your option) any later version.
13
//
14
// This source is distributed in the hope that it will be useful, but WITHOUT
15
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17
// License for more details.
18
//
19
// You should have received a copy of the GNU Lesser General Public License
20
// along with this source; if not, write to the Free Software Foundation,
21
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22
//
23
//----------------------------------------------------------------------------
24
// 
25
// *File Name: tb_openMSP430_fpga.v
26
// 
27
// *Module Description:
28
//                      openMSP430 FPGA testbench
29
//
30
// *Author(s):
31
//              - Olivier Girard,    olgirard@gmail.com
32
//
33
//----------------------------------------------------------------------------
34
// $Rev: 37 $
35
// $LastChangedBy: olivier.girard $
36
// $LastChangedDate: 2009-12-29 21:58:14 +0100 (Tue, 29 Dec 2009) $
37
//----------------------------------------------------------------------------
38
`include "timescale.v"
39 104 olivier.gi
`ifdef OMSP_NO_INCLUDE
40
`else
41 80 olivier.gi
`include "openMSP430_defines.v"
42 104 olivier.gi
`endif
43 80 olivier.gi
 
44
module  tb_openMSP430_fpga;
45
 
46
//
47
// Wire & Register definition
48
//------------------------------
49
 
50
// Clock & Reset
51
reg               oscclk;
52
reg               porst_n;
53
reg               pbrst_n;
54
 
55
// Slide Switches
56
reg         [9:0] switch;
57
 
58
// LEDs
59
wire        [9:0] led;
60
 
61
// UART
62 136 olivier.gi
wire              dbg_uart_rxd;
63 107 olivier.gi
wire              dbg_uart_txd;
64 136 olivier.gi
reg               dbg_uart_rxd_sel;
65
reg               dbg_uart_rxd_dly;
66
reg               dbg_uart_rxd_pre;
67
reg               dbg_uart_rxd_meta;
68 107 olivier.gi
reg        [15:0] dbg_uart_buf;
69 136 olivier.gi
reg               dbg_uart_rx_busy;
70
reg               dbg_uart_tx_busy;
71 80 olivier.gi
 
72
// Core debug signals
73
wire   [8*32-1:0] i_state;
74
wire   [8*32-1:0] e_state;
75
wire       [31:0] inst_cycle;
76
wire   [8*32-1:0] inst_full;
77
wire       [31:0] inst_number;
78
wire       [15:0] inst_pc;
79
wire   [8*32-1:0] inst_short;
80
 
81
// Testbench variables
82
integer           i;
83
integer           error;
84
reg               stimulus_done;
85
wire       [11:0] vout_x;
86
wire       [11:0] vout_y;
87
 
88
//
89
// Include files
90
//------------------------------
91
 
92
// CPU & Memory registers
93
`include "registers.v"
94
 
95 107 olivier.gi
// Debug interface tasks
96
`include "dbg_uart_tasks.v"
97
 
98 80 olivier.gi
// Verilog stimulus
99
`include "stimulus.v"
100
 
101
//
102
// Initialize Program Memory
103
//------------------------------
104
 
105
initial
106
   begin
107
      // Read memory file
108 94 olivier.gi
      #10 $readmemh("./pmem.mem", pmem);
109 80 olivier.gi
 
110
      // Update Actel memory banks
111
      for (i=0; i<512; i=i+1)
112
        begin
113
           dut.dmem_hi.dmem_128B_R0C0.MEM_512_9[i] = {1'b0, 8'h00};
114
           dut.dmem_lo.dmem_128B_R0C0.MEM_512_9[i] = {1'b0, 8'h00};
115
 
116
           dut.pmem_hi.pmem_2kB_R0C0.MEM_512_9[i] = {1'b0, pmem[i*4+3][9:8],   pmem[i*4+2][9:8],   pmem[i*4+1][9:8],   pmem[i*4+0][9:8]};
117
           dut.pmem_hi.pmem_2kB_R0C1.MEM_512_9[i] = {1'b0, pmem[i*4+3][11:10], pmem[i*4+2][11:10], pmem[i*4+1][11:10], pmem[i*4+0][11:10]};
118
           dut.pmem_hi.pmem_2kB_R0C2.MEM_512_9[i] = {1'b0, pmem[i*4+3][13:12], pmem[i*4+2][13:12], pmem[i*4+1][13:12], pmem[i*4+0][13:12]};
119
           dut.pmem_hi.pmem_2kB_R0C3.MEM_512_9[i] = {1'b0, pmem[i*4+3][15:14], pmem[i*4+2][15:14], pmem[i*4+1][15:14], pmem[i*4+0][15:14]};
120
 
121
           dut.pmem_lo.pmem_2kB_R0C0.MEM_512_9[i] = {1'b0, pmem[i*4+3][1:0],   pmem[i*4+2][1:0],   pmem[i*4+1][1:0],   pmem[i*4+0][1:0]};
122
           dut.pmem_lo.pmem_2kB_R0C1.MEM_512_9[i] = {1'b0, pmem[i*4+3][3:2],   pmem[i*4+2][3:2],   pmem[i*4+1][3:2],   pmem[i*4+0][3:2]};
123
           dut.pmem_lo.pmem_2kB_R0C2.MEM_512_9[i] = {1'b0, pmem[i*4+3][5:4],   pmem[i*4+2][5:4],   pmem[i*4+1][5:4],   pmem[i*4+0][5:4]};
124
           dut.pmem_lo.pmem_2kB_R0C3.MEM_512_9[i] = {1'b0, pmem[i*4+3][7:6],   pmem[i*4+2][7:6],   pmem[i*4+1][7:6],   pmem[i*4+0][7:6]};
125
        end
126
  end
127
 
128
//
129
// Generate Clock & Reset
130
//------------------------------
131
initial
132
  begin
133
     oscclk = 1'b0;
134
     forever #10.4 oscclk <= ~oscclk; // 48 MHz
135
  end
136
 
137
initial
138
  begin
139
     porst_n       = 1'b1;
140
     pbrst_n       = 1'b1;
141
     #100;
142
     porst_n       = 1'b0;
143
     pbrst_n       = 1'b0;
144
     #600;
145
     porst_n       = 1'b1;
146
     pbrst_n       = 1'b1;
147
  end
148
 
149
//
150
// Global initialization
151
//------------------------------
152
initial
153
  begin
154 136 olivier.gi
     error            = 0;
155
     stimulus_done    = 1;
156
     switch           = 10'h000;
157
     dbg_uart_rxd_sel = 1'b0;
158
     dbg_uart_rxd_dly = 1'b1;
159
     dbg_uart_rxd_pre = 1'b1;
160
     dbg_uart_rxd_meta= 1'b0;
161
     dbg_uart_rx_busy = 1'b0;
162
     dbg_uart_tx_busy = 1'b0;
163 80 olivier.gi
  end
164
 
165
//
166
// openMSP430 FPGA Instance
167
//----------------------------------
168
 
169
openMSP430_fpga dut (
170
 
171
// OUTPUTs
172
    .din_x        (din_x),          // SPI Serial Data
173
    .din_y        (din_y),          // SPI Serial Data
174
    .led          (led),            // Board LEDs
175
    .sclk_x       (sclk_x),         // SPI Serial Clock
176
    .sclk_y       (sclk_y),         // SPI Serial Clock
177
    .sync_n_x     (sync_n_x),       // SPI Frame synchronization signal (low active)
178
    .sync_n_y     (sync_n_y),       // SPI Frame synchronization signal (low active)
179 107 olivier.gi
    .uart_tx      (dbg_uart_txd),   // Board UART TX pin
180 80 olivier.gi
 
181
// INPUTs
182
    .oscclk       (oscclk),         // Board Oscillator (?? MHz)
183
    .porst_n      (porst_n),        // Board Power-On reset (active low)
184
    .pbrst_n      (pbrst_n),        // Board Push-Button reset (active low)
185 107 olivier.gi
    .uart_rx      (dbg_uart_rxd),   // Board UART RX pin
186 80 olivier.gi
    .switch       (switch)          // Board Switches
187
);
188
 
189
 
190
//
191
// 12 BIT DACs
192
//----------------------------------------
193
 
194
DAC121S101 DAC121S101_x (
195
 
196
// OUTPUTs
197
    .vout         (vout_x),        // Peripheral data output
198
 
199
// INPUTs
200
    .din          (din_x),         // SPI Serial Data
201
    .sclk         (sclk_x),        // SPI Serial Clock
202
    .sync_n       (sync_n_x)       // SPI Frame synchronization signal (low active)
203
);
204
 
205
DAC121S101 DAC121S101_y (
206
 
207
// OUTPUTs
208
    .vout         (vout_y),        // Peripheral data output
209
 
210
// INPUTs
211
    .din          (din_y),         // SPI Serial Data
212
    .sclk         (sclk_y),        // SPI Serial Clock
213
    .sync_n       (sync_n_y)       // SPI Frame synchronization signal (low active)
214
);
215
 
216
 
217
//
218
// Debug utility signals
219
//----------------------------------------
220
msp_debug msp_debug_0 (
221
 
222
// OUTPUTs
223
    .e_state      (e_state),       // Execution state
224
    .i_state      (i_state),       // Instruction fetch state
225
    .inst_cycle   (inst_cycle),    // Cycle number within current instruction
226
    .inst_full    (inst_full),     // Currently executed instruction (full version)
227
    .inst_number  (inst_number),   // Instruction number since last system reset
228
    .inst_pc      (inst_pc),       // Instruction Program counter
229
    .inst_short   (inst_short),    // Currently executed instruction (short version)
230
 
231
// INPUTs
232
    .mclk         (mclk),          // Main system clock
233 111 olivier.gi
    .puc_rst      (puc_rst)        // Main system reset
234 80 olivier.gi
);
235
 
236
//
237
// Generate Waveform
238
//----------------------------------------
239
initial
240
  begin
241
   `ifdef VPD_FILE
242
     $vcdplusfile("tb_openMSP430_fpga.vpd");
243
     $vcdpluson();
244
   `else
245 98 olivier.gi
     `ifdef TRN_FILE
246
        $recordfile ("tb_openMSP430_fpga.trn");
247
        $recordvars;
248
     `else
249
        $dumpfile("tb_openMSP430_fpga.vcd");
250
        $dumpvars(0, tb_openMSP430_fpga);
251
     `endif
252 80 olivier.gi
   `endif
253
  end
254
 
255
//
256
// End of simulation
257
//----------------------------------------
258
 
259
initial // Timeout
260
  begin
261
     #500000;
262
     $display(" ===============================================");
263
     $display("|               SIMULATION FAILED               |");
264
     $display("|              (simulation Timeout)             |");
265
     $display(" ===============================================");
266
     $finish;
267
  end
268
 
269
initial // Normal end of test
270
  begin
271
     @(inst_pc===16'hffff)
272
     $display(" ===============================================");
273
     if (error!=0)
274
       begin
275
          $display("|               SIMULATION FAILED               |");
276
          $display("|     (some verilog stimulus checks failed)     |");
277
       end
278
     else if (~stimulus_done)
279
       begin
280
          $display("|               SIMULATION FAILED               |");
281
          $display("|     (the verilog stimulus didn't complete)    |");
282
       end
283
     else
284
       begin
285
          $display("|               SIMULATION PASSED               |");
286
       end
287
     $display(" ===============================================");
288
     $finish;
289
  end
290
 
291
 
292
//
293
// Tasks Definition
294
//------------------------------
295
 
296
   task tb_error;
297
      input [65*8:0] error_string;
298
      begin
299
         $display("ERROR: %s %t", error_string, $time);
300
         error = error+1;
301
      end
302
   endtask
303
 
304
 
305
endmodule

powered by: WebSVN 2.1.0

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