Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >寻找Systemverilog中的CRC实现

寻找Systemverilog中的CRC实现
EN

Stack Overflow用户
提问于 2013-07-15 06:15:00
回答 2查看 9.3K关注 0票数 1

总之,我正在寻找一个实现CRC生成器(或校验器)的类或模块。我可以从头开始创建一个,但如果有现成的,那可能是一个实时的节省:-)

谢谢!范围

EN

回答 2

Stack Overflow用户

发布于 2016-10-18 12:59:45

下面是CRC计算的另一个例子。以下示例按顺序计算CRC。因此,与使用XOR并行计算每个CRC位的其他解决方案相比,它们速度较慢。但是,如果您需要不同的多项式,我发现此解决方案更具"customizable“。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
localparam CRC32POL = 32'hEDB88320; /* Ethernet CRC-32 Polynom, reverse Bits */

function automatic bit[31:0] genCRC32(input bit [7:0] databyte_stream[]);
    int unsigned i, j;
    bit [31:0] crc32_val = 32'hffffffff; // shiftregister,startvalue 
    bit [7:0]  data;

    //The result of the loop generate 32-Bit-mirrowed CRC
    for (i = 0; i < databyte_stream.size; i++)  // Byte-Stream
    begin
        data = databyte_stream[i];
        for (j=0; j < 8; j++) // Bitwise from LSB to MSB
        begin
            if ((crc32_val[0]) != (data[0])) begin
                crc32_val = (crc32_val >> 1) ^ CRC32POL;
            end else begin
                crc32_val >>= 1;
            end
            data >>= 1;
        end
    end
    crc32_val ^= 32'hffffffff; //invert results
    return crc32_val;
endfunction : genCRC32

您可以从以下网站自动生成CRC

一个类似的使用TOPBIT而不是LSB位的C语言实现。来自Altera示例:https://www.altera.com/content/dam/altera-www/global/en_US/others/support/examples/download/crc_accelerator.zip

用德语,在维基百科上。有关于如何计算这一点的例子。https://de.wikipedia.org/wiki/Zyklische_Redundanzprüfung

来自:https://www.altera.com/support/support-resources/design-examples/intellectual-property/embedded/nios-ii/exm-crc-acceleration.html

在systemverilog中,完全配置的CRC计算器的示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
localparam CRC_BW        = 8;
localparam CRCXPOLYREV  = 'hE0;    /* CRC-8 Polynom, umgekehrte Bitfolge */
localparam CRCXPOLY     = 'h07;    /* CRC-8 Polynom,  Bitfolge */

function automatic logic[CRC_BW-1:0] generateCRC_X(
     logic [7:0] databyte_stream[],
     input logic reversed_poly=0,
     input logic[CRC_BW-1:0] start_crc_value='1, 
     input logic[CRC_BW-1:0] final_crc_xor_value='0,
     input logic do_end_crc_reversebits=0);
    int unsigned i, j;
    bit [CRC_BW-1:0] crcx_tmp,crcx_val = start_crc_value; /* Schieberegister, Startwert (111...) */
    bit [7:0]  data;


    //Ergebnis der Schleife gibt 8-Bit-gespiegelte CRC
    for (i = 0; i < databyte_stream.size; i++)  // Byte-Stream
    begin
        if (reversed_poly==1) begin
            data = databyte_stream[i];

            for (j=0; j < 8; j++) // from LSB to MSB in one byte!
            begin
                if ((crcx_val[0]) != (data[0]))
                    crcx_val = (crcx_val >> 1) ^ CRCXPOLYREV;
                else
                    crcx_val >>= 1;

                data >>= 1;
            end
        end else begin
            data = databyte_stream[i];
            for (j=0; j < 8; j++) // from LSB to MSB in one byte
            begin
                if ((crcx_val[CRC_BW-1]) != (data[7]))
                    crcx_val = (crcx_val << 1) ^ CRCXPOLY;
                else
                    crcx_val <<= 1;

                data <<= 1;
            end
        end
    end
    crcx_val ^= final_crc_xor_value; //Ergebnis invertieren
    if (do_end_crc_reversebits==1) begin
        for (j=0; j < CRC_BW; j++) // from LSB to MSB in the CRC bitwidth
        begin
            crcx_tmp[CRC_BW-1-j]=crcx_val[j];//reversed
        end
        crcx_val=crcx_tmp;
    end
    return crcx_val;
endfunction : generateCRC_X

为了测试CRC,我推荐使用http://www.zorc.breitbandkatze.de/crc.html

票数 1
EN

Stack Overflow用户

