在 FPGA/IC 设计中,CRC 校验是一个常见的问题,广泛应用于以太网、SATA、PCIe 等高速通信协议中。许多工程师在验证阶段常常困扰于如何高效检测 CRC 的正确性,尤其是在大数据流、高压力场景下。
其实,我们可以借助 Python 来大大简化这一过程。Python 拥有成熟的 CRC 计算库,可以将响应的数据流导出为 TXT 文件,再由 Python 脚本进行 CRC 校验。同时,如果使用 Cocotb 等基于 Python 的硬件仿真平台,还可以直接在仿真过程中集成 CRC 验证逻辑,从而实现更高效、更灵活的验证方法。
介绍
crcmod是一个用于生成计算循环冗余校验(CRC)的Python模块,支持8、16、24、32和64位CRC。它提供纯Python实现和可选的C扩展加速计算,用户可自定义多项式或使用预定义算法,并支持生成其他语言(如C/C++)的CRC计算代码。
安装
C扩展
确保系统已安装Python开发工具及C编译器(如GCC、Clang或Windows的MinGW/MSVC),具体可参考Python官方文档关于构建C扩展的指南。
如果没有可自行安装
LINUX:
# Debian/Ubuntu
sudo apt-get install build-essential python3-dev
# CentOS
sudo yum groupinstall "Development Tools" && sudo yum install python3-develWINDOWS:
需要安装适合的C/C++编译器和编译选项支持,例如GCC或Visual Studio。安装crcmod库
pip install crcmod # 基础安装离线安装
下载 Source Distribution , crcmod-1.7.tar.gz (89.7 kB view details)
https://pypi.org/project/crcmod/1.7/#filesLINUX:
python setup.py installWINDOWS:
python setup.py build --compiler=mingw32 install验证安装
运行单元测试确认安装正确
import crcmod.test
crcmod.test.run()使用
基础使用:mkCrcFun函数工厂
通过mkCrcFun()创建CRC计算函数,需指定多项式(poly)与其他可选参数:
import crcmod
# 创建自定义CRC-32函数(多项式0x104C11DB7,初始值0,异或输出0xFFFFFFFF)
crc32_func = crcmod.mkCrcFun(0x104C11DB7, initCrc=0, rev=True, xorOut=0xFFFFFFFF)
# 计算字节串CRC
data = b'\x12\x34\x56\x78\xaa\xbb\xcc\dd'
crc_value = crc32_func(data)
print(hex(crc_value)) # 输出:0x32214a75参数说明:
poly:多项式(整数形式,如32位多项式0x104C11DB7)。
initCrc:初始值(默认全1,避免忽略前导0,大端模式,对于反向算法(rev=True),需先将初始值反转(按位序)后再参与计算)。
rev:是否反转算法(表示输入反转且输出反转默认True,常见于CRC-32)。
xorOut:最终异或值(如CRC-32通常为0xFFFFFFFF)。
example:
crcmod的初值和硬件的初值是有出入的,硬件是处理之后的初值,crcmod是处理之前的初值
更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!