Design a CRC-32 checksum calculator using the Ethernet polynomial.

Module name: crc32_calc
Parameters:
  - BUS_WIDTH = 8   // Number of bits processed per cycle (8, 16, or 32)

Ports:
  - input                        clk
  - input                        rst_n        // Active-low synchronous reset
  - input  [BUS_WIDTH-1:0]       data_in      // Input data byte(s)
  - input                        data_valid   // High when data_in is valid
  - input                        data_last    // Marks last byte of the frame
  - output [31:0]                crc_out      // Final CRC-32 value
  - output                       crc_valid    // High for one cycle when crc_out is valid

Functional specification:
  - Implements CRC-32 with Ethernet polynomial 0x04C11DB7
  - Standard CRC-32: init value = 0xFFFFFFFF, final XOR = 0xFFFFFFFF
  - Bit-reversed (reflect input bytes and reflect final output)
  - Process one byte per clock cycle when data_valid is asserted (BUS_WIDTH=8)
  - Use XOR-based combinational logic for the CRC update (no lookup table)
  - When data_last is asserted alongside data_valid, incorporate the final byte,
    apply final XOR, output crc_out, assert crc_valid for one cycle, and reset
    internal state for the next frame
  - crc_valid is 0 at all other times
  - On rst_n, clear internal CRC state to init value
  - Known test vector: CRC32("123456789") = 0xCBF43926
