OpenCores
URL https://opencores.org/ocsvn/crcahb/crcahb/trunk

Subversion Repositories crcahb

[/] [crcahb/] [trunk/] [testbench/] [tb_crc_ip.v] - Diff between revs 2 and 3

Only display areas with differences | Details | Blame | View Log

Rev 2 Rev 3
 
//////////////////////////////////////////////////////////////////
 
////
 
////
 
////    CRCAHB CORE BLOCK
 
////
 
////
 
////
 
//// This file is part of the APB to I2C project
 
////
 
//// http://www.opencores.org/cores/apbi2c/
 
////
 
////
 
////
 
//// Description
 
////
 
//// Implementation of APB IP core according to
 
////
 
//// crcahb IP core specification document.
 
////
 
////
 
////
 
//// To Do: Things are right here but always all block can suffer changes
 
////
 
////
 
////
 
////
 
////
 
//// Author(s): -  Julio Cesar 
 
////
 
///////////////////////////////////////////////////////////////// 
 
////
 
////
 
//// Copyright (C) 2009 Authors and OPENCORES.ORG
 
////
 
////
 
////
 
//// This source file may be used and distributed without
 
////
 
//// restriction provided that this copyright statement is not
 
////
 
//// removed from the file and that any derivative work contains
 
//// the original copyright notice and the associated disclaimer.
 
////
 
////
 
//// This source file is free software; you can redistribute it
 
////
 
//// and/or modify it under the terms of the GNU Lesser General
 
////
 
//// Public License as published by the Free Software Foundation;
 
//// either version 2.1 of the License, or (at your option) any
 
////
 
//// later version.
 
////
 
////
 
////
 
//// This source is distributed in the hope that it will be
 
////
 
//// useful, but WITHOUT ANY WARRANTY; without even the implied
 
////
 
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 
////
 
//// PURPOSE. See the GNU Lesser General Public License for more
 
//// details.
 
////
 
////
 
////
 
//// You should have received a copy of the GNU Lesser General
 
////
 
//// Public License along with this source; if not, download it
 
////
 
//// from http://www.opencores.org/lgpl.shtml
 
////
 
////
 
///////////////////////////////////////////////////////////////////
 
 
module tb_crc_ip();
module tb_crc_ip();
 
 
//Memory Map
//Memory Map
localparam CRC_DR   = 32'h0;
localparam CRC_DR   = 32'h0;
localparam CRC_IDR  = 32'h4;
localparam CRC_IDR  = 32'h4;
localparam CRC_CR   = 32'h8;
localparam CRC_CR   = 32'h8;
localparam CRC_INIT = 32'h10;
localparam CRC_INIT = 32'h10;
localparam CRC_POL  = 32'h14;
localparam CRC_POL  = 32'h14;
 
 
//HTRANS Encoding
//HTRANS Encoding
localparam IDLE    = 2'b00;
localparam IDLE    = 2'b00;
localparam BUSY    = 2'b01;
localparam BUSY    = 2'b01;
localparam NON_SEQ = 2'b10;
localparam NON_SEQ = 2'b10;
localparam SEQ     = 2'b11;
localparam SEQ     = 2'b11;
 
 
//HSIZE Encoding
//HSIZE Encoding
localparam BYTE      = 2'b00;
localparam BYTE      = 2'b00;
localparam HALF_WORD = 2'b01;
localparam HALF_WORD = 2'b01;
localparam WORD      = 2'b10;
localparam WORD      = 2'b10;
 
 
//CRC_CR Encoding
//CRC_CR Encoding
localparam RESET             = 32'h00000001;
localparam RESET             = 32'h00000001;
localparam POLY_SIZE_32      = 32'h00000000;
localparam POLY_SIZE_32      = 32'h00000000;
localparam POLY_SIZE_16      = 32'h00000001 << 3;
localparam POLY_SIZE_16      = 32'h00000001 << 3;
localparam POLY_SIZE_8       = 32'h00000001 << 4;
localparam POLY_SIZE_8       = 32'h00000001 << 4;
localparam POLY_SIZE_7       = 32'h00000003 << 3;
localparam POLY_SIZE_7       = 32'h00000003 << 3;
localparam REV_IN_NORMAL     = 32'h00000000;
localparam REV_IN_NORMAL     = 32'h00000000;
localparam REV_IN_BYTE       = 32'h00000001 << 5;
localparam REV_IN_BYTE       = 32'h00000001 << 5;
localparam REV_IN_HALF_WORD  = 32'h00000001 << 6;
localparam REV_IN_HALF_WORD  = 32'h00000001 << 6;
localparam REV_IN_WORD       = 32'h00000003 << 5;
localparam REV_IN_WORD       = 32'h00000003 << 5;
localparam REV_OUT_NORMAL    = 32'h00000000;
localparam REV_OUT_NORMAL    = 32'h00000000;
localparam REV_OUT_REV       = 32'h00000001 << 7;
localparam REV_OUT_REV       = 32'h00000001 << 7;
 
 
wire [31:0] HRDATA;
wire [31:0] HRDATA;
wire HREADYOUT;
wire HREADYOUT;
wire HRESP;
wire HRESP;
 
 
reg [31:0] HWDATA;
reg [31:0] HWDATA;
reg [31:0] HADDR;
reg [31:0] HADDR;
reg [ 2:0] HSIZE;
reg [ 2:0] HSIZE;
reg [ 1:0] HTRANS;
reg [ 1:0] HTRANS;
reg HWRITE;
reg HWRITE;
reg HSElx;
reg HSElx;
reg HREADY;
reg HREADY;
reg HRESETn;
reg HRESETn;
reg HCLK;
reg HCLK;
 
 
reg [31:0] result, golden;
reg [31:0] result, golden;
reg [31:0] data_init, data_crc;
reg [31:0] data_init, data_crc;
reg [31:0] data_rev;
reg [31:0] data_rev;
 
 
task reset;
task reset;
        begin
        begin
                HWDATA = 0;
                HWDATA = 0;
                HADDR = 0;
                HADDR = 0;
                HSIZE = 0;
                HSIZE = 0;
                HTRANS = 0;
                HTRANS = 0;
                HWRITE = 0;
                HWRITE = 0;
                HSElx = 0;
                HSElx = 0;
                HREADY = 1;
                HREADY = 1;
                HRESETn = 0;
                HRESETn = 0;
                HCLK = 0;
                HCLK = 0;
                @(posedge HCLK);
                @(posedge HCLK);
                @(posedge HCLK);
                @(posedge HCLK);
                HRESETn = 1;
                HRESETn = 1;
                @(posedge HCLK);
                @(posedge HCLK);
        end
        end
