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

Subversion Repositories apb_slave

[/] [apb_slave/] [trunk/] [src/] [base/] [apb_slave.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 eyalhoc
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Author: Eyal Hochberg                                      ////
4
////          eyal@provartec.com                                 ////
5
////                                                             ////
6
////  Downloaded from: http://www.opencores.org                  ////
7
/////////////////////////////////////////////////////////////////////
8
////                                                             ////
9
//// Copyright (C) 2010 Provartec LTD                            ////
10
//// www.provartec.com                                           ////
11
//// info@provartec.com                                          ////
12
////                                                             ////
13
//// This source file may be used and distributed without        ////
14
//// restriction provided that this copyright statement is not   ////
15
//// removed from the file and that any derivative work contains ////
16
//// the original copyright notice and the associated disclaimer.////
17
////                                                             ////
18
//// This source file is free software; you can redistribute it  ////
19
//// and/or modify it under the terms of the GNU Lesser General  ////
20
//// Public License as published by the Free Software Foundation.////
21
////                                                             ////
22
//// This source is distributed in the hope that it will be      ////
23
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
24
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
25
//// PURPOSE.  See the GNU Lesser General Public License for more////
26
//// details. http://www.gnu.org/licenses/lgpl.html              ////
27
////                                                             ////
28
/////////////////////////////////////////////////////////////////////
29
 
30
//////////////////////////////////////
31
//
32
// General:
33
//   The APB slave can use APB or APB3 protocol (APB3 is with pslverr and pready)
34
//   APB3 is set by DEFINE in def_apb_slave.txt
35
//   All following tasks regard APB3 only.
36
//
37
//
38
// Tasks:
39
//
40
// set_random_delay(input min_delay, input max_delay)
41
//   Description: Set random wait states on pready
42
//   Parameters: min_delay - minimum delay
43
//               max_delay = maximum delay
44
//
45
// set_fixed_delay(input delay)
46
//   Description: Set fixed wait states on pready
47
//   Parameters: delay - fixed delay on pready
48
//
49
// set_slverr(input address)
50
//   Description: Set address to return slave error (pslverr)
51
//   Parameters: address - address will return pslverr
52
// 
53
// 
54
//////////////////////////////////////
55
 
56
 
57
OUTFILE PREFIX.v
58
 
59
INCLUDE def_apb_slave.txt
60
 
61
module PREFIX(PORTS);
62
 
63
`include "prgen_rand.v"
64
 
65
   parameter                  SLAVE_NUM = 0;
66
 
67
   input                      clk;
68
   input                      reset;
69
 
70
   revport                    GROUP_STUB_APB;
71
 
72
 
73
 
74
   wire                       GROUP_STUB_MEM;
75
 
76
IFDEF APB3
77
  reg                busy_rand_enable = 0; //enable random busy
78
  integer            busy_min         = 0; //min busy cycles
79
  integer            busy_max         = 5; //max busy cycles
80
   integer           busy_delay       = 1; //fixed delay for pready
81
 
82
   reg               err_enable = 0;
83
   reg [ADDR_BITS-1:0] err_addr = {ADDR_BITS{1'b1}}; //error address
84
 
85
 
86
   wire               pslverr   = err_enable && (paddr == err_addr);
87
   reg                pready = 1'b1;
88
 
89
   always @(negedge clk)
90
     begin
91
        #FFD;
92
        if (psel)
93
          begin
94
             if (busy_rand_enable)
95
               begin
96
                  busy_delay = rand(busy_min, busy_max);
97
               end
98
             if (busy_delay > 0)
99
               begin
100
                  pready = 1'b0;
101
                  repeat (busy_delay)
102
                    begin
103
                       @(posedge clk); #FFD;
104
                    end
105
                  pready = 1'b1;
106
                  @(posedge clk); #FFD;
107
               end
108
          end
109
     end
110
 
111
 
112
   task set_random_delay;
113
      input [31:0] delay_min;
114
      input [31:0] delay_max;
115
      begin
116
         busy_rand_enable = 1;
117
         busy_min = delay_min;
118
         busy_max = delay_max;
119
      end
120
   endtask
121
 
122
   task set_fixed_delay;
123
      input [31:0] delay;
124
      begin
125
         busy_rand_enable = 0;
126
         busy_delay = delay;
127
      end
128
   endtask
129
 
130
   task set_slverr;
131
      input [31:0] addr;
132
      begin
133
         err_enable = 1;
134
         err_addr = addr;
135
      end
136
   endtask
137
 
138
 
139
 
140
ELSE APB3
141
   wire  pready  = 1'b1;
142
   wire  pslverr = 1'b0;
143
ENDIF APB3
144
 
145
 
146
 
147
   assign WR      = psel & penable & pwrite;
148
   assign RD      = psel & (~penable) & (~pwrite);
149
   assign ADDR_WR = paddr;
150
   assign ADDR_RD = paddr;
151
   assign DIN     = pwdata;
152
   assign BSEL    = 4'b1111;
153
   assign prdata  = pready ? DOUT : {DATA_BITS{1'bx}};
154
 
155
 
156
 
157
   CREATE apb_slave_mem.v
158
   PREFIX_mem PREFIX_mem(
159
                         .clk(clk),
160
                         .reset(reset),
161
                         .GROUP_STUB_MEM(GROUP_STUB_MEM),
162
                         STOMP ,
163
                         );
164
 
165
 
166
 
167
   IFDEF TRACE
168
     CREATE apb_slave_trace.v
169
       PREFIX_trace #(SLAVE_NUM)
170
         PREFIX_trace(
171
                      .clk(clk),
172
                      .reset(reset),
173
                      .GROUP_STUB_MEM(GROUP_STUB_MEM),
174
                      STOMP ,
175
                      );
176
 
177
   ENDIF TRACE
178
 
179
endmodule
180
 
181
 

powered by: WebSVN 2.1.0

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