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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [core/] [bench/] [verilog/] [tb_openMSP430.v] - Blame information for rev 192

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

Line No. Rev Author Line
1 2 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.v
26
// 
27
// *Module Description:
28
//                      openMSP430 testbench
29
//
30
// *Author(s):
31
//              - Olivier Girard,    olgirard@gmail.com
32
//
33
//----------------------------------------------------------------------------
34 17 olivier.gi
// $Rev: 192 $
35
// $LastChangedBy: olivier.girard $
36
// $LastChangedDate: 2013-12-17 21:15:28 +0100 (Tue, 17 Dec 2013) $
37
//----------------------------------------------------------------------------
38 23 olivier.gi
`include "timescale.v"
39 103 olivier.gi
`ifdef OMSP_NO_INCLUDE
40
`else
41 23 olivier.gi
`include "openMSP430_defines.v"
42 103 olivier.gi
`endif
43 2 olivier.gi
 
44
module  tb_openMSP430;
45
 
46
//
47
// Wire & Register definition
48
//------------------------------
49
 
50 33 olivier.gi
// Data Memory interface
51
wire [`DMEM_MSB:0] dmem_addr;
52
wire               dmem_cen;
53
wire        [15:0] dmem_din;
54
wire         [1:0] dmem_wen;
55
wire        [15:0] dmem_dout;
56 2 olivier.gi
 
57 33 olivier.gi
// Program Memory interface
58
wire [`PMEM_MSB:0] pmem_addr;
59
wire               pmem_cen;
60
wire        [15:0] pmem_din;
61
wire         [1:0] pmem_wen;
62
wire        [15:0] pmem_dout;
63 2 olivier.gi
 
64
// Peripherals interface
65 111 olivier.gi
wire        [13:0] per_addr;
66 33 olivier.gi
wire        [15:0] per_din;
67
wire        [15:0] per_dout;
68 106 olivier.gi
wire         [1:0] per_we;
69 33 olivier.gi
wire               per_en;
70 2 olivier.gi
 
71
// Digital I/O
72 33 olivier.gi
wire               irq_port1;
73
wire               irq_port2;
74
wire        [15:0] per_dout_dio;
75
wire         [7:0] p1_dout;
76
wire         [7:0] p1_dout_en;
77
wire         [7:0] p1_sel;
78
wire         [7:0] p2_dout;
79
wire         [7:0] p2_dout_en;
80
wire         [7:0] p2_sel;
81
wire         [7:0] p3_dout;
82
wire         [7:0] p3_dout_en;
83
wire         [7:0] p3_sel;
84
wire         [7:0] p4_dout;
85
wire         [7:0] p4_dout_en;
86
wire         [7:0] p4_sel;
87
wire         [7:0] p5_dout;
88
wire         [7:0] p5_dout_en;
89
wire         [7:0] p5_sel;
90
wire         [7:0] p6_dout;
91
wire         [7:0] p6_dout_en;
92
wire         [7:0] p6_sel;
93
reg          [7:0] p1_din;
94
reg          [7:0] p2_din;
95
reg          [7:0] p3_din;
96
reg          [7:0] p4_din;
97
reg          [7:0] p5_din;
98
reg          [7:0] p6_din;
99 2 olivier.gi
 
100
// Peripheral templates
101 33 olivier.gi
wire        [15:0] per_dout_temp_8b;
102
wire        [15:0] per_dout_temp_16b;
103 2 olivier.gi
 
104 134 olivier.gi
// Simple full duplex UART
105
wire        [15:0] per_dout_uart;
106
wire               irq_uart_rx;
107
wire               irq_uart_tx;
108
wire               uart_txd;
109
reg                uart_rxd;
110
 
111 2 olivier.gi
// Timer A
112 33 olivier.gi
wire               irq_ta0;
113
wire               irq_ta1;
114
wire        [15:0] per_dout_timerA;
115
reg                inclk;
116
reg                taclk;
117
reg                ta_cci0a;
118
reg                ta_cci0b;
119
reg                ta_cci1a;
120
reg                ta_cci1b;
121
reg                ta_cci2a;
122
reg                ta_cci2b;
123
wire               ta_out0;
124
wire               ta_out0_en;
125
wire               ta_out1;
126
wire               ta_out1_en;
127
wire               ta_out2;
128
wire               ta_out2_en;
129 2 olivier.gi
 
130
// Clock / Reset & Interrupts
131 33 olivier.gi
reg                dco_clk;
132 134 olivier.gi
wire               dco_enable;
133
wire               dco_wkup;
134
reg                dco_local_enable;
135 33 olivier.gi
reg                lfxt_clk;
136 134 olivier.gi
wire               lfxt_enable;
137
wire               lfxt_wkup;
138
reg                lfxt_local_enable;
139 33 olivier.gi
wire               mclk;
140 134 olivier.gi
wire               aclk;
141 33 olivier.gi
wire               aclk_en;
142 134 olivier.gi
wire               smclk;
143 33 olivier.gi
wire               smclk_en;
144
reg                reset_n;
145 111 olivier.gi
wire               puc_rst;
146 33 olivier.gi
reg                nmi;
147 192 olivier.gi
reg  [`IRQ_NR-3:0] irq;
148
wire [`IRQ_NR-3:0] irq_acc;
149
wire [`IRQ_NR-3:0] irq_in;
150 106 olivier.gi
reg                cpu_en;
151 134 olivier.gi
reg         [13:0] wkup;
152
wire        [13:0] wkup_in;
153 106 olivier.gi
 