endtask
endtask
 
 
task write_ahb;
task write_ahb;
        input [31:0] addr;
        input [31:0] addr;
        input [31:0] data;
        input [31:0] data;
        input [ 1:0] size;
        input [ 1:0] size;
        begin
        begin
                HADDR <= addr;
                HADDR <= addr;
                HSElx <= 1;
                HSElx <= 1;
                HTRANS <= NON_SEQ;
                HTRANS <= NON_SEQ;
                HSIZE <= size;
                HSIZE <= size;
                HWRITE <= 1;
                HWRITE <= 1;
                @(negedge HCLK);
                @(negedge HCLK);
                if(HREADYOUT == 0)
                if(HREADYOUT == 0)
                        @(posedge HREADYOUT);
                        @(posedge HREADYOUT);
                @(posedge HCLK);
                @(posedge HCLK);
                HWDATA <= data;
                HWDATA <= data;
                HSElx <= 0;
                HSElx <= 0;
                HTRANS <= IDLE;
                HTRANS <= IDLE;
        end
        end
endtask
endtask
 
 
task read_ahb;
task read_ahb;
        input  [31:0] addr;
        input  [31:0] addr;
        output [31:0] data_rd;
        output [31:0] data_rd;
        begin
        begin
                HADDR <= addr;
                HADDR <= addr;
                HSElx <= 1;
                HSElx <= 1;
                HTRANS <= NON_SEQ;
                HTRANS <= NON_SEQ;
                HWRITE <= 0;
                HWRITE <= 0;
                @(posedge HCLK);
                @(posedge HCLK);
                @(negedge HCLK);
                @(negedge HCLK);
                if(HREADYOUT == 0)
                if(HREADYOUT == 0)
                        @(posedge HREADYOUT);
                        @(posedge HREADYOUT);
                @(negedge HCLK);
                @(negedge HCLK);
                //@(posedge HCLK);
                //@(posedge HCLK);
                data_rd = HRDATA;
                data_rd = HRDATA;
                HSElx = 0;
                HSElx = 0;
                HTRANS = IDLE;
                HTRANS = IDLE;
        end
        end
endtask
endtask
 
 
task compare;
task compare;
        input [31:0] golden;
        input [31:0] golden;
        input [31:0] result;
        input [31:0] result;
        begin
        begin
                if(golden != result)
                if(golden != result)
                        begin
                        begin
                                $display("Error Founded...Expected %x, obtained %x", golden, result);
                                $display("Error Founded...Expected %x, obtained %x", golden, result);
                                $stop;
                                $stop;
                        end
                        end
        end
        end
