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
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 Wed Apr 18 2018 10:55:27 for AMC13 by
1.8.1