154 134 olivier.gi
// Scan (ASIC version only)
155
reg                scan_enable;
156
reg                scan_mode;
157
 
158 154 olivier.gi
// Debug interface: UART
159 106 olivier.gi
reg                dbg_en;
160 33 olivier.gi
wire               dbg_freeze;
161
wire               dbg_uart_txd;
162 134 olivier.gi
wire               dbg_uart_rxd;
163
reg                dbg_uart_rxd_sel;
164
reg                dbg_uart_rxd_dly;
165
reg                dbg_uart_rxd_pre;
166
reg                dbg_uart_rxd_meta;
167 33 olivier.gi
reg         [15:0] dbg_uart_buf;
168 134 olivier.gi
reg                dbg_uart_rx_busy;
169
reg                dbg_uart_tx_busy;
170 2 olivier.gi
 
171 154 olivier.gi
// Debug interface: I2C
172
wire               dbg_scl;
173
wire               dbg_sda;
174
wire               dbg_scl_slave;
175
wire               dbg_scl_master;
176
reg                dbg_scl_master_sel;
177
reg                dbg_scl_master_dly;
178
reg                dbg_scl_master_pre;
179
reg                dbg_scl_master_meta;
180
wire               dbg_sda_slave_out;
181
wire               dbg_sda_slave_in;
182
wire               dbg_sda_master_out;
183
reg                dbg_sda_master_out_sel;
184
reg                dbg_sda_master_out_dly;
185
reg                dbg_sda_master_out_pre;
186
reg                dbg_sda_master_out_meta;
187
wire               dbg_sda_master_in;
188
reg         [15:0] dbg_i2c_buf;
189
reg     [8*32-1:0] dbg_i2c_string;
190
 
191 2 olivier.gi
// Core testbench debuging signals
192 33 olivier.gi
wire    [8*32-1:0] i_state;
193
wire    [8*32-1:0] e_state;
194
wire        [31:0] inst_cycle;
195
wire    [8*32-1:0] inst_full;
196
wire        [31:0] inst_number;
197
wire        [15:0] inst_pc;
198
wire    [8*32-1:0] inst_short;
199 2 olivier.gi
 
200
// Testbench variables
201 33 olivier.gi
integer            error;
202
reg                stimulus_done;
203 2 olivier.gi
 
204
 
205
//
206
// Include files
207
//------------------------------
208
 
209
// CPU & Memory registers
210
`include "registers.v"
211
 
212
// Debug interface tasks
213
`include "dbg_uart_tasks.v"
214 154 olivier.gi
`include "dbg_i2c_tasks.v"
215 2 olivier.gi
 
216 134 olivier.gi
// Simple uart tasks
217
//`include "uart_tasks.v"
218
 
