# 时钟域、复位与跨时钟域设计说明 ## 1. 时钟拓扑 板级输入 `clk` 的周期为 20 ns,即 50 MHz。硬件路径由 `clk_pll` 产生 CPU、系统总线和 ML-KEM 三个时钟。当前实现报告记录的周期和频率如下。 | 时钟 | 周期 | 频率 | 主要负载 | |---|---:|---:|---| | `cpu_clk` | 30 ns | 33.333 MHz | OpenLA500 CPU、CPU 侧缓存和 AXI 主接口 | | `sys_clk` | 20 ns | 50 MHz | Crossbar、SRAM、UART、DMA、FFT、matmul 和系统寄存器 | | `mlkem_clk` | 13 ns | 76.923 MHz | ML-KEM AXI 从端、算法总控、Keccak、NTT 和多项式算子 | 三个时钟均由同一个 PLL 产生,但 `soc.xdc` 使用 `set_clock_groups -asynchronous` 将三者 划入独立异步组。工程含义是任何跨域逻辑都不能依赖固定相位关系,静态时序分析也不会把 普通组合路径当作同步时序路径检查。跨域正确性必须由双时钟 FIFO、同步器、握手协议和 专门的 CDC 验证保证。 ## 2. 模块归属 CPU 核及其 AXI 主端属于 CPU 域。CPU 发出的 AW、W、AR 通道在进入 Crossbar 前跨到 SYS 域,B 和 R 响应反向跨回 CPU 域。Crossbar 的两个主端、八个从端、外部 SRAM、 DMA、FFT、矩阵序列器和矩阵乘法器全部属于 SYS 域,这些模块之间是同步连接。 FFT/ML-KEM 共享从端的地址选择和 FFT 分支属于 SYS 域。ML-KEM 分支的完整 AXI 接口 跨到 ML-KEM 域后,`mlkem_axi_slave`、`mlkem_top` 及其所有叶子算子均在 `mlkem_clk` 下工作。密码核心内部没有第二个计算时钟。 ## 3. CPU--SYS AXI 跨域 `u_Axi_CDC` 为 AXI 的 AW、W、B、AR 和 R 五个通道分别设置双时钟 FIFO。AW、W 和 AR 在 CPU 域写入 FIFO、在 SYS 域读出;B 和 R 在 SYS 域写入、在 CPU 域读出。FIFO 将 valid/ready 反压限制在各自时钟域,并连同地址、ID、burst 属性、数据、WSTRB、响应和 RLAST/WLAST 一起跨域。 该结构不对多位 AXI payload 逐位使用两级同步器,而是在写时钟域稳定写入存储,使用同步 后的读写指针传递所有权,再在读时钟域读取。这是多位总线跨域的必要条件。AW 和 W 仍为 独立通道,下游从端必须按 AXI 规则处理两者不同拍到达,不能假设跨域 FIFO 会自动配对。 CPU--SYS 路径的延迟包含 FIFO 入队、指针同步和出队,不应通过 CPU 与 SYS 周期的简单 比例估算。端到端软件周期已经包含该延迟。 ## 4. SYS--ML-KEM AXI 跨域 `fft_mlkem_axi_slave` 在 SYS 域锁存目标选择。FFT 请求保持在 SYS 域;ML-KEM 请求进入 第二个 `Axi_CDC`,再由 ML-KEM 域的 `mlkem_axi_slave` 处理。该跨域同样覆盖 AXI 五个 通道,而不是只同步 start/done。因此配置寄存器、批量密钥窗口和读回数据都遵循统一的 AXI CDC 语义。 ML-KEM 完成中断在 `mlkem_clk` 域产生,先通过两级 `mlkem_intr_sync` 同步到 SYS 域。 由于完成状态保持到软件 W1C,接收端观察的是电平而不是单周期脉冲,避免因频率差异丢失 事件。软件读取 STATUS 获得最终完成语义,中断只负责通知。 ## 5. 中断到 CPU 的边界 当前 `soc_top` 将 `confreg_int`、DMA done、matmul done 和 ML-KEM done 组合后直接连接 到 CPU 的 `intrpt` 输入。其中 DMA 和 matmul 状态产生于 SYS 域;ML-KEM 状态虽已同步到 SYS 域,仍需跨入 CPU 域。它们均为保持到清除的电平信号,因此相较单拍脉冲更不易漏采, 但当前顶层没有为项目新增的三路中断显式实例化 CPU 域两级同步器。 严谨的前端实现应在 `cpu_clk` 域对每路异步电平增加两级 `ASYNC_REG` 同步,或把中断状态 放入已有的 CPU--SYS 握手寄存器。同步前的电平必须保持不少于两个 CPU 周期,清除语义也 应以 CPU 可观察到状态后再执行。该项属于时钟域实现风险,不能仅以板级轮询程序通过替代 结构验证。 ## 6. 复位生成与释放顺序 `rst_sync` 包含两个串联寄存器。输入复位有效时通过异步低电平立即把两级清零;输入复位 撤销后,逻辑 1 在本时钟域连续两个上升沿移入,形成异步断言、同步撤销的低有效复位。 硬件路径中,外部 reset 先复位 PLL。PLL `locked` 进入 SYS 域复位同步器,产生 `sys_resetn`;随后 `sys_resetn` 分别作为 CPU 和 ML-KEM 复位同步器输入,产生 `cpu_resetn` 和 `mlkem_resetn`。因此 SYS 域先释放,CPU 和 ML-KEM 域至少再等待各自两个 有效时钟边沿。CDC 两侧在各自复位释放前不得发送 valid,也不得保留上一轮 FIFO 所有权。 行为仿真 `SIMULATION=1` 不实例化 PLL。testbench 的 50 MHz 时钟直接作为 `sys_clk`, 内部 30 ns 周期时钟作为 `cpu_clk`,`mlkem_clk` 暂等于 `sys_clk`。此模式可验证复位顺序 和零事务,但不能验证真实 13 ns ML-KEM 时钟的相位、PLL 锁定过程或异步 FIFO 的全部 频率组合。 当前 20 us XSIM VCD 中,外部 reset 在 2.000 us 撤销,`sys_resetn`、`mlkem_resetn` 和 `cpu_resetn` 分别约在 2.030、2.070 和 2.085 us 释放。第一个 CPU ARVALID 约在 2.205 us 出现,复位释放前 UART、AXI、DMA 请求和加速器 start 均没有高电平。 ## 7. 跨域信号设计规则 单比特静态状态可以采用两级同步器,但源端必须保持足够长时间。单周期脉冲需要 toggle、 脉冲展宽或 request/ack 握手,不能直接送入另一个时钟域。多位配置和数据必须通过异步 FIFO、握手后稳定保持的影子寄存器或双口存储传递,禁止逐位同步后重新组合。 复位也是跨域信号。每个时钟域必须使用本地同步释放的 resetn,不能用另一个域同步器的 输出直接复位本域大量寄存器。所有 CDC 结构的两侧复位关系必须保证复位期间不会把残留 valid 解释为新事务。 ## 8. 时序与验证方法 单域时序分别在 `cpu_clk`、`sys_clk` 和 `mlkem_clk` 路径组内检查 setup 和 hold。由于 时钟组被声明为异步,跨域路径不应以普通 WNS 作为正确性依据。验证应包括 CDC 结构审查、 同步寄存器属性检查、异步 FIFO 满空边界、随机相位/频率仿真、复位任意时刻进入,以及 valid/ready 双向反压。 板级功能测试证明常用任务能够跨域完成,但不能观察亚稳态。报告中的时钟域结论应分别 引用时钟报告、单域时序报告、复位波形和 CDC 结构说明,避免用单一板级 PASS 替代这些 不同层次的证据。