# Uart_tx 芯片基本信息

## 1. 芯片概述

Uart_tx 是一个功能完备的通用异步收发器（UART）的发送部分模块，负责将 8 位并行数据转换为符合标准 UART 协议的串行数据帧输出。模块内部集成了 16 字节深的 FIFO 缓冲器，提供高度可配置的数据帧格式。

## 2. 芯片类型

**时序电路（Sequential Circuit）**

- 所有逻辑同步于时钟 `PCLK` 的上升沿
- 包含寄存器和状态机
- 支持异步复位 `PRESETn`（低电平有效）

## 3. 接口端口分析

### 3.1 输入端口

| 端口名称 | 位宽 | 类型 | 功能描述 |
|---------|------|------|----------|
| `PCLK` | 1-bit | 时钟输入 | 系统主时钟，所有时序逻辑在其上升沿触发 |
| `PRESETn` | 1-bit | 复位输入 | 低电平有效的异步复位信号，复位所有内部状态和寄存器 |
| `PWDATA` | 8-bit | 数据输入 | 并行输入数据，在 `tx_fifo_push` 有效时写入 FIFO |
| `tx_fifo_push` | 1-bit | 控制输入 | FIFO 写入使能信号，高电平有效，持续一个时钟周期 |
| `LCR` | 8-bit | 配置输入 | 线控制寄存器，配置数据帧格式（数据位宽、校验位、停止位）|
| `enable` | 1-bit | 控制输入 | 发送过程使能信号，控制发送状态机和位计数器的运行 |

### 3.2 输出端口

| 端口名称 | 位宽 | 类型 | 功能描述 |
|---------|------|------|----------|
| `TXD` | 1-bit | 数据输出 | 串行数据输出线，空闲时保持高电平 |
| `busy` | 1-bit | 状态输出 | 发送忙标志，高电平表示正在发送数据帧 |
| `tx_fifo_empty` | 1-bit | 状态输出 | FIFO 空标志，高电平表示 FIFO 中无数据 |
| `tx_fifo_full` | 1-bit | 状态输出 | FIFO 满标志，高电平表示 FIFO 已满（16 字节）|
| `tx_fifo_count` | 5-bit | 状态输出 | FIFO 数据计数，实时指示 FIFO 中的数据字节数（0-16）|

### 3.3 级联端口（Cascaded Port）

- `tx_fifo`：包含所有以 `tx_fifo_` 前缀的端口，方便统一访问 FIFO 相关信号

## 4. 功能分类

### 4.1 FIFO 管理功能（约 8 个功能点）

1. **FIFO 写入操作**：通过 `tx_fifo_push` 和 `PWDATA` 写入数据
2. **FIFO 读取操作**：内部状态机从 FIFO 读取数据进行发送
3. **FIFO 空标志**：`tx_fifo_empty` 指示 FIFO 为空
4. **FIFO 满标志**：`tx_fifo_full` 指示 FIFO 已满
5. **FIFO 计数**：`tx_fifo_count` 实时显示 FIFO 中数据量
6. **FIFO 指针管理**：内部写指针和读指针的回绕处理
7. **FIFO 并发读写**：同时读写时的正确处理
8. **FIFO 边界处理**：满时写入、空时读取的保护

### 4.2 串行发送功能（约 10 个功能点）

1. **起始位生成**：发送数据帧的起始位（0）
2. **数据位发送**：按 LSB-first 顺序发送数据位
3. **校验位生成**：根据配置计算并发送校验位
4. **停止位生成**：发送停止位（1 或 1.5 或 2 位）
5. **状态机控制**：管理发送过程的状态转换
6. **位时序控制**：每个位持续 16 个时钟周期
7. **发送忙指示**：`busy` 信号指示发送状态
8. **串行输出**：`TXD` 输出串行数据
9. **FIFO 数据锁存**：将 FIFO 数据锁存到发送缓冲区
10. **空闲状态维护**：发送完成后返回空闲状态

### 4.3 配置管理功能（约 9 个功能点）

通过 `LCR` 寄存器配置：

