AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
Main Page
Design Unit List
Files
File List
All
Classes
Files
Variables
src
common
DDR
ddr3_1_9_a
controller
mig_7series_v1_9_round_robin_arb.v
1
//*****************************************************************************
2
// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
3
//
4
// This file contains confidential and proprietary information
5
// of Xilinx, Inc. and is protected under U.S. and
6
// international copyright and other intellectual property
7
// laws.
8
//
9
// DISCLAIMER
10
// This disclaimer is not a license and does not grant any
11
// rights to the materials distributed herewith. Except as
12
// otherwise provided in a valid license issued to you by
13
// Xilinx, and to the maximum extent permitted by applicable
14
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19
// (2) Xilinx shall not be liable (whether in contract or tort,
20
// including negligence, or under any other theory of
21
// liability) for any loss or damage of any kind or nature
22
// related to, arising under or in connection with these
23
// materials, including for any direct, or any indirect,
24
// special, incidental, or consequential loss or damage
25
// (including loss of data, profits, goodwill, or any type of
26
// loss or damage suffered as a result of any action brought
27
// by a third party) even if such damage or loss was
28
// reasonably foreseeable or Xilinx had been advised of the
29
// possibility of the same.
30
//
31
// CRITICAL APPLICATIONS
32
// Xilinx products are not designed or intended to be fail-
33
// safe, or for use in any application requiring fail-safe
34
// performance, such as life-support or safety devices or
35
// systems, Class III medical devices, nuclear facilities,
36
// applications related to the deployment of airbags, or any
37
// other applications that could lead to death, personal
38
// injury, or severe property or environmental damage
39
// (individually and collectively, "Critical
40
// Applications"). Customer assumes the sole risk and
41
// liability of any use of Xilinx products in Critical
42
// Applications, subject only to applicable laws and
43
// regulations governing limitations on product liability.
44
//
45
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46
// PART OF THIS FILE AT ALL TIMES.
47
//
48
//*****************************************************************************
49
// ____ ____
50
// / /\/ /
51
// /___/ \ / Vendor : Xilinx
52
// \ \ \/ Version : %version
53
// \ \ Application : MIG
54
// / / Filename : round_robin_arb.v
55
// /___/ /\ Date Last Modified : $date$
56
// \ \ / \ Date Created : Tue Jun 30 2009
57
// \___\/\___\
58
//
59
//Device : 7-Series
60
//Design Name : DDR3 SDRAM
61
//Purpose :
62
//Reference :
63
//Revision History :
64
//*****************************************************************************
65
66
// A simple round robin arbiter implemented in a not so simple
67
// way. Two things make this special. First, it takes width as
68
// a parameter and secondly it's constructed in a way to work with
69
// restrictions synthesis programs.
70
//
71
// Consider each req/grant pair to be a
72
// "channel". The arbiter computes a grant response to a request
73
// on a channel by channel basis.
74
//
75
// The arbiter implementes a "round robin" algorithm. Ie, the granting
76
// process is totally fair and symmetric. Each requester is given
77
// equal priority. If all requests are asserted, the arbiter will
78
// work sequentially around the list of requesters, giving each a grant.
79
//
80
// Grant priority is based on the "last_master". The last_master
81
// vector stores the channel receiving the most recent grant. The
82
// next higher numbered channel (wrapping around to zero) has highest
83
// priority in subsequent cycles. Relative priority wraps around
84
// the request vector with the last_master channel having lowest priority.
85
//
86
// At the highest implementation level, a per channel inhibit signal is computed.
87
// This inhibit is bit-wise AND'ed with the incoming requests to
88
// generate the grant.
89
//
90
// There will be at most a single grant per state. The logic
91
// of the arbiter depends on this.
92
//
93
// Once a grant is given, it is stored as the last_master. The
94
// last_master vector is initialized at reset to the zero'th channel.
95
// Although the particular channel doesn't matter, it does matter
96
// that the last_master contains a valid grant pattern.
97
//
98
// The heavy lifting is in computing the per channel inhibit signals.
99
// This is accomplished in the generate statement.
100
//
101
// The first "for" loop in the generate statement steps through the channels.
102
//
103
// The second "for" loop steps through the last mast_master vector
104
// for each channel. For each last_master bit, an inh_group is generated.
105
// Following the end of the second "for" loop, the inh_group signals are OR'ed
106
// together to generate the overall inhibit bit for the channel.
107
//
108
// For a four bit wide arbiter, this is what's generated for channel zero:
109
//
110
// inh_group[1] = last_master[0] && |req[3:1]; // any other req inhibits
111
// inh_group[2] = last_master[1] && |req[3:2]; // req[3], or req[2] inhibit
112
// inh_group[3] = last_master[2] && |req[3:3]; // only req[3] inhibits
113
//
114
// For req[0], last_master[3] is ignored because channel zero is highest priority
115
// if last_master[3] is true.
116
//
117
118
119
`timescale
1ps/1ps
120
121
module
mig_7series_v1_9_round_robin_arb
122
#(
123
parameter
TCQ
=
100
,
124
parameter
WIDTH
=
3
125
)
126
(
127
/*AUTOARG**/
128
// Outputs
129
grant_ns
,
grant_r
,
130
// Inputs
131
clk
,
rst
,
req
,
disable_grant
,
current_master
,
upd_last_master
132
);
133
134
input
clk
;
135
input
rst
;
136
137
input
[
WIDTH
-
1
:
0
]
req
;
138
139
wire
[
WIDTH
-
1
:
0
]
last_master_ns
;
140
141
reg
[
WIDTH
*
2
-
1
:
0
]
dbl_last_master_ns
;
142
always
@(
/*AS**/
last_master_ns
)
143
dbl_last_master_ns
= {
last_master_ns
,
last_master_ns
};
144
reg
[
WIDTH
*
2
-
1
:
0
]
dbl_req
;
145
always
@(
/*AS**/
req
)
dbl_req
= {
req
,
req
};
146
147
reg
[
WIDTH
-
1
:
0
]
inhibit
= {
WIDTH
{
1'b0
}};
148
149
genvar
i
;
150
genvar
j
;
151
generate
152
for
(
i
=
0
;
i
<
WIDTH
;
i
=
i
+
1
)
begin
:
channel
153
wire
[
WIDTH
-
1
:
1
]
inh_group
;
154
for
(
j
=
0
;
j
< (
WIDTH
-
1
);
j
=
j
+
1
)
begin
:
last_master
155
assign
inh_group
[
j
+
1
] =
156
dbl_last_master_ns
[
i
+
j
] && |
dbl_req
[
i
+
WIDTH
-
1
:
i
+
j
+
1
];
157
end
158
always
@(
/*AS**/
inh_group
)
inhibit
[
i
] = |
inh_group
;
159
end
160
endgenerate
161
162
input
disable_grant
;
163
output
wire
[
WIDTH
-
1
:
0
]
grant_ns
;
164
assign
grant_ns
=
req
& ~
inhibit
& {
WIDTH
{~
disable_grant
}};
165
166
output
reg
[
WIDTH
-
1
:
0
]
grant_r
;
167
always
@(
posedge
clk
)
grant_r
<= #TCQ
grant_ns
;
168
169
input
[
WIDTH
-
1
:
0
]
current_master
;
170
input
upd_last_master
;
171
reg
[
WIDTH
-
1
:
0
]
last_master_r
;
172
localparam
ONE
=
1
<< (
WIDTH
-
1
);
//Changed form '1' to fix the CR #544024
173
//A '1' in the LSB of the last_master_r
174
//signal gives a low priority to req[0]
175
//after reset. To avoid this made MSB as
176
//'1' at reset.
177
assign
last_master_ns
=
rst
178
?
ONE
[
0
+:
WIDTH
]
179
:
upd_last_master
180
?
current_master
181
:
last_master_r
;
182
always
@(
posedge
clk
)
last_master_r
<= #TCQ
last_master_ns
;
183
184
`ifdef
MC_SVA
185
grant_is_one_hot_zero
:
186
assert property (@(
posedge
clk) (rst ||
$onehot0
(grant_ns)));
187
last_master_r_is_one_hot:
188
assert property (@(
posedge
clk) (rst ||
$onehot
(last_master_r)));
189
`endif
190
191
endmodule
Generated on Sun Mar 6 2016 12:24:19 for AMC13 by
1.8.1