基于开源 UART 的同步复位验证学习项目,不是原创 UART IP。
复用 Ben Marshall 的 uart,MIT;
固定版本 5fd2db850a41b65aa34f3a31c663fc8704c7abd8。
只取其中 TX,不生成 RX/FIFO/VGA 系统,不提供 AX7010 板级约束。
上游TX端口注释写“Asynchronous active low reset”,但所有寄存器使用
always @(posedge clk) 并在内部检查 !resetn:实现是低有效同步复位。
本项目仅纠正这个注释,保留RTL行为;新增自检TB、故障注入CI和中文接口说明。
不是修复上游功能缺陷,也没有声称完整UART已验证。
resetn=0:到时钟上升沿才复位,TX回到空闲高电平,busy清零。- 若低脉冲完全在两个上升沿之间,该实现不会采到它。
- 空闲时上升沿采到en=1,模块锁存发送数据、busy置位;TX输出为寄存器,起始位再晚一沿出现。
- busy期间本TB只观察起始位和复位取消行为;完整数据、停止位、波特率误差未覆盖。
- 改成异步复位不一定是“错误设计”,但会违反这里对既有实现的行为契约。
安装Icarus Verilog,在仓库根目录:
mkdir -p build
iverilog -g2012 -s tb_tx_reset -o build/reset rtl/uart_tx.v tb/tb_tx_reset.sv
vvp build/resetWindows需提供相应工具并先创建build目录。成功标记:RESET_CONTRACT_PASS checks=8。 复位自检发生在上升沿后1ns,下降沿附近驱动,时钟周期10ns。 CI还会把复位临时变成异步;TB必须捕获该变化,不修改正式RTL。 GitHub Actions的正常任务失败或故障变体没有被捕获,整个工作流失败。 工作流保存日志和VCD;实际状态见Actions。
仿真练习;没有Vivado实现、时序收敛或AX7010上板结论。 固定测试参数100MHz/1Mbaud、8数据位/1停止位;不验证完整帧或任意参数。 上游的波特率计数、位宽边界等不在本次测试范围,不能因复位测试通过就用于生产。 维护者正在学习UART;AI辅助添加文档和测试,不宣称已逐行人工掌握。