AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
 All Classes Variables
mig_7series_v1_9_ui_cmd.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 : ui_cmd.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 `timescale 1 ps / 1 ps
67 
68 // User interface command port.
69 
71  (
72  parameter TCQ = 100,
73  parameter ADDR_WIDTH = 33,
74  parameter BANK_WIDTH = 3,
75  parameter COL_WIDTH = 12,
76  parameter DATA_BUF_ADDR_WIDTH = 5,
77  parameter RANK_WIDTH = 2,
78  parameter ROW_WIDTH = 16,
79  parameter RANKS = 4,
80  parameter MEM_ADDR_ORDER = "BANK_ROW_COLUMN"
81  )
82  (/*AUTOARG**/
83  // Outputs
84  app_rdy, use_addr, rank, bank, row, col, size, cmd, hi_priority,
85  rd_accepted, wr_accepted, data_buf_addr,
86  // Inputs
87  rst, clk, accept_ns, rd_buf_full, wr_req_16, app_addr, app_cmd,
88  app_sz, app_hi_pri, app_en, wr_data_buf_addr, rd_data_buf_addr_r
89  );
90 
91  input rst;
92  input clk;
93 
94  input accept_ns;
95  input rd_buf_full;
96  input wr_req_16;
97  wire app_rdy_ns = accept_ns && ~rd_buf_full && ~wr_req_16;
98  (* keep = "true", max_fanout = 10 *) reg app_rdy_r = 1'b0 /* synthesis syn_maxfan = 10 **/;
99  always @(posedge clk) app_rdy_r <= #TCQ app_rdy_ns;
100  output wire app_rdy;
101  assign app_rdy = app_rdy_r;
102 
103  input [ADDR_WIDTH-1:0] app_addr;
104  input [2:0] app_cmd;
105  input app_sz;
106  input app_hi_pri;
107  input app_en;
108 
109  reg [ADDR_WIDTH-1:0] app_addr_r1 = {ADDR_WIDTH{1'b0}};
110  reg [ADDR_WIDTH-1:0] app_addr_r2 = {ADDR_WIDTH{1'b0}};
111  reg [2:0] app_cmd_r1;
112  reg [2:0] app_cmd_r2;
113  reg app_sz_r1;
114  reg app_sz_r2;
115  reg app_hi_pri_r1;
116  reg app_hi_pri_r2;
117  reg app_en_r1;
118  reg app_en_r2;
119 
120  wire [ADDR_WIDTH-1:0] app_addr_ns1 = app_rdy_r && app_en ? app_addr : app_addr_r1;
121  wire [ADDR_WIDTH-1:0] app_addr_ns2 = app_rdy_r ? app_addr_r1 : app_addr_r2;
122  wire [2:0] app_cmd_ns1 = app_rdy_r ? app_cmd : app_cmd_r1;
123  wire [2:0] app_cmd_ns2 = app_rdy_r ? app_cmd_r1 : app_cmd_r2;
124  wire app_sz_ns1 = app_rdy_r ? app_sz : app_sz_r1;
125  wire app_sz_ns2 = app_rdy_r ? app_sz_r1 : app_sz_r2;
126  wire app_hi_pri_ns1 = app_rdy_r ? app_hi_pri : app_hi_pri_r1;
127  wire app_hi_pri_ns2 = app_rdy_r ? app_hi_pri_r1 : app_hi_pri_r2;
128  wire app_en_ns1 = ~rst && (app_rdy_r ? app_en : app_en_r1);
129  wire app_en_ns2 = ~rst && (app_rdy_r ? app_en_r1 : app_en_r2);
130 
131  always @(posedge clk) begin
132  if (rst) begin
133  app_addr_r1 <= #TCQ {ADDR_WIDTH{1'b0}};
134  app_addr_r2 <= #TCQ {ADDR_WIDTH{1'b0}};
135  end else begin
136  app_addr_r1 <= #TCQ app_addr_ns1;
137  app_addr_r2 <= #TCQ app_addr_ns2;
138  end
139  app_cmd_r1 <= #TCQ app_cmd_ns1;
140  app_cmd_r2 <= #TCQ app_cmd_ns2;
141  app_sz_r1 <= #TCQ app_sz_ns1;
142  app_sz_r2 <= #TCQ app_sz_ns2;
143  app_hi_pri_r1 <= #TCQ app_hi_pri_ns1;
144  app_hi_pri_r2 <= #TCQ app_hi_pri_ns2;
145  app_en_r1 <= #TCQ app_en_ns1;
146  app_en_r2 <= #TCQ app_en_ns2;
147  end // always @ (posedge clk)
148 
149  wire use_addr_lcl = app_en_r2 && app_rdy_r;
150  output wire use_addr;
151  assign use_addr = use_addr_lcl;
152 
153  output wire [RANK_WIDTH-1:0] rank;
154  output wire [BANK_WIDTH-1:0] bank;
155  output wire [ROW_WIDTH-1:0] row;
156  output wire [COL_WIDTH-1:0] col;
157  output wire size;
158  output wire [2:0] cmd;
159  output wire hi_priority;
160 
161 /* assign col = app_rdy_r
162  ? app_addr_r1[0+:COL_WIDTH]
163  : app_addr_r2[0+:COL_WIDTH];**/
164  generate
165  begin
166  if (MEM_ADDR_ORDER == "TG_TEST")
167  begin
168  assign col[4:0] = app_rdy_r
169  ? app_addr_r1[0+:5]
170  : app_addr_r2[0+:5];
171 
172  if (RANKS==1)
173  begin
174  assign col[COL_WIDTH-1:COL_WIDTH-2] = app_rdy_r
175  ? app_addr_r1[5+3+BANK_WIDTH+:2]
176  : app_addr_r2[5+3+BANK_WIDTH+:2];
177  assign col[COL_WIDTH-3:5] = app_rdy_r
178  ? app_addr_r1[5+3+BANK_WIDTH+2+2+:COL_WIDTH-7]
179  : app_addr_r2[5+3+BANK_WIDTH+2+2+:COL_WIDTH-7];
180  end
181  else
182  begin
183  assign col[COL_WIDTH-1:COL_WIDTH-2] = app_rdy_r
184  ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+:2]
185  : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+:2];
186  assign col[COL_WIDTH-3:5] = app_rdy_r
187  ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+2+2+:COL_WIDTH-7]
188  : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+2+2+:COL_WIDTH-7];
189  end
190  assign row[2:0] = app_rdy_r
191  ? app_addr_r1[5+:3]
192  : app_addr_r2[5+:3];
193  if (RANKS==1)
194  begin
195  assign row[ROW_WIDTH-1:ROW_WIDTH-2] = app_rdy_r
196  ? app_addr_r1[5+3+BANK_WIDTH+2+:2]
197  : app_addr_r2[5+3+BANK_WIDTH+2+:2];
198  assign row[ROW_WIDTH-3:3] = app_rdy_r
199  ? app_addr_r1[5+3+BANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5]
200  : app_addr_r2[5+3+BANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5];
201  end
202  else
203  begin
204  assign row[ROW_WIDTH-1:ROW_WIDTH-2] = app_rdy_r
205  ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+2+:2]
206  : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+2+:2];
207  assign row[ROW_WIDTH-3:3] = app_rdy_r
208  ? app_addr_r1[5+3+BANK_WIDTH+RANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5]
209  : app_addr_r2[5+3+BANK_WIDTH+RANK_WIDTH+2+2+COL_WIDTH-7+:ROW_WIDTH-5];
210  end
211  assign bank = app_rdy_r
212  ? app_addr_r1[5+3+:BANK_WIDTH]
213  : app_addr_r2[5+3+:BANK_WIDTH];
214  assign rank = (RANKS == 1)
215  ? 1'b0
216  : app_rdy_r
217  ? app_addr_r1[5+3+BANK_WIDTH+:RANK_WIDTH]
218  : app_addr_r2[5+3+BANK_WIDTH+:RANK_WIDTH];
219  end
220  else if (MEM_ADDR_ORDER == "ROW_BANK_COLUMN")
221  begin
222  assign col = app_rdy_r
223  ? app_addr_r1[0+:COL_WIDTH]
224  : app_addr_r2[0+:COL_WIDTH];
225  assign row = app_rdy_r
226  ? app_addr_r1[COL_WIDTH+BANK_WIDTH+:ROW_WIDTH]
227  : app_addr_r2[COL_WIDTH+BANK_WIDTH+:ROW_WIDTH];
228  assign bank = app_rdy_r
229  ? app_addr_r1[COL_WIDTH+:BANK_WIDTH]
230  : app_addr_r2[COL_WIDTH+:BANK_WIDTH];
231  assign rank = (RANKS == 1)
232  ? 1'b0
233  : app_rdy_r
234  ? app_addr_r1[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH]
235  : app_addr_r2[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH];
236  end
237  else
238  begin
239  assign col = app_rdy_r
240  ? app_addr_r1[0+:COL_WIDTH]
241  : app_addr_r2[0+:COL_WIDTH];
242  assign row = app_rdy_r
243  ? app_addr_r1[COL_WIDTH+:ROW_WIDTH]
244  : app_addr_r2[COL_WIDTH+:ROW_WIDTH];
245  assign bank = app_rdy_r
246  ? app_addr_r1[COL_WIDTH+ROW_WIDTH+:BANK_WIDTH]
247  : app_addr_r2[COL_WIDTH+ROW_WIDTH+:BANK_WIDTH];
248  assign rank = (RANKS == 1)
249  ? 1'b0
250  : app_rdy_r
251  ? app_addr_r1[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH]
252  : app_addr_r2[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH];
253  end
254  end
255  endgenerate
256 
257 /* assign rank = (RANKS == 1)
258  ? 1'b0
259  : app_rdy_r
260  ? app_addr_r1[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH]
261  : app_addr_r2[COL_WIDTH+ROW_WIDTH+BANK_WIDTH+:RANK_WIDTH];**/
262  assign size = app_rdy_r
263  ? app_sz_r1
264  : app_sz_r2;
265  assign cmd = app_rdy_r
266  ? app_cmd_r1
267  : app_cmd_r2;
268  assign hi_priority = app_rdy_r
269  ? app_hi_pri_r1
270  : app_hi_pri_r2;
271 
272  wire request_accepted = use_addr_lcl && app_rdy_r;
273  wire rd = app_cmd_r2[1:0] == 2'b01;
274  wire wr = app_cmd_r2[1:0] == 2'b00;
275  wire wr_bytes = app_cmd_r2[1:0] == 2'b11;
276  wire write = wr || wr_bytes;
277  output wire rd_accepted;
278  assign rd_accepted = request_accepted && rd;
279  output wire wr_accepted;
280  assign wr_accepted = request_accepted && write;
281 
282  input [DATA_BUF_ADDR_WIDTH-1:0] wr_data_buf_addr;
283  input [DATA_BUF_ADDR_WIDTH-1:0] rd_data_buf_addr_r;
284  output wire [DATA_BUF_ADDR_WIDTH-1:0] data_buf_addr;
285 
286  assign data_buf_addr = ~write ? rd_data_buf_addr_r : wr_data_buf_addr;
287 
288 endmodule // ui_cmd
289 
290 // Local Variables:
291 // verilog-library-directories:(".")
292 // End: