data/full_repos/permissive/165659134/rtl/crc8.v
data/verilator_xmls/96f1b611-2c97-4d0f-9ece-9bfa0edcb678.xml
module crc8
(
  input        clk,
  input        rst_n,
  input  [7:0] data_in,
  input        crc_en,
  output [7:0] crc_out
);

  reg [7:0] lfsr_r,lfsr_c;

  assign crc_out = lfsr_r;

  always @(*)
  begin: lfsr_comb_proc
    lfsr_c[0] = lfsr_r[0] ^ lfsr_r[1] ^ lfsr_r[3] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[7] ^ data_in[0] ^ data_in[1] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[7];
    lfsr_c[1] = lfsr_r[0] ^ lfsr_r[2] ^ lfsr_r[3] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[6] ^ data_in[7];
    lfsr_c[2] = lfsr_r[0] ^ lfsr_r[5] ^ data_in[0] ^ data_in[5];
    lfsr_c[3] = lfsr_r[0] ^ lfsr_r[3] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[0] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[4] = lfsr_r[1] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[1] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[5] = lfsr_r[2] ^ lfsr_r[5] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[2] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[6] = lfsr_r[0] ^ lfsr_r[1] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[6] ^ data_in[0] ^ data_in[1] ^ data_in[4] ^ data_in[5] ^ data_in[6];
    lfsr_c[7] = lfsr_r[0] ^ lfsr_r[2] ^ lfsr_r[3] ^ lfsr_r[4] ^ lfsr_r[6] ^ data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[6];
  end

  always @(posedge clk or negedge rst_n)
  begin: lfsr_r_proc
    if(!rst_n) begin
      lfsr_r <= {8{1'b1}};
    end
    else begin
      lfsr_r <= crc_en ? lfsr_c : lfsr_r;
    end
  end

endmodule
module crc8
(
  input        clk,
  input        rst_n,
  input  [7:0] data_in,
  input        crc_en,
  output [7:0] crc_out
);


  reg [7:0] lfsr_r,lfsr_c;

  assign crc_out = lfsr_r;

  always @(*)
  begin: lfsr_comb_proc
    lfsr_c[0] = lfsr_r[0] ^ lfsr_r[1] ^ lfsr_r[3] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[7] ^ data_in[0] ^ data_in[1] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[7];
    lfsr_c[1] = lfsr_r[0] ^ lfsr_r[2] ^ lfsr_r[3] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[6] ^ data_in[7];
    lfsr_c[2] = lfsr_r[0] ^ lfsr_r[5] ^ data_in[0] ^ data_in[5];
    lfsr_c[3] = lfsr_r[0] ^ lfsr_r[3] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[0] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[4] = lfsr_r[1] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[1] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[5] = lfsr_r[2] ^ lfsr_r[5] ^ lfsr_r[6] ^ lfsr_r[7] ^ data_in[2] ^ data_in[5] ^ data_in[6] ^ data_in[7];
    lfsr_c[6] = lfsr_r[0] ^ lfsr_r[1] ^ lfsr_r[4] ^ lfsr_r[5] ^ lfsr_r[6] ^ data_in[0] ^ data_in[1] ^ data_in[4] ^ data_in[5] ^ data_in[6];
    lfsr_c[7] = lfsr_r[0] ^ lfsr_r[2] ^ lfsr_r[3] ^ lfsr_r[4] ^ lfsr_r[6] ^ data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[6];
  end

  always @(posedge clk or negedge rst_n)
  begin: lfsr_r_proc
    if(!rst_n) begin
      lfsr_r <= {8{1'b1}};
    end
    else begin
      lfsr_r <= crc_en ? lfsr_c : lfsr_r;
    end
  end

endmodule