HITDAQ/FPGA_firmware/q_sys/synthesis/submodules/rw_manager_bitcheck.v
2024-10-11 14:49:54 +02:00

97 lines
3.2 KiB
Verilog

// (C) 2001-2019 Intel Corporation. All rights reserved.
// Your use of Intel Corporation's design tools, logic functions and other
// software and tools, and its AMPP partner logic functions, and any output
// files from any of the foregoing (including device programming or simulation
// files), and any associated documentation or information are expressly subject
// to the terms and conditions of the Intel Program License Subscription
// Agreement, Intel FPGA IP License Agreement, or other applicable
// license agreement, including, without limitation, that your use is for the
// sole purpose of programming logic devices manufactured by Intel and sold by
// Intel or its authorized distributors. Please refer to the applicable
// agreement for further details.
`timescale 1 ps / 1 ps
module rw_manager_bitcheck(
ck,
reset_n,
clear,
enable,
read_data,
reference_data,
mask,
error_word
);
parameter DATA_WIDTH = "";
parameter AFI_RATIO = "";
localparam NUMBER_OF_WORDS = 2 * AFI_RATIO;
localparam DATA_BUS_SIZE = DATA_WIDTH * NUMBER_OF_WORDS;
input ck;
input reset_n;
input clear;
input enable;
input [DATA_BUS_SIZE - 1 : 0] read_data;
input [DATA_BUS_SIZE - 1 : 0] reference_data;
input [NUMBER_OF_WORDS - 1 : 0] mask;
output [DATA_WIDTH - 1 : 0] error_word;
reg [DATA_BUS_SIZE - 1 : 0] read_data_r;
reg [DATA_WIDTH - 1 : 0] error_word;
reg enable_r;
wire [DATA_WIDTH - 1 : 0] error_compute;
always @(posedge ck or negedge reset_n) begin
if(~reset_n) begin
error_word <= {DATA_WIDTH{1'b0}};
read_data_r <= {DATA_BUS_SIZE{1'b0}};
enable_r <= 1'b0;
end
else begin
if(clear) begin
error_word <= {DATA_WIDTH{1'b0}};
end
else if(enable_r) begin
error_word <= error_word | error_compute;
end
read_data_r <= read_data;
enable_r <= enable;
end
end
genvar b;
generate
for(b = 0; b < DATA_WIDTH; b = b + 1)
begin : bit_loop
if (AFI_RATIO == 4) begin
assign error_compute[b] =
((read_data_r[b] ^ reference_data[b]) & ~mask[0]) |
((read_data_r[b + DATA_WIDTH] ^ reference_data[b + DATA_WIDTH]) & ~mask[1]) |
((read_data_r[b + 2 * DATA_WIDTH] ^ reference_data[b + 2 * DATA_WIDTH]) & ~mask[2]) |
((read_data_r[b + 3 * DATA_WIDTH] ^ reference_data[b + 3 * DATA_WIDTH]) & ~mask[3]) |
((read_data_r[b + 4 * DATA_WIDTH] ^ reference_data[b + 4 * DATA_WIDTH]) & ~mask[4]) |
((read_data_r[b + 5 * DATA_WIDTH] ^ reference_data[b + 5 * DATA_WIDTH]) & ~mask[5]) |
((read_data_r[b + 6 * DATA_WIDTH] ^ reference_data[b + 6 * DATA_WIDTH]) & ~mask[6]) |
((read_data_r[b + 7 * DATA_WIDTH] ^ reference_data[b + 7 * DATA_WIDTH]) & ~mask[7]);
end
else if (AFI_RATIO == 2) begin
assign error_compute[b] =
((read_data_r[b] ^ reference_data[b]) & ~mask[0]) |
((read_data_r[b + DATA_WIDTH] ^ reference_data[b + DATA_WIDTH]) & ~mask[1]) |
((read_data_r[b + 2 * DATA_WIDTH] ^ reference_data[b + 2 * DATA_WIDTH]) & ~mask[2])|
((read_data_r[b + 3 * DATA_WIDTH] ^ reference_data[b + 3 * DATA_WIDTH]) & ~mask[3]);
end
else begin
assign error_compute[b] =
((read_data_r[b] ^ reference_data[b]) & ~mask[0]) |
((read_data_r[b + DATA_WIDTH] ^ reference_data[b + DATA_WIDTH]) & ~mask[1]);
end
end
endgenerate
endmodule