219 2 olivier.gi
// Verilog stimulus
220
`include "stimulus.v"
221
 
222
 
223
//
224
// Initialize ROM
225
//------------------------------
226
initial
227
  begin
228 94 olivier.gi
     #10 $readmemh("./pmem.mem", pmem_0.mem);
229 2 olivier.gi
  end
230
 
231
//
232
// Generate Clock & Reset
233
//------------------------------
234
initial
235
  begin
236 134 olivier.gi
     dco_clk          = 1'b0;
237
     dco_local_enable = 1'b0;
238
     forever
239
       begin
240 192 olivier.gi
          #25;   // 20 MHz
241
          dco_local_enable = (dco_enable===1) ? dco_enable : (dco_wkup===1);
242
          if (dco_local_enable)
243
            dco_clk = ~dco_clk;
244 134 olivier.gi
       end
245 2 olivier.gi
  end
246 134 olivier.gi
 
247 2 olivier.gi
initial
248
  begin
249 134 olivier.gi
     lfxt_clk          = 1'b0;
250
     lfxt_local_enable = 1'b0;
251
     forever
252
       begin
253 192 olivier.gi
          #763;  // 655 kHz
254
          lfxt_local_enable = (lfxt_enable===1) ? lfxt_enable : (lfxt_wkup===1);
255
          if (lfxt_local_enable)
256
            lfxt_clk = ~lfxt_clk;
257 134 olivier.gi
       end
258 2 olivier.gi
  end
259
 
260
initial
261
  begin
262
     reset_n       = 1'b1;
263 106 olivier.gi
     #93;
264 2 olivier.gi
     reset_n       = 1'b0;
265 106 olivier.gi
     #593;
266 2 olivier.gi
     reset_n       = 1'b1;
267
  end
268
 
269
initial
270
  begin
271 154 olivier.gi
     error                   = 0;
272
     stimulus_done           = 1;
273 192 olivier.gi
     irq                     = {`IRQ_NR-2{1'b0}};
274 154 olivier.gi
     nmi                     = 1'b0;
275
     wkup                    = 14'h0000;
276
     cpu_en                  = 1'b1;
277
     dbg_en                  = 1'b0;
278
     dbg_uart_rxd_sel        = 1'b0;
279
     dbg_uart_rxd_dly        = 1'b1;
280
     dbg_uart_rxd_pre        = 1'b1;
281
     dbg_uart_rxd_meta       = 1'b0;
282
     dbg_uart_buf            = 16'h0000;
283
     dbg_uart_rx_busy        = 1'b0;
284
     dbg_uart_tx_busy        = 1'b0;
285
     dbg_scl_master_sel      = 1'b0;
286
     dbg_scl_master_dly      = 1'b1;
287
     dbg_scl_master_pre      = 1'b1;
288
     dbg_scl_master_meta     = 1'b0;
289
     dbg_sda_master_out_sel  = 1'b0;
290
     dbg_sda_master_out_dly  = 1'b1;
291
     dbg_sda_master_out_pre  = 1'b1;
292
     dbg_sda_master_out_meta = 1'b0;
293
     dbg_i2c_string          = "";
294
     p1_din                  = 8'h00;
295
     p2_din                  = 8'h00;
296
     p3_din                  = 8'h00;
297
     p4_din                  = 8'h00;
298
     p5_din                  = 8'h00;
299
     p6_din                  = 8'h00;
300
     inclk                   = 1'b0;
301
     taclk                   = 1'b0;
302
     ta_cci0a                = 1'b0;
303
     ta_cci0b                = 1'b0;
304
     ta_cci1a                = 1'b0;
305
     ta_cci1b                = 1'b0;
306
     ta_cci2a                = 1'b0;
307
     ta_cci2b                = 1'b0;
308
     uart_rxd                = 1'b1;
309
     scan_enable             = 1'b0;
310
     scan_mode               = 1'b0;
311 2 olivier.gi
  end
312
 
313
 
314
//
315 33 olivier.gi
// Program Memory
316 2 olivier.gi
//----------------------------------
317
 
318 72 olivier.gi
ram #(`PMEM_MSB, `PMEM_SIZE) pmem_0 (
319 2 olivier.gi
 
320
// OUTPUTs
321 33 olivier.gi
    .ram_dout    (pmem_dout),          // Program Memory data output
322 2 olivier.gi
 
323
// INPUTs
324 33 olivier.gi
    .ram_addr    (pmem_addr),          // Program Memory address
325
    .ram_cen     (pmem_cen),           // Program Memory chip enable (low active)
326
    .ram_clk     (mclk),               // Program Memory clock
327
    .ram_din     (pmem_din),           // Program Memory data input
328
    .ram_wen     (pmem_wen)            // Program Memory write enable (low active)
329 2 olivier.gi
);
330
 
331
 
332
//
333 33 olivier.gi
// Data Memory
334 2 olivier.gi
//----------------------------------
335
 