发布于 2013-10-06 07:37:22

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function byte calc_crc(byte unsigned cmd[]);
    bit [7:0] crc, d, c;
    int i;
    crc = 0;

    for (i=0; i<cmd.size(); i++) begin
            d = cmd[i];
            c = crc;
            crc[0] = d[7] ^ d[6] ^ d[0] ^ c[0] ^ c[6] ^ c[7];
            crc[1] = d[6] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[6];
            crc[2] = d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[6];
            crc[3] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[7];
            crc[4] = d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4];
            crc[5] = d[5] ^ d[4] ^ d[3] ^ c[3] ^ c[4] ^ c[5];
            crc[6] = d[6] ^ d[5] ^ d[4] ^ c[4] ^ c[5] ^ c[6];
            crc[7] = d[7] ^ d[6] ^ d[5] ^ c[5] ^ c[6] ^ c[7];
    //$display("crc result: %h",crc);
    end
    return crc;
endfunction 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17647819

复制
相关文章
SystemVerilog面试题:使用SystemVerilog中的constraints实现randc行为
在SystemVerilog中,用randc关键字声明的变量是循环随机(random-cyclic)变量,在其声明范围内循环随机,直到所有的值都随机过。
AsicWonder
2021/07/16
2.2K0
SystemVerilog面试题:使用SystemVerilog中的constraints实现randc行为
SystemVerilog中Assertions
● 如果一个在模拟中被检查的属性(property)不像我们期望的那样表现,那么这个断言失败。
数字IC小站
2020/07/01
9480
SystemVerilog中Package
Package是systemverilog中的语言结构,它使相关的声明和定义能够组合在一起。Package可能包含类型定义,常量声明,函数和类模板。为了能在一个范围内使用Package,必须先导入它,然后才能引用其内容。
数字IC小站
2020/06/30
1.9K0
LabVIEW实现CRC校验
CRC(循环冗余校验),是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
不脱发的程序猿
2022/04/13
2.6K0
LabVIEW实现CRC校验
CRC校验的FPGA实现
CRC定义 CRC(Cyclic Redundancy Check),循环冗余校验,其特征是信息字段和校验字段的长度可以任意选定,CRC编码格式是在k位有效数据之后添加r位校验码,形成总长度为n(K+R)位的CRC码。
根究FPGA
2020/06/30
3.6K0
CRC校验的FPGA实现
SystemVerilog中$cast方法
$cast可以对不同的内建类型进行转换,用的更多的是不同层次之间类的转换。在这种父类与子类之间的转换里, 父类站的高,子类在底下,从父类向子类的转换,称为向下类型转换,而子类向父类的转换称为向上类型转换。向上类型转换是安全的,而反之则是不安全的。原因在于子类既然继承了父类,就拥有父类的一切属性,除此之外,龙生九子,各有不同,子类还有自己独特的个性,这些是父类没有的。当进行向上类型转换时,相当于父类的句柄指向子类对象,这样的话句柄仍然能对子类对象与父类相同的属性进行访问。但是反过来,如果向下类型转换也那么自由,当试图把子类的句柄指向父类的对象会发生什么呢?父类本来划好了一小块地盘,但是因为子类含有比父类更丰富的属性,它很有可能会访问父类并不包含的资源,这时就找不到该资源,越界了,因此会有error。父类就好像上海,子类相当于长三角地区,包含但不仅仅是上海,因此父类能到的地方子类都可以到,反之不行,因此把子类的句柄给父类没关系,但反之不行,所以向下类型是需要有严格的类型检查的,阻止非法转换。
数字IC小站
2020/06/30
1.8K0
SystemVerilog中function coverage
1、面向数据的覆盖率:主要是检查数据值的组合逻辑是否会发生,我们通过编写coverage group, coverage points和across coverage, 我们获得面向数据的功能覆盖率大小。
数字IC小站
2020/07/01
2.3K0
SystemVerilog中scheduler(调度)
虽然设计的代码在仿真器中理论上来说是可以并行执行的,但是在实际仿真中,代码都是运行在CPU上的一些程序而已。SV为代码的执行顺序定义了调度机制,最大限度的减少不确定性的产生。
数字IC小站
2020/06/30
1.1K0
SystemVerilog中的callback(回调)
在第二次systemverilog实验中,我看到有同学用到了callback函数,今天就是简单讲讲这个方法。
数字IC小站
2020/06/30
2.6K0
SystemVerilog中interface的几点理解
在SV中常用interface连接端口,它的好处在于,方便了在sv中模块声明中不需要一个个的写端口,直接在端口中实例化一个interface即可。接口中还可以包含任务函数、断言等等。说多了咱也记不住,就说这点吧。不过我觉得最好用的还是第一点哈。
数字IC小站
2020/06/30
3.3K0
SystemVerilog中unique与priority
在Verilog中,代码不规范的case语句经常会导致意外的综合优化或意外的latch。如果未在硅前仿真或门级仿真中发现这些问题,则很容易导致芯片无法正常工作。SystemVerilog 拥有unique关键字和priority关键字,旨在解决上述问题。
数字IC小站
2020/06/30
2.1K0
使用SystemVerilog简化FPGA中的接口
FPGA工程师们应该都会吐槽Verilog的语法,相当的不友好,尤其是对于有很多接口的模块,像AXI4/AXI-Lite这种常用的总线接口,动不动就好几十根线,写起来是相当费劲。
猫叔Rex
2020/07/22
1.3K0
SystemVerilog中的Process(2)--- 进程的控制
Hello everybody,我们接着上期的Process(1)-产生进程的方式(点击跳转)继续讲解SystemVerilog中对于process的多种控制方式。
IC验证
2020/09/01
3.8K0
SystemVerilog中的Process(2)--- 进程的控制
CRC-16校验和实现
❝从Qt源码摘取的CRC-16校验和实现。❞ static const quint16 crc_tbl[16] = { 0x0000, 0x1081, 0x2102, 0x3183, 0x4204, 0x5285, 0x6306, 0x7387, 0x8408, 0x9489, 0xa50a, 0xb58b, 0xc60c, 0xd68d, 0xe70e, 0xf78f }; enum ChecksumType { ChecksumIso3309, Chec
Qt君
2023/03/17
1.3K0
CRC-16校验和实现
再谈systemverilog中automatic与static
如果变量被声明为automatic,那么进入该方法后,就会自动创建,离开该方法后,就会被销毁;而static则是在仿真开始时就会被创建,直到仿真结束,可以被多个方法/进程共享。
数字IC小站
2020/06/30
1.6K0
C# CRC8实现
http://www.cnblogs.com/canny/archive/2004/12/27/82468.aspx
用户3135539
2018/09/12
4K1
SystemVerilog中多态与虚方法
在验证过程中,往测试平台中添加新的测试激励很正常的事,这样的话就需要对原来的测试平台进行改进,有的时候需要修改原来的代码甚至可能修改一些数据结构,这个过程中可能会导致在原来的验证平台中引入意外的错误。那么为了保证原有平台或数据结构不变,通过对已经有的基类进行引申或者扩展,从而完善整个验证平台。 从基类做扩展并产生新的子类的过程叫类的派生,当一个类被扩展并创建之后,该派生类就继承了其基类的数据成员、属性和方法,这就是类的继承。 继承后的类可以实现以下功能: 1.继承了原来类中的方法,并可以修改 2.添加新的方法 3.添加新的数据成员 在实现以上功能的同时需要满足一定的规则: 1.子类继承父类的所有数据成员和方法 2.子类可以添加新的数据成员和方法 3.子类可以重写父类中的数据成员和方法 4.如果一个方法被重写,其必须保持和父类中原有定义有一致的参数 5.子类可以通过super操作符来引用父类中的方法和成员 6.被声明为local的数据成员和方法只能对自己可见,对外部和子类都不可见;对声明为protected的数据成员和方法,对外部不可见,对自身和子类可见。
数字IC小站
2020/06/30
1.4K0
使用boost库实现的CRC64示例
https://www.boost.org/doc/libs/1_71_0/boost/crc.hpp https://stackoverflow.com/questions/50765230/use-boost-to-compute-ecma-128-64bit-crc
Qt君
2019/11/04
1.4K0
SystemVerilog中的Process(1)--- 产生进程的方式
Hello,everybody,本期由黄鸭哥给大家带来验证干货,猜猜这次会给你们带来什么干货呢。
IC验证
2020/07/28
1.8K0
SystemVerilog中的Process(1)--- 产生进程的方式
SystemVerilog与Verilog中多重定义
最常见的情况就是在写的Testbench中,一般来说,我们首先会创建一个数据包packet类,然后分别在generator、driver、scoreboard等类中调用它,也就是说多个文件包含同一个文件,这时候如何不添加其他语句,仿真器预处理时就会出现多重定义的错误。
数字IC小站
2020/06/30
1.7K0

相似问题

在systemverilog中实现for循环

161

在封闭协议中寻找CRC算法

14

CRC在python中的实现

12

CRC算法的实现

10

CRC算法的实现

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文