AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
 All Classes Variables
mig_7series_v1_9_ecc_buf.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 : ecc_buf.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 1ps/1ps
67 
69  #(
70  parameter TCQ = 100,
71  parameter PAYLOAD_WIDTH = 64,
72  parameter DATA_BUF_ADDR_WIDTH = 4,
73  parameter DATA_BUF_OFFSET_WIDTH = 1,
74  parameter DATA_WIDTH = 64,
75  parameter nCK_PER_CLK = 4
76  )
77  (
78  /*AUTOARG**/
79  // Outputs
80  rd_merge_data,
81  // Inputs
82  clk, rst, rd_data_addr, rd_data_offset, wr_data_addr,
83  wr_data_offset, rd_data, wr_ecc_buf
84  );
85 
86  input clk;
87  input rst;
88 
89  // RMW architecture supports only 16 data buffer entries.
90  // Allow DATA_BUF_ADDR_WIDTH to be greater than 4, but
91  // assume the upper bits are used for tagging.
92 
93  input [DATA_BUF_ADDR_WIDTH-1:0] rd_data_addr;
94  input [DATA_BUF_OFFSET_WIDTH-1:0] rd_data_offset;
95  wire [4:0] buf_wr_addr;
96 
97  input [DATA_BUF_ADDR_WIDTH-1:0] wr_data_addr;
98  input [DATA_BUF_OFFSET_WIDTH-1:0] wr_data_offset;
99  reg [4:0] buf_rd_addr_r;
100 
101  generate
102  if (DATA_BUF_ADDR_WIDTH >= 4) begin : ge_4_addr_bits
103  always @(posedge clk)
104  buf_rd_addr_r <= #TCQ{wr_data_addr[3:0], wr_data_offset};
105  assign buf_wr_addr = {rd_data_addr[3:0], rd_data_offset};
106  end
107  else begin : lt_4_addr_bits
108  always @(posedge clk)
109  buf_rd_addr_r <= #TCQ{{4-DATA_BUF_ADDR_WIDTH{1'b0}},
110  wr_data_addr[DATA_BUF_ADDR_WIDTH-1:0],
111  wr_data_offset};
112  assign buf_wr_addr = {{4-DATA_BUF_ADDR_WIDTH{1'b0}},
113  rd_data_addr[DATA_BUF_ADDR_WIDTH-1:0],
114  rd_data_offset};
115  end
116  endgenerate
117 
118  input [2*nCK_PER_CLK*PAYLOAD_WIDTH-1:0] rd_data;
119  reg [2*nCK_PER_CLK*DATA_WIDTH-1:0] payload;
120  integer h;
121  always @(/*AS**/rd_data)
122  for (h=0; h<2*nCK_PER_CLK; h=h+1)
123  payload[h*DATA_WIDTH+:DATA_WIDTH] =
124  rd_data[h*PAYLOAD_WIDTH+:DATA_WIDTH];
125 
126  input wr_ecc_buf;
127  localparam BUF_WIDTH = 2*nCK_PER_CLK*DATA_WIDTH;
128  localparam FULL_RAM_CNT = (BUF_WIDTH/6);
129  localparam REMAINDER = BUF_WIDTH % 6;
130  localparam RAM_CNT = FULL_RAM_CNT + ((REMAINDER == 0 ) ? 0 : 1);
131  localparam RAM_WIDTH = (RAM_CNT*6);
132  wire [RAM_WIDTH-1:0] buf_out_data;
133  generate
134  begin : ram_buf
135  wire [RAM_WIDTH-1:0] buf_in_data;
136  if (REMAINDER == 0)
137  assign buf_in_data = payload;
138  else
139  assign buf_in_data = {{6-REMAINDER{1'b0}}, payload};
140 
141  genvar i;
142  for (i=0; i<RAM_CNT; i=i+1) begin : rd_buffer_ram
143  RAM32M
144  #(.INIT_A(64'h0000000000000000),
145  .INIT_B(64'h0000000000000000),
146  .INIT_C(64'h0000000000000000),
147  .INIT_D(64'h0000000000000000)
148  ) RAM32M0 (
149  .DOA(buf_out_data[((i*6)+4)+:2]),
150  .DOB(buf_out_data[((i*6)+2)+:2]),
151  .DOC(buf_out_data[((i*6)+0)+:2]),
152  .DOD(),
153  .DIA(buf_in_data[((i*6)+4)+:2]),
154  .DIB(buf_in_data[((i*6)+2)+:2]),
155  .DIC(buf_in_data[((i*6)+0)+:2]),
156  .DID(2'b0),
157  .ADDRA(buf_rd_addr_r),
158  .ADDRB(buf_rd_addr_r),
159  .ADDRC(buf_rd_addr_r),
160  .ADDRD(buf_wr_addr),
161  .WE(wr_ecc_buf),
162  .WCLK(clk)
163  );
164  end // block: rd_buffer_ram
165  end
166  endgenerate
167 
168  output wire [2*nCK_PER_CLK*DATA_WIDTH-1:0] rd_merge_data;
169  assign rd_merge_data = buf_out_data[2*nCK_PER_CLK*DATA_WIDTH-1:0];
170 
171 
172 endmodule