336 72 olivier.gi
ram #(`DMEM_MSB, `DMEM_SIZE) dmem_0 (
337 2 olivier.gi
 
338
// OUTPUTs
339 33 olivier.gi
    .ram_dout    (dmem_dout),          // Data Memory data output
340 2 olivier.gi
 
341
// INPUTs
342 33 olivier.gi
    .ram_addr    (dmem_addr),          // Data Memory address
343
    .ram_cen     (dmem_cen),           // Data Memory chip enable (low active)
344
    .ram_clk     (mclk),               // Data Memory clock
345
    .ram_din     (dmem_din),           // Data Memory data input
346
    .ram_wen     (dmem_wen)            // Data Memory write enable (low active)
347 2 olivier.gi
);
348
 
349
 
350
//
351
// openMSP430 Instance
352
//----------------------------------
353
 
354
openMSP430 dut (
355
 
356
// OUTPUTs
357 154 olivier.gi
    .aclk              (aclk),              // ASIC ONLY: ACLK
358
    .aclk_en           (aclk_en),           // FPGA ONLY: ACLK enable
359
    .dbg_freeze        (dbg_freeze),        // Freeze peripherals
360
    .dbg_i2c_sda_out   (dbg_sda_slave_out), // Debug interface: I2C SDA OUT
361
    .dbg_uart_txd      (dbg_uart_txd),      // Debug interface: UART TXD
362
    .dco_enable        (dco_enable),        // ASIC ONLY: Fast oscillator enable
363
    .dco_wkup          (dco_wkup),          // ASIC ONLY: Fast oscillator wake-up (asynchronous)
364
    .dmem_addr         (dmem_addr),         // Data Memory address
365
    .dmem_cen          (dmem_cen),          // Data Memory chip enable (low active)
366
    .dmem_din          (dmem_din),          // Data Memory data input
367
    .dmem_wen          (dmem_wen),          // Data Memory write enable (low active)
368
    .irq_acc           (irq_acc),           // Interrupt request accepted (one-hot signal)
369
    .lfxt_enable       (lfxt_enable),       // ASIC ONLY: Low frequency oscillator enable
370
    .lfxt_wkup         (lfxt_wkup),         // ASIC ONLY: Low frequency oscillator wake-up (asynchronous)
371
    .mclk              (mclk),              // Main system clock
372
    .per_addr          (per_addr),          // Peripheral address
373
    .per_din           (per_din),           // Peripheral data input
374
    .per_we            (per_we),            // Peripheral write enable (high active)
375
    .per_en            (per_en),            // Peripheral enable (high active)
376
    .pmem_addr         (pmem_addr),         // Program Memory address
377
    .pmem_cen          (pmem_cen),          // Program Memory chip enable (low active)
378
    .pmem_din          (pmem_din),          // Program Memory data input (optional)
379
    .pmem_wen          (pmem_wen),          // Program Memory write enable (low active) (optional)
380
    .puc_rst           (puc_rst),           // Main system reset
381
    .smclk             (smclk),             // ASIC ONLY: SMCLK
382
    .smclk_en          (smclk_en),          // FPGA ONLY: SMCLK enable
383 2 olivier.gi
 
384
// INPUTs
385 154 olivier.gi
    .cpu_en            (cpu_en),            // Enable CPU code execution (asynchronous)
386
    .dbg_en            (dbg_en),            // Debug interface enable (asynchronous)
387
    .dbg_i2c_addr      (I2C_ADDR),          // Debug interface: I2C Address
388
    .dbg_i2c_broadcast (I2C_BROADCAST),     // Debug interface: I2C Broadcast Address (for multicore systems)
389
    .dbg_i2c_scl       (dbg_scl_slave),     // Debug interface: I2C SCL
390
    .dbg_i2c_sda_in    (dbg_sda_slave_in),  // Debug interface: I2C SDA IN
391
    .dbg_uart_rxd      (dbg_uart_rxd),      // Debug interface: UART RXD (asynchronous)
392
    .dco_clk           (dco_clk),           // Fast oscillator (fast clock)
393
    .dmem_dout         (dmem_dout),         // Data Memory data output
394
    .irq               (irq_in),            // Maskable interrupts
395
    .lfxt_clk          (lfxt_clk),          // Low frequency oscillator (typ 32kHz)
396
    .nmi               (nmi),               // Non-maskable interrupt (asynchronous)
397
    .per_dout          (per_dout),          // Peripheral data output
398
    .pmem_dout         (pmem_dout),         // Program Memory data output
399
    .reset_n           (reset_n),           // Reset Pin (low active, asynchronous)
400
    .scan_enable       (scan_enable),       // ASIC ONLY: Scan enable (active during scan shifting)
401
    .scan_mode         (scan_mode),         // ASIC ONLY: Scan mode
402
    .wkup              (|wkup_in)           // ASIC ONLY: System Wake-up (asynchronous)
403 2 olivier.gi
);
404
 