1. **5 位数据位宽配置**：`LCR[1:0] = 2'b00`
2. **6 位数据位宽配置**：`LCR[1:0] = 2'b01`
3. **7 位数据位宽配置**：`LCR[1:0] = 2'b10`
4. **8 位数据位宽配置**：`LCR[1:0] = 2'b11`
5. **停止位配置**：`LCR[2]` 控制 1 或 1.5/2 停止位
6. **奇偶校验使能**：`LCR[3]` 控制是否启用校验
7. **偶校验配置**：`LCR[5:4] = 2'b00`
8. **奇校验配置**：`LCR[5:4] = 2'b01`
9. **固定校验配置**：`LCR[5:4] = 2'b10/11`，固定为 1 或 0

### 4.4 控制功能（约 5 个功能点）

1. **使能控制**：`enable` 信号控制发送过程的暂停/恢复
2. **位计数器控制**：`enable` 控制位计数器的运行
3. **状态保持**：`enable` 为低时保持当前状态
4. **异步复位**：`PRESETn` 低电平复位所有状态
5. **时钟驱动**：`PCLK` 驱动所有时序逻辑

### 4.5 状态监控功能（约 3 个功能点）

1. **发送状态监控**：通过 `busy` 信号监控发送状态
2. **FIFO 状态监控**：通过空/满标志监控 FIFO 状态
3. **FIFO 容量监控**：通过计数器实时了解 FIFO 使用情况

## 5. 关键设计特性

### 5.1 波特率生成
- 固定分频：每个串行位占用 16 个 `PCLK` 时钟周期
- 波特率 = PCLK 频率 / 16

### 5.2 FIFO 架构
- 容量：16 字节 × 8 位
- 指针：4 位写指针 `ip_count`，4 位读指针 `op_count`
- 计数器：5 位计数器 `count`（0-16）
- 读穿透设计：读指针更新后，输出数据立即可见

### 5.3 状态机设计
- 状态列表：`IDLE`, `START`, `BIT0`-`BIT7`, `PARITY`, `STOP1`, `STOP2`
- 关键寄存器：
  - `tx_state`：当前状态
  - `bit_counter`：4 位位周期计数器（0-15）
  - `tx_buffer`：8 位发送数据缓冲器

### 5.4 协议兼容性
- 完全兼容标准 UART 协议
- 支持常见配置组合：5/6/7/8 数据位，N/O/E/1/0 校验，1/1.5/2 停止位

## 6. 功能点统计

- **FIFO 管理功能**：约 8 个功能点
- **串行发送功能**：约 10 个功能点
- **配置管理功能**：约 9 个功能点
- **控制功能**：约 5 个功能点
- **状态监控功能**：约 3 个功能点

**总计**：约 **35 个主要功能点**

## 7. 验证关注点

### 7.1 时序关键路径
- 时钟域：单一同步时钟域
- 复位方式：异步复位
- 时序约束：位计数器精确控制（16 周期/位）

### 7.2 功能关键点
- FIFO 读写指针管理和回绕
- 状态机转换逻辑
- LCR 动态配置的生效时机
- enable 信号的暂停/恢复机制

### 7.3 边界条件
- FIFO 满/空边界
- 各种数据位宽下的帧格式
- 校验位计算的正确性
- 复位时序的完整性

## 8. 接口使用说明

### 8.1 基本 API

从 `__init__.py` 可知，DUT 提供以下基本 API：

- `Step(i)`: 推进 i 个时钟周期（**必须使用 Step 接口驱动电路**）
- `StepRis(callback, args, kwargs)`: 在时钟上升沿执行回调
- `StepFal(callback, args, kwargs)`: 在时钟下降沿执行回调
- `InitClock(name)`: 初始化时钟信号
- `GetXPort()`: 获取端口对象
- `GetXClock()`: 获取时钟对象
- `GetInternalSignal(name)`: 获取内部信号
- `CheckPoint(name)`: 设置检查点
- `Restore(name)`: 恢复到检查点

### 8.2 端口访问

所有端口通过 `dut.端口名.value` 访问，例如：
- 设置输入：`dut.PWDATA.value = 0xAA`
- 读取输出：`status = dut.busy.value`

### 8.3 驱动方式

**重要**：Uart_tx 是时序电路，必须使用 `Step()` 接口驱动电路运行，不能直接修改信号值后期望立即生效。

## 9. 总结

Uart_tx 是一个功能完整的时序电路模块，具有约 35 个主要功能点，涵盖 FIFO 管理、串行发送、配置管理、控制和状态监控五大功能类别。模块设计严谨，支持高度可配置的 UART 协议实现，为后续的详细功能点定义和测试用例开发提供了清晰的基础。
