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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [core/] [sim/] [rtl_sim/] [src/] [dma_rdwr_16b.v] - Blame information for rev 202

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 202 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
/*                              DMA INTERFACE                                */
25
/*---------------------------------------------------------------------------*/
26
/* Test the DMA interface:                                                   */
27
/*                        - Check Memory RD/WR features.                     */
28
/*                                                                           */
29
/* Author(s):                                                                */
30
/*             - Olivier Girard,    olgirard@gmail.com                       */
31
/*                                                                           */
32
/*---------------------------------------------------------------------------*/
33
/* $Rev$                                                                */
34
/* $LastChangedBy$                                          */
35
/* $LastChangedDate$          */
36
/*===========================================================================*/
37
 
38
`define VERY_LONG_TIMEOUT
39
 
40
parameter TMPL16B_CNTRL1  = (((`PER_SIZE-'h0070) & 'h7ff8)+'h0000);
41
parameter TMPL16B_CNTRL2  = (((`PER_SIZE-'h0070) & 'h7ff8)+'h0002);
42
parameter TMPL16B_CNTRL3  = (((`PER_SIZE-'h0070) & 'h7ff8)+'h0004);
43
parameter TMPL16B_CNTRL4  = (((`PER_SIZE-'h0070) & 'h7ff8)+'h0006);
44
 
45
integer jj;
46
integer inst_number_old;
47
integer inst_number_diff;
48
 
49
initial
50
   begin
51
      $display(" ===============================================");
52
      $display("|                 START SIMULATION              |");
53
      $display(" ===============================================");
54
`ifdef DMA_IF_EN
55
      // Disable automatic DMA verification
56
      #10;
57
      dma_verif_on = 0;
58
 
59
      repeat(30) @(posedge mclk);
60
      stimulus_done = 0;
61
 
62
      //-------------------------------------------------------------
63
      // LOW/HIGH PRIORITY DMA
64
      //-------------------------------------------------------------
65
      for ( jj=0; jj<=1; jj=jj+1)
66
        begin
67
           if (jj==0)
68
             begin
69
                dma_priority=0;
70
                $display("\n\n---------------------------------------");
71
                $display("   LOW Priority 16B DMA transfer tests");
72
                $display("---------------------------------------\n");
73
             end
74
           else
75
             begin
76
                dma_priority=1;
77
                $display("\n\n---------------------------------------");
78
                $display("   HIGH Priority 16B DMA transfer tests");
79
                $display("---------------------------------------\n");
80
             end
81
 
82
           // RD/WR ACCESS: Program memory (16b)
83
           //--------------------------------------------------------
84
           $display("MARCH-X: Program memory 16b:");
85
 
86
           // Wait random time until MARCH-X starts
87
           dma_rand_wait = $urandom_range(1,40);
88
           repeat(dma_rand_wait) @(posedge mclk);
89
 
90
           // Run MARCH-X on program memory
91
           // (make sure we don't overwrite firmware, i.e. the first 48 bytes)
92
           inst_number_old=inst_number;
93
           march_x_16b(('h10000-`PMEM_SIZE+48), 16'hfffe, 1);
94
           inst_number_diff=inst_number-inst_number_old;
95
           if ( dma_priority & (inst_number_diff>2))   tb_error("CPU is not stopped in high priority mode");
96
           if (~dma_priority & (inst_number_diff<500)) tb_error("CPU is stopped in low priority mode");
97
 
98
           // RD/WR ACCESS: Data memory (16b)
99
           //--------------------------------------------------------
100
           $display("\n\nMARCH-X: Data memory 16b:");
101
 
102
           // Wait random time until MARCH-X starts
103
           dma_rand_wait = $urandom_range(1,40);
104
           repeat(dma_rand_wait) @(posedge mclk);
105
 
106
           // Run MARCH-X on data memory
107
           // (make sure we don't overwrite firmware data, i.e. DMEM_200)
108
           inst_number_old=inst_number;
109
           march_x_16b((`PER_SIZE+2), (`PER_SIZE+`DMEM_SIZE-2), 1);
110
           inst_number_diff=inst_number-inst_number_old;
111
           if ( dma_priority & (inst_number_diff>2))   tb_error("CPU is not stopped in high priority mode");
112
           if (~dma_priority & (inst_number_diff<100)) tb_error("CPU is stopped in low priority mode");
113
 
114
           // RD/WR ACCESS: Peripheral memory (16b)
115
           //--------------------------------------------------------
116
           $display("\n\nMARCH-X: Peripheral memory 16b ...");
117
 
118
           // Wait random time until MARCH-X starts
119
           dma_rand_wait = $urandom_range(1,40);
120
           repeat(dma_rand_wait) @(posedge mclk);
121
 
122
           // Run MARCH-X on 16B template peripheral
123
           inst_number_old=inst_number;
124
           repeat(100) march_x_16b(TMPL16B_CNTRL1, TMPL16B_CNTRL4, 0);
125
           inst_number_diff=inst_number-inst_number_old;
126
           if ( dma_priority & (inst_number_diff>2))   tb_error("CPU is not stopped in high priority mode");
127
           if (~dma_priority & (inst_number_diff<500)) tb_error("CPU is stopped in low priority mode");
128
        end
129
 
130
      // End of test
131
      //--------------------------------------------------
132
      $display("\n");
133
      repeat(3000) @(posedge mclk);
134
      dma_write_16b(16'h0000-`PMEM_SIZE, 16'h0001, 1'b0);
135
 
136
      @(r15==16'h2000);
137
      if (r10 !== mem200) tb_error("Final Increment counter missmatch... firmware execution failed");
138
 
139
      stimulus_done = 1;
140
`else
141
       tb_skip_finish("|      (DMA interface support not included)    |");
142
`endif
143
   end
144
 
145
//-------------------------------------------------------------
146
// Make sure firmware executes properly during the whole test
147
//-------------------------------------------------------------
148
 
149
// Make sure there is the right amount of clock cycle between the counter increments
150
// (low-priority mode only)
151
integer mclk_cnt;
152
always @(posedge mclk) mclk_cnt=mclk_cnt+1;
153
 
154
// Check counter increment
155
initial
156
  begin
157
     // Wait for firmware to start
158
     @(r15==16'h1000);
159
 
160
     // Synchronize with first increment
161
     @(mem200); @(negedge mclk);
162
     mclk_cnt=0;
163
 
164
     forever
165
       begin
166
          // When register R10 is incremented, make sure DMEM_200 = R10-1
167
          @(r10); @(negedge mclk);
168
          if (r10 !== (mem200+1))                                 tb_error("R10 Increment counter missmatch... firmware execution failed");
169
          if (~dma_priority & ((mclk_cnt < 4) | (mclk_cnt > 10))) tb_error("DMEM_200 -> R10 exec time error... firmware execution failed");
170
          mclk_cnt=0;
171
 
172
          // When DMEM_200 is incremented, make sure DMEM_200 = R10
173
          @(mem200); @(negedge mclk);
174
          if (r10 !== mem200)                                     tb_error("DMEM_200 Increment counter missmatch... firmware execution failed");
175
          if (~dma_priority & ((mclk_cnt < 3) | (mclk_cnt > 9)))  tb_error("R10 -> DMEM_200 exec time error... firmware execution failed");
176
          mclk_cnt=0;
177
       end
178
  end
179
 
180
 
181
//------------------------------------------------------
182
// MARCH-X functions
183
//------------------------------------------------------
184
task march_x_16b;
185
   input  [15:0] addr_start;
186
   input  [15:0] addr_end;
187
   input         verbose;
188
 
189
   integer       ii;
190
   begin
191
      // MARCH X : down (w0); up (r0,w1); down (r1,w0); up (r0)
192
 
193
      if (verbose) $display("                                - down(w0)    ... ");
194
      for ( ii=addr_end; ii >= addr_start; ii=ii-2)
195
        begin
196
           dma_write_16b(ii, 16'h0000, 1'b0);
197
        end
198
 
199
      if (verbose) $display("                                - up(r0,w1)   ... ");
200
      for ( ii=addr_start; ii <= addr_end; ii=ii+2)
201
        begin
202
           dma_read_16b(ii,  16'h0000, 1'b0);
203
           dma_write_16b(ii, 16'hffff, 1'b0);
204
        end
205
 
206
      if (verbose) $display("                                - down(r1,w0) ... ");
207
      for ( ii=addr_end; ii >= addr_start; ii=ii-2)
208
        begin
209
           dma_read_16b(ii,  16'hffff, 1'b0);
210
           dma_write_16b(ii, 16'h0000, 1'b0);
211
        end
212
 
213
      if (verbose) $display("                                - up(r0)      ... ");
214
      for ( ii=addr_start; ii <= addr_end; ii=ii+2)
215
        begin
216
           dma_read_16b(ii,  16'h0000, 1'b0);
217
        end
218
   end
219
endtask // march_x_16b

powered by: WebSVN 2.1.0

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