[SV]用SystemVerilog實現CRC算法的案例

前言:

 

       如下面的案例,生成多项式为:'b1001_0111,初始值为:'hFF,则计算CRC的代码为:

program gen_crc;

  initial begin
    bit [19:0]            crc_data_in;
    bit [7:0]             generator = 8'b1001_0111;
    bit [7:0]             crc_out = 'hFF;
    bit tmp;

    for(int i = 19; i >= 0; i--) begin
      tmp = crc_out[7] ^ crc_data_in[i];
      crc_out[7] = crc_out[6];
      crc_out[6] = crc_out[5];
      crc_out[5] = crc_out[4] ^ tmp;
      crc_out[4] = crc_out[3];
      crc_out[3] = crc_out[2] ^ tmp;
      crc_out[2] = crc_out[1] ^ tmp;
      crc_out[1] = crc_out[0] ^ tmp;
      crc_out[0] = tmp;
      $display("Round %2d CRC = 0x%2h", 19-i, crc_out);
    end

    $display("CRC Appidex of of 0x%4h is 0x%2h", crc_data_in, crc_out);

  end

endprogram

       注意:可以直接通过生成多项式来写出计算CRC的代码,口诀如下:拿生成多项式的最高位分别与输入数据的没个bit做异或,计算结果为tmp,然后计算结果左移。

 

你可能感兴趣的:(SystemVerilog)