405
//
406
// Digital I/O
407
//----------------------------------
408
 
409 99 olivier.gi
`ifdef CVER
410
omsp_gpio #(1,
411
            1,
412
            1,
413
            1,
414
            1,
415
            1)         gpio_0 (
416
`else
417 34 olivier.gi
omsp_gpio #(.P1_EN(1),
418
            .P2_EN(1),
419
            .P3_EN(1),
420
            .P4_EN(1),
421
            .P5_EN(1),
422
            .P6_EN(1)) gpio_0 (
423 99 olivier.gi
`endif
424 2 olivier.gi
 
425
// OUTPUTs
426
    .irq_port1    (irq_port1),         // Port 1 interrupt
427
    .irq_port2    (irq_port2),         // Port 2 interrupt
428
    .p1_dout      (p1_dout),           // Port 1 data output
429
    .p1_dout_en   (p1_dout_en),        // Port 1 data output enable
430
    .p1_sel       (p1_sel),            // Port 1 function select
431
    .p2_dout      (p2_dout),           // Port 2 data output
432
    .p2_dout_en   (p2_dout_en),        // Port 2 data output enable
433
    .p2_sel       (p2_sel),            // Port 2 function select
434
    .p3_dout      (p3_dout),           // Port 3 data output
435
    .p3_dout_en   (p3_dout_en),        // Port 3 data output enable
436
    .p3_sel       (p3_sel),            // Port 3 function select
437
    .p4_dout      (p4_dout),           // Port 4 data output
438
    .p4_dout_en   (p4_dout_en),        // Port 4 data output enable
439
    .p4_sel       (p4_sel),            // Port 4 function select
440
    .p5_dout      (p5_dout),           // Port 5 data output
441
    .p5_dout_en   (p5_dout_en),        // Port 5 data output enable
442
    .p5_sel       (p5_sel),            // Port 5 function select
443
    .p6_dout      (p6_dout),           // Port 6 data output
444
    .p6_dout_en   (p6_dout_en),        // Port 6 data output enable
445
    .p6_sel       (p6_sel),            // Port 6 function select
446
    .per_dout     (per_dout_dio),      // Peripheral data output
447 192 olivier.gi
 
448 2 olivier.gi
// INPUTs
449
    .mclk         (mclk),              // Main system clock
450
    .p1_din       (p1_din),            // Port 1 data input
451
    .p2_din       (p2_din),            // Port 2 data input
452
    .p3_din       (p3_din),            // Port 3 data input
453
    .p4_din       (p4_din),            // Port 4 data input
454
    .p5_din       (p5_din),            // Port 5 data input
455
    .p6_din       (p6_din),            // Port 6 data input
456
    .per_addr     (per_addr),          // Peripheral address
457
    .per_din      (per_din),           // Peripheral data input
458
    .per_en       (per_en),            // Peripheral enable (high active)
459 106 olivier.gi
    .per_we       (per_we),            // Peripheral write enable (high active)
460 111 olivier.gi
    .puc_rst      (puc_rst)            // Main system reset
461 2 olivier.gi
);
462
 
463
//
464
// Timers
465
//----------------------------------
466
 
467 34 olivier.gi
omsp_timerA timerA_0 (
468 2 olivier.gi
 
469
// OUTPUTs
470
    .irq_ta0      (irq_ta0),           // Timer A interrupt: TACCR0
471
    .irq_ta1      (irq_ta1),           // Timer A interrupt: TAIV, TACCR1, TACCR2
472
    .per_dout     (per_dout_timerA),   // Peripheral data output
473
    .ta_out0      (ta_out0),           // Timer A output 0
474
    .ta_out0_en   (ta_out0_en),        // Timer A output 0 enable
475
    .ta_out1      (ta_out1),           // Timer A output 1
476
    .ta_out1_en   (ta_out1_en),        // Timer A output 1 enable
477
    .ta_out2      (ta_out2),           // Timer A output 2
478
    .ta_out2_en   (ta_out2_en),        // Timer A output 2 enable
479
 
480
// INPUTs
481
    .aclk_en      (aclk_en),           // ACLK enable (from CPU)
482
    .dbg_freeze   (dbg_freeze),        // Freeze Timer A counter
483
    .inclk        (inclk),             // INCLK external timer clock (SLOW)
484 192 olivier.gi
    .irq_ta0_acc  (irq_acc[`IRQ_NR-7]),// Interrupt request TACCR0 accepted
