IO Controller

这部分不复杂,只是繁琐,实现的时候别漏了什么就好。

IO Multiplexing

IO 复用主要含有正常功能复用和测试模式复用两大类。功能复用可以分为静态复用和动态复用。

静态复用顾名思义,是在一个相对大尺度的时间段内一个IO上的功能是不变的,一般通过软件配置寄存器、封装、strap pin 实现。

动态复用的时间尺度相对小一点,一般需要做点硬件逻辑自动实现多种功能在一个 IO 上的切换。比如同一组 IO 既做存储器接口也做显示接口,当播放视频的时候,需要从存储器中输入数据,然后把这些数据再输出到显示设备上,这种应用场景下这组 IO 一会儿做输入给存储器,一会儿做输出给显示设备,为了防止打架,需要处理好切换过程。

测试模式复用一般静态复用就够了。

GPIO Implementation

消费类芯片竞争激烈,如何用更小的成本实现更多的功能是个很大的挑战。具体到 IO 上,当然希望所有的数字 IO 都能在其正常功能之外,还能被软件自由的控制以扩充功能。我们称之为通用 IO。GPIO 的功能包括,IO 方向的控制、输出值的控制、外部状态的输入、片外中断接收(沿触发、电平触发、抗毛刺等)、开漏模拟等等。

Strap Pin Implementation

strap pin 是个非常有趣的功能。可以有两种实现方式,一种是用上电复位驱动一个 latch 来捕获 strap pin 上的设定值;另一种是用一个 free running 的 clock 来寄存 strap pin 上的值。strap pin 的应用主要用于指示某种功能是否被激活,而不占用额外的 pin。

IO Status Initialization

IO 在上电时的状态非常重要。最大的原则就是不对外部世界产生干扰,通常我们会控制上电时 IO 处于输入状态。当然特殊情况例外。另外一个考虑就是上电时不要产生较大的电流。还要考虑 IO 内部的上下拉电阻是否需要默认使能。还有就是 IO 上电和 core 上电的顺序,以及断电的顺序。

Design for Flow

需要为时钟定义点创建 buffer。提供 case analysis 的说明文档。为 scan hookup 点创建 buffer。

可能每个 design house 的做法不同,有些不在 IO 这个模块里做。

Design for Test

前面提到了一些。还有就是内部 IP 的测试,通常需要把这些 IP 的所有 pin 都在某种测试模式下引出到芯片 IO 上。还需要考虑这些 IP 在测试模式下的供电方案,通常需要做个 mux,以区分功能和测试。最大的原则考虑是节省测试成本,减少测试时间,可以考虑把多种测试模式合并为一个。

很繁琐吧?希望没漏掉什么。