endtask
endtask
 
 
crc_ip CRC_IP
crc_ip CRC_IP
(
(
        .HRDATA    ( HRDATA    ),
        .HRDATA    ( HRDATA    ),
        .HREADYOUT ( HREADYOUT ),
        .HREADYOUT ( HREADYOUT ),
        .HRESP     ( HRESP     ),
        .HRESP     ( HRESP     ),
        .HWDATA    ( HWDATA    ),
        .HWDATA    ( HWDATA    ),
        .HADDR     ( HADDR     ),
        .HADDR     ( HADDR     ),
        .HSIZE     ( HSIZE     ),
        .HSIZE     ( HSIZE     ),
        .HTRANS    ( HTRANS    ),
        .HTRANS    ( HTRANS    ),
        .HWRITE    ( HWRITE    ),
        .HWRITE    ( HWRITE    ),
        .HSElx     ( HSElx     ),
        .HSElx     ( HSElx     ),
        .HREADY    ( HREADY    ),
        .HREADY    ( HREADY    ),
        .HRESETn   ( HRESETn   ),
        .HRESETn   ( HRESETn   ),
        .HCLK      ( HCLK      )
        .HCLK      ( HCLK      )
);
);
 
 
initial
initial
        begin
        begin
                reset;
                reset;
 
 
                write_ahb(CRC_DR, 32'h01020304, WORD);
                write_ahb(CRC_DR, 32'h01020304, WORD);
                write_ahb(3'h1, 32'h05060708, WORD);
                write_ahb(3'h1, 32'h05060708, WORD);
                write_ahb(3'h2, 32'h090a0b0c, WORD);
                write_ahb(3'h2, 32'h090a0b0c, WORD);
                write_ahb(3'h3, 32'h0d0e0f00, WORD);
                write_ahb(3'h3, 32'h0d0e0f00, WORD);
                write_ahb(3'h4, 32'h00112233, WORD);
                write_ahb(3'h4, 32'h00112233, WORD);
 
 
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
 
 
                write_ahb(CRC_IDR, 32'h89abcdef, WORD);
                write_ahb(CRC_IDR, 32'h89abcdef, WORD);
                read_ahb(CRC_IDR, result);
                read_ahb(CRC_IDR, result);
 
 
                //Test Case 1: Write and Read in IDR
                //Test Case 1: Write and Read in IDR
                golden = 32'h89abcdee;
                golden = 32'h89abcdee;
                write_ahb(CRC_IDR, golden, WORD);
                write_ahb(CRC_IDR, golden, WORD);
                read_ahb(CRC_IDR, result);
                read_ahb(CRC_IDR, result);
                compare(32'hff & golden, result);
                compare(32'hff & golden, result);
 
 
                golden = 32'hffeeddcc;
                golden = 32'hffeeddcc;
                write_ahb(CRC_IDR, golden, BYTE);
                write_ahb(CRC_IDR, golden, BYTE);
                read_ahb(CRC_IDR, result);
                read_ahb(CRC_IDR, result);
                compare(32'hff & golden, result);
                compare(32'hff & golden, result);
 
 
   //Test Case 2: Write and Read in CR
   //Test Case 2: Write and Read in CR
                golden = 32'hffeeddcc;
                golden = 32'hffeeddcc;
 
 
   //Test Case 2: Write and Read in CR
   //Test Case 2: Write and Read in CR
                golden = 32'hffeeddcc;
                golden = 32'hffeeddcc;
                write_ahb(CRC_CR, golden, WORD);
                write_ahb(CRC_CR, golden, WORD);
                read_ahb(CRC_CR, result);
                read_ahb(CRC_CR, result);
                compare(32'hf8 & golden, result);
                compare(32'hf8 & golden, result);
 
 
                golden = 32'hffeeddff;
                golden = 32'hffeeddff;
                write_ahb(CRC_CR, golden, WORD);
                write_ahb(CRC_CR, golden, WORD);
                read_ahb(CRC_CR, result);
                read_ahb(CRC_CR, result);
                compare(32'hf8 & golden, result);
                compare(32'hf8 & golden, result);
 
 
        //Test Case 3: Write and Read in INIT
        //Test Case 3: Write and Read in INIT
                golden = 32'hffeeddcc;
                golden = 32'hffeeddcc;
                write_ahb(CRC_INIT, golden, WORD);
                write_ahb(CRC_INIT, golden, WORD);
                read_ahb(CRC_INIT, result);
                read_ahb(CRC_INIT, result);
                compare(golden, result);
                compare(golden, result);
 
 
                golden = 32'hffeeddff;
                golden = 32'hffeeddff;
                write_ahb(CRC_INIT, golden, WORD);
                write_ahb(CRC_INIT, golden, WORD);
                read_ahb(CRC_INIT, result);
                read_ahb(CRC_INIT, result);
                compare(golden, result);
                compare(golden, result);
 
 
        //Test Case 4: Write and Read in POL
        //Test Case 4: Write and Read in POL
                golden = 32'h11235813;
                golden = 32'h11235813;
                write_ahb(CRC_POL, golden, WORD);
                write_ahb(CRC_POL, golden, WORD);
                read_ahb(CRC_POL, result);
                read_ahb(CRC_POL, result);
                compare(golden, result);
                compare(golden, result);
 
 
                golden = 32'h24161614;
                golden = 32'h24161614;
                write_ahb(CRC_POL, golden, WORD);
                write_ahb(CRC_POL, golden, WORD);
                read_ahb(CRC_POL, result);
                read_ahb(CRC_POL, result);
                compare(golden, result);
                compare(golden, result);
 
 
        //Test Case 5: Programmable Initial CRC Value
        //Test Case 5: Programmable Initial CRC Value
                //POLY_SIZE_32, Data_32
                //POLY_SIZE_32, Data_32
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                data_crc = 32'haabbccdd;
                data_crc = 32'haabbccdd;
                golden = //crc_32(32'hddccbbaa, data_init);
                golden = //crc_32(32'hddccbbaa, data_init);
                crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_32, Data_16
                //POLY_SIZE_32, Data_16
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                data_crc = 32'h11223344;
                data_crc = 32'h11223344;
                golden = crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init));
                golden = crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init));
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_32, Data_8
                //POLY_SIZE_32, Data_8
                data_init = 32'h11223344;
                data_init = 32'h11223344;
                data_crc = 32'h01463528;
                data_crc = 32'h01463528;
                golden = crc_32(data_crc[7:0], data_init);
                golden = crc_32(data_crc[7:0], data_init);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_16, Data_32
                //POLY_SIZE_16, Data_32
                data_init = 32'hadefbc89;
                data_init = 32'hadefbc89;
                data_crc = 32'h01463528;
                data_crc = 32'h01463528;
                golden = crc_16(data_crc[31:24], crc_16(data_crc[23:16], crc_16(data_crc[15:8], crc_16(data_crc[7:0], data_init))));
                golden = crc_16(data_crc[31:24], crc_16(data_crc[23:16], crc_16(data_crc[15:8], crc_16(data_crc[7:0], data_init))));
                write_ahb(CRC_POL, 32'h00018005, WORD);
                write_ahb(CRC_POL, 32'h00018005, WORD);
                write_ahb(CRC_CR, POLY_SIZE_16 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_16 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_16, Data_16
                //POLY_SIZE_16, Data_16
                data_init = 32'h01463528;
                data_init = 32'h01463528;
                data_crc = 32'hadefbc89;
                data_crc = 32'hadefbc89;
                golden = crc_16(data_crc[15:8], crc_16(data_crc[7:0], data_init));
                golden = crc_16(data_crc[15:8], crc_16(data_crc[7:0], data_init));
                write_ahb(CRC_POL, 32'h00018005, WORD);
                write_ahb(CRC_POL, 32'h00018005, WORD);
                write_ahb(CRC_CR, POLY_SIZE_16 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_16 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_16, Data_8
                //POLY_SIZE_16, Data_8
                data_init = 32'h01463d28;
                data_init = 32'h01463d28;
                data_crc = 32'haedfbc89;
                data_crc = 32'haedfbc89;
                golden = crc_16(data_crc[7:0], data_init);
                golden = crc_16(data_crc[7:0], data_init);
                write_ahb(CRC_POL, 32'h00018005, WORD);
                write_ahb(CRC_POL, 32'h00018005, WORD);
                write_ahb(CRC_CR, POLY_SIZE_16 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_16 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_8, Data_32
                //POLY_SIZE_8, Data_32
                data_init = 32'h11453028;
                data_init = 32'h11453028;
                data_crc = 32'haed7bc39;
                data_crc = 32'haed7bc39;
                golden = crc_8(data_crc[31:24], crc_8(data_crc[23:16], crc_8(data_crc[15:8], crc_8(data_crc[7:0], data_init))));
                golden = crc_8(data_crc[31:24], crc_8(data_crc[23:16], crc_8(data_crc[15:8], crc_8(data_crc[7:0], data_init))));
                write_ahb(CRC_POL, 32'h00000107, WORD);
                write_ahb(CRC_POL, 32'h00000107, WORD);
                write_ahb(CRC_CR, POLY_SIZE_8 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_8 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_8, Data_16
                //POLY_SIZE_8, Data_16
                data_init = 32'h11003028;
                data_init = 32'h11003028;
                data_crc = 32'haed70039;
                data_crc = 32'haed70039;
                golden = crc_8(data_crc[15:8], crc_8(data_crc[7:0], data_init));
                golden = crc_8(data_crc[15:8], crc_8(data_crc[7:0], data_init));
                write_ahb(CRC_POL, 32'h00000107, WORD);
                write_ahb(CRC_POL, 32'h00000107, WORD);
                write_ahb(CRC_CR, POLY_SIZE_8 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_8 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_8, Data_8
                //POLY_SIZE_8, Data_8
                data_init = 32'h11000028;
                data_init = 32'h11000028;
                data_crc = 32'hafdfff39;
                data_crc = 32'hafdfff39;
                golden = crc_8(data_crc[7:0], data_init);
                golden = crc_8(data_crc[7:0], data_init);
                write_ahb(CRC_POL, 32'h00000107, WORD);
                write_ahb(CRC_POL, 32'h00000107, WORD);
                write_ahb(CRC_CR, POLY_SIZE_8 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_8 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_7, Data_32
                //POLY_SIZE_7, Data_32
                data_init = 32'h11453087;
                data_init = 32'h11453087;
                data_crc = 32'haed7bcfd;
                data_crc = 32'haed7bcfd;
                golden = crc_7(data_crc[31:24], crc_7(data_crc[23:16], crc_7(data_crc[15:8], crc_7(data_crc[7:0], data_init))));
                golden = crc_7(data_crc[31:24], crc_7(data_crc[23:16], crc_7(data_crc[15:8], crc_7(data_crc[7:0], data_init))));
                write_ahb(CRC_POL, 32'h00000087, WORD);
                write_ahb(CRC_POL, 32'h00000087, WORD);
                write_ahb(CRC_CR, POLY_SIZE_7 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_7 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_7, Data_16
                //POLY_SIZE_7, Data_16
                data_init = 32'h00453057;
                data_init = 32'h00453057;
                data_crc = 32'haed773fd;
                data_crc = 32'haed773fd;
                golden = crc_7(data_crc[15:8], crc_7(data_crc[7:0], data_init));
                golden = crc_7(data_crc[15:8], crc_7(data_crc[7:0], data_init));
                write_ahb(CRC_POL, 32'h00000087, WORD);
                write_ahb(CRC_POL, 32'h00000087, WORD);
                write_ahb(CRC_CR, POLY_SIZE_7 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_7 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //POLY_SIZE_7, Data_8
                //POLY_SIZE_7, Data_8
                data_init = 32'h0045301d;
                data_init = 32'h0045301d;
                data_crc = 32'haed7732a;
                data_crc = 32'haed7732a;
                golden = crc_7(data_crc[7:0], data_init);
                golden = crc_7(data_crc[7:0], data_init);
                write_ahb(CRC_POL, 32'h00000087, WORD);
                write_ahb(CRC_POL, 32'h00000087, WORD);
                write_ahb(CRC_CR, POLY_SIZE_7 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_7 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
        //Test Case 6: Test REV_IN configuratin
        //Test Case 6: Test REV_IN configuratin
        //REV_IN_BYTE
        //REV_IN_BYTE
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                data_crc = 32'h1a2b3c4d;
                data_crc = 32'h1a2b3c4d;
                data_rev = 32'h58d43cb2;
                data_rev = 32'h58d43cb2;
                golden = crc_32(data_rev[31:24], crc_32(data_rev[23:16], crc_32(data_rev[15:8], crc_32(data_rev[7:0], data_init))));
                golden = crc_32(data_rev[31:24], crc_32(data_rev[23:16], crc_32(data_rev[15:8], crc_32(data_rev[7:0], data_init))));
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_IN_BYTE, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_IN_BYTE, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
        //REV_IN_HALF_WORD
        //REV_IN_HALF_WORD
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                data_crc = 32'h1a2b3c4d;
                data_crc = 32'h1a2b3c4d;
                data_rev = 32'hd458b23c;
                data_rev = 32'hd458b23c;
                golden = crc_32(data_rev[31:24], crc_32(data_rev[23:16], crc_32(data_rev[15:8], crc_32(data_rev[7:0], data_init))));
                golden = crc_32(data_rev[31:24], crc_32(data_rev[23:16], crc_32(data_rev[15:8], crc_32(data_rev[7:0], data_init))));
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_IN_HALF_WORD, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_IN_HALF_WORD, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
        //REV_IN_WORD
        //REV_IN_WORD
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                data_crc = 32'h1a2b3c4d;
                data_crc = 32'h1a2b3c4d;
                data_rev = 32'hb23cd458;
                data_rev = 32'hb23cd458;
                golden = crc_32(data_rev[31:24], crc_32(data_rev[23:16], crc_32(data_rev[15:8], crc_32(data_rev[7:0], data_init))));
                golden = crc_32(data_rev[31:24], crc_32(data_rev[23:16], crc_32(data_rev[15:8], crc_32(data_rev[7:0], data_init))));
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_IN_WORD, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_IN_WORD, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
        //Test Case 7: Test REV_OUT configuratin
        //Test Case 7: Test REV_OUT configuratin
        //REV_IN_BYTE
        //REV_IN_BYTE
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                data_crc = 32'h1a2b3c4d;
                data_crc = 32'h1a2b3c4d;
                golden = rev_out(crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init)))));
                golden = rev_out(crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init)))));
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_OUT_REV, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET | REV_OUT_REV, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
        //Test Case 8: Test RESET, Data 32
        //Test Case 8: Test RESET, Data 32
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
 
 
                //Data 1
                //Data 1
                data_crc = 32'h00112233;
                data_crc = 32'h00112233;
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 2
                //Data 2
                data_crc = 32'h44556677;
                data_crc = 32'h44556677;
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 3
                //Data 3
                data_crc = 32'h8899aabb;
                data_crc = 32'h8899aabb;
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 4
                //Data 4
                data_crc = 32'hccddeeff;
                data_crc = 32'hccddeeff;
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
 
 
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //Test Case 9: Test RESET, Data 16
                //Test Case 9: Test RESET, Data 16
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
 
 
                //Data 1
                //Data 1
                data_crc = 32'h00112233;
                data_crc = 32'h00112233;
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 2
                //Data 2
                data_crc = 32'h44556677;
                data_crc = 32'h44556677;
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 3
                //Data 3
                data_crc = 32'h8899aabb;
                data_crc = 32'h8899aabb;
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 4
                //Data 4
                data_crc = 32'hccddeeff;
                data_crc = 32'hccddeeff;
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_DR, data_crc, HALF_WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
 
 
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                golden = crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init));
                golden = crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init));
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //Test Case 10: Test RESET, Data 8
                //Test Case 10: Test RESET, Data 8
                data_init = 32'h14635287;
                data_init = 32'h14635287;
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
 
 
                //Data 1
                //Data 1
                data_crc = 32'h00112233;
                data_crc = 32'h00112233;
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 2
                //Data 2
                data_crc = 32'h44556677;
                data_crc = 32'h44556677;
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 3
                //Data 3
                data_crc = 32'h8899aabb;
                data_crc = 32'h8899aabb;
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                //Data 4
                //Data 4
                data_crc = 32'hccddeeff;
                data_crc = 32'hccddeeff;
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_DR, data_crc, BYTE);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
 
 
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                golden = crc_32(data_crc[7:0], data_init);
                golden = crc_32(data_crc[7:0], data_init);
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //Test Case 11: Write-Write-Reset
                //Test Case 11: Write-Write-Reset
                data_init = 32'h146352dd;
                data_init = 32'h146352dd;
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_POL, 32'h04c11db7, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_CR, POLY_SIZE_32 | RESET, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
 
 
                //Data 1
                //Data 1
                data_crc = 32'h55112233;
                data_crc = 32'h55112233;
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
 
 
                //Data 2
                //Data 2
                data_crc = 32'h44006677;
                data_crc = 32'h44006677;
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_CR, RESET, WORD);
                write_ahb(CRC_CR, RESET, WORD);
 
 
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], golden))));
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], golden))));
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
 
 
                //Data 3
                //Data 3
                data_crc = 32'h44005127;
                data_crc = 32'h44005127;
                data_init = 32'h11112222;
                data_init = 32'h11112222;
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_INIT, data_init, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                write_ahb(CRC_DR, data_crc, WORD);
                read_ahb(CRC_DR, result);
                read_ahb(CRC_DR, result);
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                golden = crc_32(data_crc[31:24], crc_32(data_crc[23:16], crc_32(data_crc[15:8], crc_32(data_crc[7:0], data_init))));
                compare(golden, result);
                compare(golden, result);
                $display("%x", golden);
                $display("%x", golden);
                $stop;
                $stop;
        end
        end
 
 
always #10
always #10
        HCLK = !HCLK;
        HCLK = !HCLK;
 
 
function [31:0] rev_out;
function [31:0] rev_out;
        input [31:0] in;
        input [31:0] in;
        integer i;
        integer i;
        begin
        begin
                for(i = 0; i < 32; i = i + 1)
                for(i = 0; i < 32; i = i + 1)
                        rev_out[i] = in[31 - i];
                        rev_out[i] = in[31 - i];
        end
        end
endfunction
endfunction
 
 
  function [31:0] crc_32;
  function [31:0] crc_32;
 
 
    input [7:0] Data;
    input [7:0] Data;
    input [31:0] crc;
    input [31:0] crc;
    reg [7:0] d;
    reg [7:0] d;
    reg [31:0] c;
    reg [31:0] c;
    reg [31:0] newcrc;
    reg [31:0] newcrc;
  begin
  begin
    d = Data;
    d = Data;
    c = crc;
    c = crc;
 
 
    newcrc[0] = d[6] ^ d[0] ^ c[24] ^ c[30];
    newcrc[0] = d[6] ^ d[0] ^ c[24] ^ c[30];
    newcrc[1] = d[7] ^ d[6] ^ d[1] ^ d[0] ^ c[24] ^ c[25] ^ c[30] ^ c[31];
    newcrc[1] = d[7] ^ d[6] ^ d[1] ^ d[0] ^ c[24] ^ c[25] ^ c[30] ^ c[31];
    newcrc[2] = d[7] ^ d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[24] ^ c[25] ^ c[26] ^ c[30] ^ c[31];
    newcrc[2] = d[7] ^ d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[24] ^ c[25] ^ c[26] ^ c[30] ^ c[31];
    newcrc[3] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[25] ^ c[26] ^ c[27] ^ c[31];
    newcrc[3] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[25] ^ c[26] ^ c[27] ^ c[31];
    newcrc[4] = d[6] ^ d[4] ^ d[3] ^ d[2] ^ d[0] ^ c[24] ^ c[26] ^ c[27] ^ c[28] ^ c[30];
    newcrc[4] = d[6] ^ d[4] ^ d[3] ^ d[2] ^ d[0] ^ c[24] ^ c[26] ^ c[27] ^ c[28] ^ c[30];
    newcrc[5] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[24] ^ c[25] ^ c[27] ^ c[28] ^ c[29] ^ c[30] ^ c[31];
    newcrc[5] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[24] ^ c[25] ^ c[27] ^ c[28] ^ c[29] ^ c[30] ^ c[31];
    newcrc[6] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[2] ^ d[1] ^ c[25] ^ c[26] ^ c[28] ^ c[29] ^ c[30] ^ c[31];
    newcrc[6] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[2] ^ d[1] ^ c[25] ^ c[26] ^ c[28] ^ c[29] ^ c[30] ^ c[31];
    newcrc[7] = d[7] ^ d[5] ^ d[3] ^ d[2] ^ d[0] ^ c[24] ^ c[26] ^ c[27] ^ c[29] ^ c[31];
    newcrc[7] = d[7] ^ d[5] ^ d[3] ^ d[2] ^ d[0] ^ c[24] ^ c[26] ^ c[27] ^ c[29] ^ c[31];
    newcrc[8] = d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[24] ^ c[25] ^ c[27] ^ c[28];
    newcrc[8] = d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[24] ^ c[25] ^ c[27] ^ c[28];
    newcrc[9] = d[5] ^ d[4] ^ d[2] ^ d[1] ^ c[1] ^ c[25] ^ c[26] ^ c[28] ^ c[29];
    newcrc[9] = d[5] ^ d[4] ^ d[2] ^ d[1] ^ c[1] ^ c[25] ^ c[26] ^ c[28] ^ c[29];
    newcrc[10] = d[5] ^ d[3] ^ d[2] ^ d[0] ^ c[2] ^ c[24] ^ c[26] ^ c[27] ^ c[29];
    newcrc[10] = d[5] ^ d[3] ^ d[2] ^ d[0] ^ c[2] ^ c[24] ^ c[26] ^ c[27] ^ c[29];
    newcrc[11] = d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[3] ^ c[24] ^ c[25] ^ c[27] ^ c[28];
    newcrc[11] = d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[3] ^ c[24] ^ c[25] ^ c[27] ^ c[28];
    newcrc[12] = d[6] ^ d[5] ^ d[4] ^ d[2] ^ d[1] ^ d[0] ^ c[4] ^ c[24] ^ c[25] ^ c[26] ^ c[28] ^ c[29] ^ c[30];
    newcrc[12] = d[6] ^ d[5] ^ d[4] ^ d[2] ^ d[1] ^ d[0] ^ c[4] ^ c[24] ^ c[25] ^ c[26] ^ c[28] ^ c[29] ^ c[30];
    newcrc[13] = d[7] ^ d[6] ^ d[5] ^ d[3] ^ d[2] ^ d[1] ^ c[5] ^ c[25] ^ c[26] ^ c[27] ^ c[29] ^ c[30] ^ c[31];
    newcrc[13] = d[7] ^ d[6] ^ d[5] ^ d[3] ^ d[2] ^ d[1] ^ c[5] ^ c[25] ^ c[26] ^ c[27] ^ c[29] ^ c[30] ^ c[31];
    newcrc[14] = d[7] ^ d[6] ^ d[4] ^ d[3] ^ d[2] ^ c[6] ^ c[26] ^ c[27] ^ c[28] ^ c[30] ^ c[31];
    newcrc[14] = d[7] ^ d[6] ^ d[4] ^ d[3] ^ d[2] ^ c[6] ^ c[26] ^ c[27] ^ c[28] ^ c[30] ^ c[31];
    newcrc[15] = d[7] ^ d[5] ^ d[4] ^ d[3] ^ c[7] ^ c[27] ^ c[28] ^ c[29] ^ c[31];
    newcrc[15] = d[7] ^ d[5] ^ d[4] ^ d[3] ^ c[7] ^ c[27] ^ c[28] ^ c[29] ^ c[31];
    newcrc[16] = d[5] ^ d[4] ^ d[0] ^ c[8] ^ c[24] ^ c[28] ^ c[29];
    newcrc[16] = d[5] ^ d[4] ^ d[0] ^ c[8] ^ c[24] ^ c[28] ^ c[29];
    newcrc[17] = d[6] ^ d[5] ^ d[1] ^ c[9] ^ c[25] ^ c[29] ^ c[30];
    newcrc[17] = d[6] ^ d[5] ^ d[1] ^ c[9] ^ c[25] ^ c[29] ^ c[30];
    newcrc[18] = d[7] ^ d[6] ^ d[2] ^ c[10] ^ c[26] ^ c[30] ^ c[31];
    newcrc[18] = d[7] ^ d[6] ^ d[2] ^ c[10] ^ c[26] ^ c[30] ^ c[31];
    newcrc[19] = d[7] ^ d[3] ^ c[11] ^ c[27] ^ c[31];
    newcrc[19] = d[7] ^ d[3] ^ c[11] ^ c[27] ^ c[31];
    newcrc[20] = d[4] ^ c[12] ^ c[28];
    newcrc[20] = d[4] ^ c[12] ^ c[28];
    newcrc[21] = d[5] ^ c[13] ^ c[29];
    newcrc[21] = d[5] ^ c[13] ^ c[29];
    newcrc[22] = d[0] ^ c[14] ^ c[24];
    newcrc[22] = d[0] ^ c[14] ^ c[24];
    newcrc[23] = d[6] ^ d[1] ^ d[0] ^ c[15] ^ c[24] ^ c[25] ^ c[30];
    newcrc[23] = d[6] ^ d[1] ^ d[0] ^ c[15] ^ c[24] ^ c[25] ^ c[30];
    newcrc[24] = d[7] ^ d[2] ^ d[1] ^ c[16] ^ c[25] ^ c[26] ^ c[31];
    newcrc[24] = d[7] ^ d[2] ^ d[1] ^ c[16] ^ c[25] ^ c[26] ^ c[31];
    newcrc[25] = d[3] ^ d[2] ^ c[17] ^ c[26] ^ c[27];
    newcrc[25] = d[3] ^ d[2] ^ c[17] ^ c[26] ^ c[27];
    newcrc[26] = d[6] ^ d[4] ^ d[3] ^ d[0] ^ c[18] ^ c[24] ^ c[27] ^ c[28] ^ c[30];
    newcrc[26] = d[6] ^ d[4] ^ d[3] ^ d[0] ^ c[18] ^ c[24] ^ c[27] ^ c[28] ^ c[30];
    newcrc[27] = d[7] ^ d[5] ^ d[4] ^ d[1] ^ c[19] ^ c[25] ^ c[28] ^ c[29] ^ c[31];
    newcrc[27] = d[7] ^ d[5] ^ d[4] ^ d[1] ^ c[19] ^ c[25] ^ c[28] ^ c[29] ^ c[31];
    newcrc[28] = d[6] ^ d[5] ^ d[2] ^ c[20] ^ c[26] ^ c[29] ^ c[30];
    newcrc[28] = d[6] ^ d[5] ^ d[2] ^ c[20] ^ c[26] ^ c[29] ^ c[30];
    newcrc[29] = d[7] ^ d[6] ^ d[3] ^ c[21] ^ c[27] ^ c[30] ^ c[31];
    newcrc[29] = d[7] ^ d[6] ^ d[3] ^ c[21] ^ c[27] ^ c[30] ^ c[31];
    newcrc[30] = d[7] ^ d[4] ^ c[22] ^ c[28] ^ c[31];
    newcrc[30] = d[7] ^ d[4] ^ c[22] ^ c[28] ^ c[31];
    newcrc[31] = d[5] ^ c[23] ^ c[29];
    newcrc[31] = d[5] ^ c[23] ^ c[29];
    crc_32 = newcrc;
    crc_32 = newcrc;
  end
  end
  endfunction
  endfunction
 
 
function [15:0] crc_16;
function [15:0] crc_16;
 
 
    input [7:0] Data;
    input [7:0] Data;
    input [15:0] crc;
    input [15:0] crc;
    reg [7:0] d;
    reg [7:0] d;
    reg [15:0] c;
    reg [15:0] c;
    reg [15:0] newcrc;
    reg [15:0] newcrc;
  begin
  begin
    d = Data;
    d = Data;
    c = crc;
    c = crc;
 
 
    newcrc[0] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
    newcrc[0] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
    newcrc[1] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
    newcrc[1] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
    newcrc[2] = d[1] ^ d[0] ^ c[8] ^ c[9];
    newcrc[2] = d[1] ^ d[0] ^ c[8] ^ c[9];
    newcrc[3] = d[2] ^ d[1] ^ c[9] ^ c[10];
    newcrc[3] = d[2] ^ d[1] ^ c[9] ^ c[10];
    newcrc[4] = d[3] ^ d[2] ^ c[10] ^ c[11];
    newcrc[4] = d[3] ^ d[2] ^ c[10] ^ c[11];
    newcrc[5] = d[4] ^ d[3] ^ c[11] ^ c[12];
    newcrc[5] = d[4] ^ d[3] ^ c[11] ^ c[12];
    newcrc[6] = d[5] ^ d[4] ^ c[12] ^ c[13];
    newcrc[6] = d[5] ^ d[4] ^ c[12] ^ c[13];
    newcrc[7] = d[6] ^ d[5] ^ c[13] ^ c[14];
    newcrc[7] = d[6] ^ d[5] ^ c[13] ^ c[14];
    newcrc[8] = d[7] ^ d[6] ^ c[0] ^ c[14] ^ c[15];
    newcrc[8] = d[7] ^ d[6] ^ c[0] ^ c[14] ^ c[15];
    newcrc[9] = d[7] ^ c[1] ^ c[15];
    newcrc[9] = d[7] ^ c[1] ^ c[15];
    newcrc[10] = c[2];
    newcrc[10] = c[2];
    newcrc[11] = c[3];
    newcrc[11] = c[3];
    newcrc[12] = c[4];
    newcrc[12] = c[4];
    newcrc[13] = c[5];
    newcrc[13] = c[5];
    newcrc[14] = c[6];
    newcrc[14] = c[6];
    newcrc[15] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
    newcrc[15] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
    crc_16 = newcrc;
    crc_16 = newcrc;
  end
  end
  endfunction
  endfunction
 
 
function [7:0] crc_8;
function [7:0] crc_8;
 
 
    input [7:0] Data;
    input [7:0] Data;
    input [7:0] crc;
    input [7:0] crc;
    reg [7:0] d;
    reg [7:0] d;
    reg [7:0] c;
    reg [7:0] c;
    reg [7:0] newcrc;
    reg [7:0] newcrc;
  begin
  begin
    d = Data;
    d = Data;
    c = crc;
    c = crc;
 
 
    newcrc[0] = d[7] ^ d[6] ^ d[0] ^ c[0] ^ c[6] ^ c[7];
    newcrc[0] = d[7] ^ d[6] ^ d[0] ^ c[0] ^ c[6] ^ c[7];
    newcrc[1] = d[6] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[6];
    newcrc[1] = d[6] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[6];
    newcrc[2] = d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[6];
    newcrc[2] = d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[6];
    newcrc[3] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[7];
    newcrc[3] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[7];
    newcrc[4] = d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4];
    newcrc[4] = d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4];
    newcrc[5] = d[5] ^ d[4] ^ d[3] ^ c[3] ^ c[4] ^ c[5];
    newcrc[5] = d[5] ^ d[4] ^ d[3] ^ c[3] ^ c[4] ^ c[5];
    newcrc[6] = d[6] ^ d[5] ^ d[4] ^ c[4] ^ c[5] ^ c[6];
    newcrc[6] = d[6] ^ d[5] ^ d[4] ^ c[4] ^ c[5] ^ c[6];
    newcrc[7] = d[7] ^ d[6] ^ d[5] ^ c[5] ^ c[6] ^ c[7];
    newcrc[7] = d[7] ^ d[6] ^ d[5] ^ c[5] ^ c[6] ^ c[7];
    crc_8 = newcrc;
    crc_8 = newcrc;
  end
  end
  endfunction
  endfunction
 
 
function [6:0] crc_7;
function [6:0] crc_7;
 
 
    input [7:0] Data;
    input [7:0] Data;
    input [6:0] crc;
    input [6:0] crc;
    reg [7:0] d;
    reg [7:0] d;
    reg [6:0] c;
    reg [6:0] c;
    reg [6:0] newcrc;
    reg [6:0] newcrc;
  begin
  begin
    d = Data;
    d = Data;
    c = crc;
    c = crc;
 
 
    newcrc[0] = d[7] ^ d[6] ^ d[5] ^ d[0] ^ c[4] ^ c[5] ^ c[6];
    newcrc[0] = d[7] ^ d[6] ^ d[5] ^ d[0] ^ c[4] ^ c[5] ^ c[6];
    newcrc[1] = d[5] ^ d[1] ^ d[0] ^ c[0] ^ c[4];
    newcrc[1] = d[5] ^ d[1] ^ d[0] ^ c[0] ^ c[4];
    newcrc[2] = d[7] ^ d[5] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[4] ^ c[6];
    newcrc[2] = d[7] ^ d[5] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[4] ^ c[6];
    newcrc[3] = d[6] ^ d[3] ^ d[2] ^ d[1] ^ c[0] ^ c[1] ^ c[2] ^ c[5];
    newcrc[3] = d[6] ^ d[3] ^ d[2] ^ d[1] ^ c[0] ^ c[1] ^ c[2] ^ c[5];
    newcrc[4] = d[7] ^ d[4] ^ d[3] ^ d[2] ^ c[1] ^ c[2] ^ c[3] ^ c[6];
    newcrc[4] = d[7] ^ d[4] ^ d[3] ^ d[2] ^ c[1] ^ c[2] ^ c[3] ^ c[6];
    newcrc[5] = d[5] ^ d[4] ^ d[3] ^ c[2] ^ c[3] ^ c[4];
    newcrc[5] = d[5] ^ d[4] ^ d[3] ^ c[2] ^ c[3] ^ c[4];
    newcrc[6] = d[6] ^ d[5] ^ d[4] ^ c[3] ^ c[4] ^ c[5];
    newcrc[6] = d[6] ^ d[5] ^ d[4] ^ c[3] ^ c[4] ^ c[5];
    crc_7 = newcrc;
    crc_7 = newcrc;
                end
                end
                endfunction
                endfunction
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.