485 2 olivier.gi
    .mclk         (mclk),              // Main system clock
486
    .per_addr     (per_addr),          // Peripheral address
487
    .per_din      (per_din),           // Peripheral data input
488
    .per_en       (per_en),            // Peripheral enable (high active)
489 106 olivier.gi
    .per_we       (per_we),            // Peripheral write enable (high active)
490 111 olivier.gi
    .puc_rst      (puc_rst),           // Main system reset
491 2 olivier.gi
    .smclk_en     (smclk_en),          // SMCLK enable (from CPU)
492
    .ta_cci0a     (ta_cci0a),          // Timer A compare 0 input A
493
    .ta_cci0b     (ta_cci0b),          // Timer A compare 0 input B
494
    .ta_cci1a     (ta_cci1a),          // Timer A compare 1 input A
495
    .ta_cci1b     (ta_cci1b),          // Timer A compare 1 input B
496
    .ta_cci2a     (ta_cci2a),          // Timer A compare 2 input A
497
    .ta_cci2b     (ta_cci2b),          // Timer A compare 2 input B
498
    .taclk        (taclk)              // TACLK external timer clock (SLOW)
499
);
500
 
501
//
502 134 olivier.gi
// Simple full duplex UART (8N1 protocol)
503
//----------------------------------------
504
`ifdef READY_FOR_PRIMETIME
505
omsp_uart #(.BASE_ADDR(15'h0080)) uart_0 (
506
 
507
// OUTPUTs
508
    .irq_uart_rx  (irq_uart_rx),   // UART receive interrupt
509
    .irq_uart_tx  (irq_uart_tx),   // UART transmit interrupt
510
    .per_dout     (per_dout_uart), // Peripheral data output
511
    .uart_txd     (uart_txd),      // UART Data Transmit (TXD)
512
 
513
// INPUTs
514
    .mclk         (mclk),          // Main system clock
515
    .per_addr     (per_addr),      // Peripheral address
516
    .per_din      (per_din),       // Peripheral data input
517
    .per_en       (per_en),        // Peripheral enable (high active)
518
    .per_we       (per_we),        // Peripheral write enable (high active)
519
    .puc_rst      (puc_rst),       // Main system reset
520
    .smclk_en     (smclk_en),      // SMCLK enable (from CPU)
521
    .uart_rxd     (uart_rxd)       // UART Data Receive (RXD)
522
);
523
`else
524
    assign irq_uart_rx   =  1'b0;
525
    assign irq_uart_tx   =  1'b0;
526
    assign per_dout_uart = 16'h0000;
527
    assign uart_txd      =  1'b0;
