# common_ip **Repository Path**: fpga1988/common_ip ## Basic Information - **Project Name**: common_ip - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-12 - **Last Updated**: 2026-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用IP库 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](../../../LICENSE) [![iverilog](https://img.shields.io/badge/iverilog-compatible-green.svg)](https://github.com/steveicarus/iverilog) [English](README.en.md) | 中文 面向FPGA和ASIC设计的可复用、参数化IP核心库。所有模块兼容iverilog(`-g2012 -Wall`),遵循可综合RTL设计规范。 ## 概述 本库提供数字设计项目中常用的生产级IP核心。每个模块都经过充分测试、文档完善,易于集成。 ## 特性 - **80+ IP模块**,涵盖16个类别 - **参数化设计**,灵活配置 - **iverilog兼容** - 使用`-g2012 -Wall`测试 - **可综合RTL** - 设计文件中无仅仿真结构 - **层次化架构** - 复杂IP复用简单构建块 - **单元测试** - 包含完整测试平台 - **生产就绪** - 用于RISC-V异构计算平台 ## 目录结构 ``` common_ip/ ├── inc/ # 公共包和定义 │ └── ip_common_pkg.sv # 共享类型和常量 ├── rtl/ # RTL源文件 │ ├── alu/ # 算术逻辑单元 │ ├── arb/ # 仲裁器 │ ├── bit/ # 位操作 │ ├── buf/ # 缓冲器和FIFO │ ├── cdc/ # 跨时钟域 │ ├── chk/ # 校验和与CRC │ ├── clk/ # 时钟管理 │ ├── cmp/ # 比较器 │ ├── dec/ # 解码器 │ ├── ecc/ # 纠错码 │ ├── enc/ # 编码器 │ ├── mem/ # 存储块 │ ├── prng/ # 伪随机数生成器 │ ├── rst/ # 复位管理 │ ├── sort/ # 排序网络 │ └── sys/ # 系统工具 ├── tb/ # 测试平台 │ └── unit_tests/ # 单元测试文件 └── Makefile # 构建和测试自动化 ``` ## IP目录 ### 缓冲器IP (`buf`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_buf_sync_fifo` | 同步FIFO | DATA_WIDTH, DEPTH | | `ip_buf_async_fifo` | 异步FIFO(带CDC) | DATA_WIDTH, DEPTH, SYNC_STAGES | | `ip_buf_skid` | 流水线Skid缓冲器 | DATA_WIDTH | | `ip_buf_credit_ctrl` | 基于信用的流控 | DATA_WIDTH, MAX_CREDITS | | `ip_buf_width_conv` | 总线宽度转换器 | IN_WIDTH, OUT_WIDTH | ### 仲裁器IP (`arb`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_arb_priority` | 固定优先级仲裁器 | NUM_REQ | | `ip_arb_round_robin` | 轮询仲裁器 | NUM_REQ | | `ip_arb_wrr` | 加权轮询 | NUM_REQ, WEIGHT_WIDTH | | `ip_arb_dwrr` | 差额加权轮询 | NUM_REQ, WEIGHT_WIDTH | | `ip_arb_fifo` | 基于FIFO的仲裁器 | NUM_REQ | | `ip_arb_lru` | LRU替换仲裁器 | NUM_WAYS | ### 跨时钟域IP (`cdc`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_cdc_sync_2stage` | 2级同步器 | WIDTH | | `ip_cdc_sync_3stage` | 3级同步器 | WIDTH | | `ip_cdc_gray_counter` | 格雷码计数器 | WIDTH | | `ip_cdc_pulse_sync` | 脉冲同步器 | - | | `ip_cdc_bus_sync` | 多位总线同步器 | WIDTH | | `ip_cdc_handshake` | 握手同步器 | DATA_WIDTH | ### 时钟IP (`clk`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_clk_gate` | 时钟门控单元 | - | | `ip_clk_divider` | 时钟分频器 | DIV_WIDTH | | `ip_clk_delay_line` | 可编程延迟线 | STAGES | | `ip_clk_mux` | 无毛刺时钟选择器 | NUM_CLKS | ### 复位IP (`rst`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_rst_sync` | 复位同步器 | STAGES | | `ip_rst_por` | 上电复位生成器 | DELAY_CYCLES | ### 存储器IP (`mem`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_mem_sp_ram` | 单端口RAM | DATA_WIDTH, DEPTH | | `ip_mem_dp_ram` | 双端口RAM | DATA_WIDTH, DEPTH | | `ip_mem_tdp_ram` | 真双端口RAM | DATA_WIDTH, DEPTH | | `ip_mem_sdp_ram` | 简单双端口RAM | DATA_WIDTH, DEPTH | | `ip_mem_rom` | ROM | DATA_WIDTH, DEPTH | | `ip_mem_regfile` | 多端口寄存器堆 | DATA_WIDTH, DEPTH, RD_PORTS, WR_PORTS | | `ip_mem_cam` | 内容寻址存储器 | DATA_WIDTH, DEPTH | | `ip_mem_tcam` | 三态CAM | DATA_WIDTH, DEPTH | ### 算术IP (`alu`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_alu_fixed_point` | 定点运算 | WIDTH, FRAC_BITS | | `ip_alu_saturating` | 饱和运算 | WIDTH | | `ip_alu_mult` | 流水线乘法器 | WIDTH, PIPE_STAGES | | `ip_alu_div` | 迭代除法器 | WIDTH | | `ip_alu_mac` | 乘累加 | WIDTH, ACC_WIDTH | ### 位操作IP (`bit`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_bit_lzc` | 前导零计数 | WIDTH | | `ip_bit_popcnt` | 人口计数 | WIDTH | | `ip_bit_barrel` | 桶形移位器 | WIDTH | | `ip_bit_reversal` | 位反转 | WIDTH | | `ip_bit_xor_tree` | XOR归约树 | WIDTH | ### 编码器IP (`enc`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_enc_onehot` | 二进制转独热码 | WIDTH | | `ip_enc_parity` | 奇偶校验生成器 | WIDTH | | `ip_enc_shift_reg` | 移位寄存器 | WIDTH, DEPTH | | `ip_enc_manchester` | 曼彻斯特编码器 | - | | `ip_enc_nrzi` | NRZI编码器 | - | | `ip_enc_pam4` | PAM4符号映射器 | - | | `ip_enc_8b10b` | 8b/10b线路编码器 | - | | `ip_enc_64b66b` | 64b/66b线路编码器 | - | | `ip_enc_128b130b` | 128b/130b PCIe编码器 | - | ### 解码器IP (`dec`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_dec_onehot` | 独热码转二进制 | WIDTH | | `ip_dec_manchester` | 曼彻斯特解码器 | - | | `ip_dec_nrzi` | NRZI解码器 | - | | `ip_dec_pam4` | PAM4符号解映射器 | - | | `ip_dec_8b10b` | 8b/10b线路解码器 | - | | `ip_dec_64b66b` | 64b/66b线路解码器 | - | | `ip_dec_128b130b` | 128b/130b PCIe解码器 | - | ### 纠错码IP (`ecc`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_ecc_secded` | SEC-DED汉明码 | DATA_WIDTH | | `ip_ecc_scrambler` | 数据扰码器 | WIDTH, POLY | | `ip_ecc_gf_unit` | 伽罗华域运算 | M, POLY | | `ip_ecc_interleaver` | 块交织器 | WIDTH, DEPTH | | `ip_ecc_conv_encoder` | 卷积编码器 | K, G0, G1 | | `ip_ecc_viterbi_decoder` | 维特比解码器 | K, TRACEBACK_DEPTH | | `ip_ecc_bch_encoder` | BCH编码器 | N, K, T, M | | `ip_ecc_bch_decoder` | BCH解码器 | N, K, T, M | | `ip_ecc_rs_encoder` | Reed-Solomon编码器 | M, N, K, T | | `ip_ecc_rs_decoder` | Reed-Solomon解码器 | M, N, K, T | | `ip_ecc_ldpc_encoder` | LDPC编码器 | N, K, Z | | `ip_ecc_ldpc_decoder` | LDPC Min-Sum解码器 | N, K, LLR_WIDTH, MAX_ITER | ### 校验和IP (`chk`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_chk_checksum` | 互联网校验和 | WIDTH | | `ip_chk_crc` | CRC生成器 | DATA_WIDTH, CRC_WIDTH, POLY | ### 比较器IP (`cmp`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_cmp_array` | 并行比较器阵列 | WIDTH, NUM_INPUTS | | `ip_cmp_minmax` | 最小/最大值查找器 | WIDTH, NUM_INPUTS | ### 排序IP (`sort`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_sort_network` | 双调排序网络 | WIDTH, NUM_INPUTS | ### 系统IP (`sys`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_sys_counter` | 参数化计数器 | WIDTH | | `ip_sys_edge_detect` | 边沿检测器 | - | | `ip_sys_debouncer` | 信号去抖动 | DEBOUNCE_CYCLES | | `ip_sys_watchdog` | 看门狗定时器 | WIDTH | | `ip_sys_axi_lite` | AXI-Lite寄存器接口 | ADDR_WIDTH, DATA_WIDTH | | `ip_sys_irq_ctrl` | 中断控制器 | NUM_IRQ | ### 伪随机数IP (`prng`) | 模块 | 描述 | 参数 | |------|------|------| | `ip_prng_lfsr` | LFSR随机数生成器 | WIDTH, POLY | ## 快速开始 ### 编译 ```bash # 编译所有IP make compile # 编译特定类别 make compile_buf make compile_cdc # 运行所有测试 make test # 运行特定测试 make test_sync_fifo make test_async_fifo ``` ### 使用示例 ```systemverilog `timescale 1ns/1ps module my_design ( input logic clk, input logic rst_n, input logic [31:0] data_in, output logic [31:0] data_out ); // 实例化同步FIFO ip_buf_sync_fifo #( .DATA_WIDTH(32), .DEPTH(16) ) u_fifo ( .clk (clk), .rst_n (rst_n), .wr_en (wr_en), .wr_data (data_in), .full (full), .rd_en (rd_en), .rd_data (data_out), .empty (empty) ); endmodule ``` ## 命名规范 所有IP遵循一致的命名方案: - **模块**: `ip__` - **文件**: `ip__.sv` - **子模块**: `ip___.sv` - **测试平台**: `tb_ip__.sv` ## IP依赖关系 复杂IP复用简单构建块: ``` Level 0 (基础层) ├── ip_cdc_sync_2stage, ip_cdc_gray_counter ├── ip_mem_sp_ram, ip_mem_dp_ram ├── ip_enc_onehot, ip_dec_onehot, ip_enc_parity ├── ip_bit_lzc, ip_bit_popcnt, ip_bit_barrel └── ip_sys_counter, ip_sys_edge_detect Level 1 (中间层) ├── ip_buf_sync_fifo (使用 ip_mem_sp_ram) ├── ip_cdc_pulse_sync (使用 ip_cdc_sync_2stage) ├── ip_arb_priority, ip_arb_round_robin └── ip_ecc_secded (使用 ip_enc_parity) Level 2 (复杂层) ├── ip_buf_async_fifo (使用 ip_cdc_gray_counter, ip_cdc_sync_2stage, ip_mem_dp_ram) ├── ip_cdc_handshake (使用 ip_cdc_sync_2stage) ├── ip_clk_mux (使用 ip_cdc_sync_2stage, ip_clk_gate) └── ip_mem_regfile (使用 ip_arb_priority) ``` ## 测试结果 | 测试套件 | 测试数 | 状态 | |----------|--------|------| | CDC同步 | 11 | ✅ 通过 | | 同步FIFO | 23 | ✅ 通过 | | 异步FIFO | 15 | ✅ 通过 | | CDC握手 | 9 | ✅ 通过 | | 寄存器堆 | 10 | ✅ 通过 | | SECDED ECC | 15 | ✅ 通过 | | 时钟选择器 | 8 | ✅ 通过 | ## 环境要求 - **iverilog** >= 10.3 - **gtkwave** >= 3.3.100(用于波形查看) - **make** >= 3.81 ## 集成方式 本库设计为git子模块使用: ```bash # 添加为子模块 git submodule add https://gitee.com/fpga1988/common_ip common/design/ip # 更新子模块 git submodule update --init --recursive ``` ### 在项目中包含 ```systemverilog // 包含公共包 `include "ip_common_pkg.sv" // 导入包 import ip_common_pkg::*; // 实例化IP ip_buf_sync_fifo #( .DATA_WIDTH(32), .DEPTH(16) ) u_fifo ( .clk (clk), .rst_n (rst_n), // ... ); ``` ### Makefile集成 ```makefile # 添加到包含路径 IP_INC = common/design/ip/inc IP_RTL = common/design/ip/rtl IVERILOG_FLAGS = -g2012 -Wall -I$(IP_INC) # 包含IP源文件 IP_SRCS = $(wildcard $(IP_RTL)/*/*.sv) \ $(wildcard $(IP_RTL)/*/*/*.sv) ``` ## 设计规范 所有IP遵循以下设计原则: 1. **可综合** - 无仅仿真结构 2. **参数化** - 通过参数配置 3. **自包含** - 最小外部依赖 4. **充分测试** - 完整测试平台 5. **文档完善** - 清晰的注释和接口描述 ## 参与贡献 欢迎贡献!请确保: 1. 代码使用`iverilog -g2012 -Wall`编译通过 2. 所有注释和标识符使用英文 3. 遵循现有命名规范 4. 为新模块包含测试平台 5. 更新README中的IP条目 ## 许可证 见仓库根目录的[LICENSE](../../../LICENSE)文件。 ## 相关项目 - [RISC-V异构计算平台](https://gitee.com/cioo/ic1001) - 使用本IP库的主项目 - [CIOO](https://gitee.com/cioo) - 中国集成电路开源组织