|
发表于 2025-2-27 18:28:47
|
显示全部楼层
# Verilog-A 在 SpectreRF 中的隐藏状态问题总结
## 1. **隐藏状态的定义与影响**
- **隐藏状态来源**:
- 局部状态变量(如 `save`)保留前次计算值,导致 SpectreRF 无法直接访问。
- 特定函数(如 `delay`, `z-domain`、`transition`/`slew`)引入短暂隐藏状态。
- 随机数生成器(如 `random`)依赖局部变量存储状态。
- **后果**:
- 导致 Newton 迭代法收敛失败。
- 无法正确处理周期性稳态分析(PSS/QPSS)。
---
## 2. **SpectreRF 的限制**
- **支持的显式状态**:
- 仅支持微分算子(`ddt`, `idt`)定义的连续状态。
- **禁止行为**:
- 使用局部状态变量的模块(如采样保持电路初始版本)。
- 在周期边界附近激活瞬态函数(如 `transition`)。
---
## 3. **避免隐藏状态的策略**
### **方法一:重构模型暴露显式状态**
- **示例:无隐藏状态的周期采样保持电路**(Listing 2)
- 通过电容和开关模拟采样保持,避免使用局部变量存储采样值。
- 关键代码:
```verilog-a
// 使用电容充放电替代局部变量 save
I(hold) <+ tc * ddt(V(hold));
```
- 严格控制时间步长(`$bound_step`)确保周期边界稳定。
### **方法二:选择电路级架构**
- **频率除数设计**(Listing 3):
- 采用开关电容积分器代替传统数字逻辑,通过离散反馈消除累积误差。
- 参数化设计(如 `n`)灵活调整除数比例。
### **方法三:规避敏感函数**
- **周期边界调整**:
- 通过 `tstab` 参数偏移周期边界,避开 `transition`/`slew` 的活跃区间。
- **静态分析预处理**:
- 使用 `analysis("static")` 强制电容预充电,避免隐藏状态干扰。
---
## 4. **示例模型分析**
### **周期采样保持电路(无隐藏状态)**
- **结构**:
- 输入缓冲 → 电容采样 → 输出缓冲。
- 通过参数 `aperture` 和 `tc` 控制采样窗口和时间常数。
- **优势**:
- 无偏移/失真,仅含微小孔径时间和 droop。
### **频率除数电路(无隐藏状态)**
- **原理**:
- 输入信号触发电荷包注入积分电容,达到阈值后输出脉冲。
- 离散反馈机制修正误差,提升大除数稳定性。
- **局限**:
- 大 `n`(>1000)时需收紧仿真容差。
---
## 5. **结论与建议**
- **优先电路级建模**:
- 避免抽象行为模型,减少隐藏状态风险。
- **合理使用 Verilog-A 功能**:
- 用微分算子替代局部状态存储。
- 通过参数化和离散反馈优化大除数设计。
- **验证工具属性**:
- 使用 `(* ignore_state*)` 标记不影响 RF 分析的变量。
- 新增 `(* instrument_module*)` 支持复杂激励源。
---
## 附录:关键代码片段
```verilog-a
// 无隐藏状态采样保持电路的输出缓冲
V(Pout, Nout) <+ transition(save, tdelay, tt);
// 频率除数中的电荷注入控制
if (dir*V(pin,nin) > dir*thresh) begin
l(vg,chg) <+ g*V(vg,chg); // 充电
end else begin
l(chg) <+ g*(V(chg) - vchg); // 预充电
end |
|