528
`endif
529
 
530
//
531 2 olivier.gi
// Peripheral templates
532
//----------------------------------
533
 
534
template_periph_8b template_periph_8b_0 (
535
 
536
// OUTPUTs
537
    .per_dout     (per_dout_temp_8b),  // Peripheral data output
538
 
539
// INPUTs
540
    .mclk         (mclk),              // Main system clock
541
    .per_addr     (per_addr),          // Peripheral address
542
    .per_din      (per_din),           // Peripheral data input
543
    .per_en       (per_en),            // Peripheral enable (high active)
544 106 olivier.gi
    .per_we       (per_we),            // Peripheral write enable (high active)
545 111 olivier.gi
    .puc_rst      (puc_rst)            // Main system reset
546 2 olivier.gi
);
547
 
548 111 olivier.gi
`ifdef CVER
549
template_periph_16b #(15'h0190)             template_periph_16b_0 (
550
`else
551 151 olivier.gi
template_periph_16b #(.BASE_ADDR((15'd`PER_SIZE-15'h0070) & 15'h7ff8)) template_periph_16b_0 (
552 111 olivier.gi
`endif
553 2 olivier.gi
// OUTPUTs
554
    .per_dout     (per_dout_temp_16b), // Peripheral data output
555
 
556
// INPUTs
557
    .mclk         (mclk),              // Main system clock
558
    .per_addr     (per_addr),          // Peripheral address
559
    .per_din      (per_din),           // Peripheral data input
560
    .per_en       (per_en),            // Peripheral enable (high active)
561 106 olivier.gi
    .per_we       (per_we),            // Peripheral write enable (high active)
562 111 olivier.gi
    .puc_rst      (puc_rst)            // Main system reset
563 2 olivier.gi
);
564
 
565
 
566
//
567
// Combine peripheral data bus
568
//----------------------------------
569
 
570
assign per_dout = per_dout_dio       |
571
                  per_dout_timerA    |
572 134 olivier.gi
                  per_dout_uart      |
573 2 olivier.gi
                  per_dout_temp_8b   |
574
                  per_dout_temp_16b;
575
 
576
 
577
//
578 134 olivier.gi
// Map peripheral interrupts & wakeups
579 2 olivier.gi
//----------------------------------------
580
 
581 192 olivier.gi
assign irq_in  = irq  | {1'b0,                 // Vector 13  (0xFFFA)
582
                         1'b0,                 // Vector 12  (0xFFF8)
583
                         1'b0,                 // Vector 11  (0xFFF6)
584
                         1'b0,                 // Vector 10  (0xFFF4) - Watchdog -
585
                         irq_ta0,              // Vector  9  (0xFFF2)
586
                         irq_ta1,              // Vector  8  (0xFFF0)
587
                         irq_uart_rx,          // Vector  7  (0xFFEE)
588
                         irq_uart_tx,          // Vector  6  (0xFFEC)
589
                         1'b0,                 // Vector  5  (0xFFEA)
590
                         1'b0,                 // Vector  4  (0xFFE8)
591
                         irq_port2,            // Vector  3  (0xFFE6)
592
                         irq_port1,            // Vector  2  (0xFFE4)
593
                         1'b0,                 // Vector  1  (0xFFE2)
594
                         {`IRQ_NR-15{1'b0}}};  // Vector  0  (0xFFE0)
595 2 olivier.gi
 
596 192 olivier.gi
assign wkup_in = wkup | {1'b0,                 // Vector 13  (0xFFFA)
597
                         1'b0,                 // Vector 12  (0xFFF8)
598
                         1'b0,                 // Vector 11  (0xFFF6)
599
                         1'b0,                 // Vector 10  (0xFFF4) - Watchdog -
600
                         1'b0,                 // Vector  9  (0xFFF2)
601
                         1'b0,                 // Vector  8  (0xFFF0)
602
                         1'b0,                 // Vector  7  (0xFFEE)
603
                         1'b0,                 // Vector  6  (0xFFEC)
604
                         1'b0,                 // Vector  5  (0xFFEA)
605
                         1'b0,                 // Vector  4  (0xFFE8)
606
                         1'b0,                 // Vector  3  (0xFFE6)
607
                         1'b0,                 // Vector  2  (0xFFE4)
608
                         1'b0,                 // Vector  1  (0xFFE2)
609
                         1'b0};                // Vector  0  (0xFFE0)
610 2 olivier.gi
 
611 134 olivier.gi
 
612 2 olivier.gi
//
613 154 olivier.gi
// I2C serial debug interface
614
//----------------------------------
615
 
616
// I2C Bus
617
//.........................
618
pullup dbg_scl_inst (dbg_scl);
619
pullup dbg_sda_inst (dbg_sda);
620
 
621
// I2C Slave (openMSP430)
622
//.........................
623
io_cell scl_slave_inst (
624
  .pad         (dbg_scl),             // I/O pad
625
  .data_in     (dbg_scl_slave),       // Input
626
  .data_out_en (1'b0),                // Output enable
627
  .data_out    (1'b0)                 // Output
628
);
629 192 olivier.gi
 
630 154 olivier.gi
io_cell sda_slave_inst (
631
  .pad         (dbg_sda),             // I/O pad
632
  .data_in     (dbg_sda_slave_in),    // Input
633
  .data_out_en (!dbg_sda_slave_out),  // Output enable
634
  .data_out    (1'b0)                 // Output
635
);
636
 
637
// I2C Master (Debugger)
638
//.........................
639
io_cell scl_master_inst (
640
  .pad         (dbg_scl),             // I/O pad
641
  .data_in     (),                    // Input
642
  .data_out_en (!dbg_scl_master),     // Output enable
643
  .data_out    (1'b0)                 // Output
644
);
645 192 olivier.gi
 
646 154 olivier.gi
io_cell sda_master_inst (
647
  .pad         (dbg_sda),             // I/O pad
648
  .data_in     (dbg_sda_master_in),   // Input
649
  .data_out_en (!dbg_sda_master_out), // Output enable
650
  .data_out    (1'b0)                 // Output
651
);
652
 
653
 
654
//
655 2 olivier.gi
// Debug utility signals
656
//----------------------------------------
657
msp_debug msp_debug_0 (
658
 
659
// OUTPUTs
660
    .e_state      (e_state),           // Execution state
661
    .i_state      (i_state),           // Instruction fetch state
662
    .inst_cycle   (inst_cycle),        // Cycle number within current instruction
663
    .inst_full    (inst_full),         // Currently executed instruction (full version)
664
    .inst_number  (inst_number),       // Instruction number since last system reset
665
    .inst_pc      (inst_pc),           // Instruction Program counter
666
    .inst_short   (inst_short),        // Currently executed instruction (short version)
667
 
668
// INPUTs
669
    .mclk         (mclk),              // Main system clock
670 111 olivier.gi
    .puc_rst      (puc_rst)            // Main system reset
671 2 olivier.gi
);
672
 
673
 
674
//
675
// Generate Waveform
676
//----------------------------------------
677
initial
678
  begin
679 65 olivier.gi
   `ifdef NODUMP
680 2 olivier.gi
   `else
681 65 olivier.gi
     `ifdef VPD_FILE
682
        $vcdplusfile("tb_openMSP430.vpd");
683
        $vcdpluson();
684
     `else
685 98 olivier.gi
       `ifdef TRN_FILE
686
          $recordfile ("tb_openMSP430.trn");
687
          $recordvars;
688
       `else
689
          $dumpfile("tb_openMSP430.vcd");
690
          $dumpvars(0, tb_openMSP430);
691
       `endif
692 65 olivier.gi
     `endif
693 2 olivier.gi
   `endif
694
  end
695
 
696
//
697
// End of simulation
698
//----------------------------------------
699
 
700
initial // Timeout
701
  begin
702 67 olivier.gi
   `ifdef NO_TIMEOUT
703
   `else
704 134 olivier.gi
     `ifdef VERY_LONG_TIMEOUT
705
       #500000000;
706
     `else
707 67 olivier.gi
     `ifdef LONG_TIMEOUT
708
       #5000000;
709
     `else
710
       #500000;
711
     `endif
712 134 olivier.gi
     `endif
713 67 olivier.gi
       $display(" ===============================================");
714
       $display("|               SIMULATION FAILED               |");
715
       $display("|              (simulation Timeout)             |");
716
       $display(" ===============================================");
717
       $finish;
718 2 olivier.gi
   `endif
719
  end
720
 
721
initial // Normal end of test
722
  begin
723 94 olivier.gi
     @(negedge stimulus_done);
724
     wait(inst_pc=='hffff);
725
 
726 2 olivier.gi
     $display(" ===============================================");
727
     if (error!=0)
728
       begin
729 192 olivier.gi
          $display("|               SIMULATION FAILED               |");
730
          $display("|     (some verilog stimulus checks failed)     |");
731 2 olivier.gi
       end
732
     else if (~stimulus_done)
733
       begin
734 192 olivier.gi
          $display("|               SIMULATION FAILED               |");
735
          $display("|     (the verilog stimulus didn't complete)    |");
736 2 olivier.gi
       end
737
     else
738
       begin
739 192 olivier.gi
          $display("|               SIMULATION PASSED               |");
740 2 olivier.gi
       end
741
     $display(" ===============================================");
742
     $finish;
743
  end
744
 
745
 
746
//
747
// Tasks Definition
748
//------------------------------
749
 
750
   task tb_error;
751
      input [65*8:0] error_string;
752
      begin
753 192 olivier.gi
         $display("ERROR: %s %t", error_string, $time);
754
         error = error+1;
755 2 olivier.gi
      end
756
   endtask
757
 
758
 
759
endmodule

powered by: WebSVN 2.1.0

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