搞5G优化最怕什么?不是数据速率上不去,而是用户明明站在信号表现尚可的位置,却频繁出现下行漏检、上行调度异常、时延上不去。查到最后,问题常常落在一个地方——5G PDCCH。作为5G NR物理层的下行控制信道,PDCCH承载着所有下行控制信息(DCI),它什么时候给终端发指令,怎样发、让谁收,全都由这一条链路决定。以前跟同事排查一个模拟组网里的异常案例,PDSCH调度正常得很,但MCS始终拉不高,后来把modem日志拉出来一看,才发现是PDCCH盲检成功率掉到了谷底。这篇文章我从协议机制、资源映射、盲检开销到现场排障思路,把5G PDCCH拆开来聊一遍,适合刚入门的协议测试、网优和做基站/终端联调的朋友参考。
1. 先看清PDCCH在NR物理层里的位置
1.1 PDCCH和PDSCH:一对“命令”与“货物”的关系
可以把下行传输简单理解成快递流程。PDSCH是那辆装满货的卡车,真正运输用户数据;PDCCH则是贴在车上的运单,告诉终端“这车货从哪来、到哪去、该不该接”。要是运单看不清,车上的货再好,终端也不知道该不该收。基站侧每次给终端分配PDSCH资源,都必须先在PDCCH上发送对应的DCI,终端在PDCCH上正确解码出DCI之后,才知道接下来要用哪些RB、什么MCS、采用哪种天线端口去接收数据。
所以PDCCH的性能直接限制了整个下行链路的能力。协议设计上,NR把控制信令从“大而全”改成“灵活精确”的路线,用CORESET定义频域范围,用搜索空间定义时域监听时机,加上聚合级别和CCE映射方式来匹配不同信道质量。相比LTE那种几乎占据整个系统带宽前半部分的固定结构,NR的PDCCH更节省资源,但也对网络配置和终端盲检能力提出了更高要求。
1.2 一个标准调度流程里PDCCH要出现多少回
很多人觉得PDCCH只在初始接入时出现,实际上UE工作过程中,几乎每次数据行为都绕不开它。终端开机做小区搜索,读完SSB和MIB之后,要在CORESET 0对应的搜索空间里盲检SIB1相关的DCI,完成系统消息读取;随机接入时,要通过携带RA-RNTI加扰的DCI拿到RAR窗口的调度信息;寻呼来了,要用P-RNTI加扰的DCI去指示PDSCH上的寻呼消息;进入到连接状态后,上行授权和下行分配分别对应用C-RNTI加扰的DCI 0_x和DCI 1_x,连PUCCH的功率控制都靠DCI 2_x来执行。
这么说吧,如果PDCCH这条链路出了稳定性问题,表面上看到的只是某个指标不好,实际上背后是整个控制面的通讯失灵。我在定位外场慢速用户投诉时,习惯先查两样东西:一个是PDSCH的信道质量,另一个就是PDCCH的解调门限。很多时候问题都不在数据信道上。
1.3 NR PDCCH相对LTE的关键变化
NR对PDCCH做了几处明显改动。第一,LTE的PDCCH占满前几个OFDM符号,NR则用CORESET把控制区域进一步网格化,频域上以6个RB为最小步长配置,时域上最多连续3个符号,灵活性高很多。第二,LTE靠PCFICH指示控制区域大小,NR取消了PCFICH,UE通过RRC/MIB中的配置直接知道听哪里、听多大。第三,NR引入PDCCH专用的DMRS,位置固定在每个REG上,不再需要像LTE那样靠CRS做解调参考。第四,NR支持把CCE到REG做交织映射,利用频率分集对抗干扰,这在LTE里也没有。
| 对比项 | LTE PDCCH | NR PDCCH |
|---|---|---|
| 控制区域 | 固定占系统带宽前若干符号 | CORESET灵活配置,时域最多3符号 |
| 资源粒度 | CCE=36个RE,基本固定 | CCE=6个REG=72个RE,支持聚合 |
| 参考信号 | 依赖CRS | 独立DMRS |
| 频选调度 | 全带映射,相对简单 | 可配置交织/非交织,支持频率分集或波束成形 |
| 盲检结构 | CSS+USS,级别固定较少 | 搜索空间集灵活,聚合级别最多到16 |
对做优化的人来说,这些变化意味着PDCCH的排查逻辑完全变了。以前LTE控制信道出问题,基本绕着PCFICH和PHICH转就行;现在NR首先要确认CORESET选没选对、搜索空间配没配齐、DCI格式和RNTI有没有对齐,链路预算算不算得过来。
2. 一条DCI从协议栈到空口经历了什么
2.1 DCI格式那么多,实际碰到的就这几类
DCI格式的选择不是随机的,协议把格式分成了回退(fallback)和非回退两类。回退格式信息少、结构固定、盲检简单,适合链路差时兜底;非回退格式可以带上各种灵活字段,如波束指示、多TRP指示、CSI请求等,但开销也大。
实际组网里最常见的几个格式:
| DCI格式 | 用途 | 常用RNTI |
|---|---|---|
| 0_0 / 1_0 | 回退调度,格式简洁,可用的PUSCH/PDSCH配置固定 | C-RNTI、TC-RNTI、CS-RNTI等 |
| 0_1 / 1_1 | 非回退调度,支持大量调度参数 | C-RNTI、CS-RNTI、MCS-C-RNTI等 |
| 0_2 / 1_2 | 紧凑非回退调度,适合低时延场景 | C-RNTI等 |
| 2_0 | 时隙格式指示 | SFI-RNTI |
| 2_1 | 下行抢占指示 | INT-RNTI |
| 2_2 / 2_3 | PUCCH/PUSCH/SRS功率控制 | TPC-PUCCH-RNTI、TPC-SRS-RNTI |
| 3_0 / 3_1 | 侧链路调度 | SL-RNTI等 |
判断一个DCI属于谁,核心不是格式本身,而是加扰在CRC上的RNTI。RNTI就像一把钥匙,UE只有拿对钥匙打开门,才会相信这条消息是给自己的。比如C-RNTI是连接态下专属的,SI-RNTI用来读系统消息,P-RNTI用来听寻呼。同一个DCI格式配上不同RNTI,含义完全不同,这也是终端盲检时必须逐个尝试的原因。
2.2 RNTI加扰CRC:让指令只给该收的人
协议里对DCI生成过程的定义很清晰。基站在payload bit周围加上一段CRC,然后拿RNTI与CRC做异或加扰。终端盲检时先用自己的RNTI去解扰CRC,再校验CRC是否通过,通过了就认为这条DCI属于自己。这种做法的好处是终端不必在每个子帧都层2解一遍所有数据,只靠物理层就能丢掉大量不属于自己的候选。
RNTI的加扰还起着“资格认定”的作用。拿寻呼来说,多个UE可以共享同一条P-RNTI加扰的DCI,具体谁来响应,还要看DCI里携带的寻呼记录和UE ID匹配情况。随机接入过程则用RA-RNTI加扰,RA-RNTI的值跟PRACH时频位置绑定,所以终端只要知道自己发了PRACH,就知道该用哪把钥匙去开箱。TC-RNTI则在竞争解决成功后升级成C-RNTI。
2.3 Polar编码和速率匹配:控制信道的专属编码方式
5G控制信道没有继续沿用LTE的卷积码,而是选了Polar码。原因很简单:DCI的信息比特普遍较短,Polar码在短码场景下性能优势更明显。协议里Polar编码前要先把CRC带上,编码后再按CORESET承载能力做速率匹配。速率匹配说白了就是,编码产生的比特太多,而PDCCH能装下的RE有限,那就按特定顺序打孔或者重复,把输出比特长度压到刚好装满一个CCE聚合块。
这里要注意,DCI真正映射到的物理资源数量由聚合级别决定,并不是由DCI内部字段个数决定。一个CCE在QPSK调制下最多能塞多少比特,取决于该REG上的DMRS占用。这个“能装多少”和“实际DCI有多大”之间的gap,就是聚合级别发挥作用的空间。信噪比差的用户把级别调高,等于把同样一份消息多复制几份,虽然费资源,但可靠性上来了。
2.4 从编码比特到空口信号,中间并不简单
编码和速率匹配之后,还要过加扰、调制、层映射、预编码、RE映射这几道工序。CRS时代的加扰比较简单,NR里加扰序列按小区ID和时隙号生成,能有效把邻区同频干扰随机化。调制固定用QPSK,控制信道不追求高阶调制,因为控制信道必须比数据信道更鲁棒。调制之后按照CORESET里的CCE位置做RE映射,把归属于某个PDCCH候选的REG全部对应到物理资源上,同时在该RE网格里放好DMRS,让终端能完成相干解调。
如果配置了交织映射,CCE到REG的对应关系会被打散,REG绑定(REG bundle)在频域均匀铺开,适合在大带宽下获得频率分集。如果配成非交织,那么一个CCE的所有REG尽量落在连续频率上,更适合波束成形和时域聚焦。选择哪种映射,一定要结合信道环境和发射模式,不能只图配置简单。
3. CORESET与搜索空间:一套决定盲检成本的规则
3.1 CORESET参数一次说明白
CORESET定义的是PDCCH在频域和时域上“允许出现的区域”。频域用RB集合表示,实际配置时按6个RB为一个粒度,这是为了和CCE的REG构成保持对应关系;时域上最多连续3个符号,由参数monitoringSymbolsWithinSlot指出起始符号位置和数量;此外还有CCE到REG的映射方式、REG bundle大小、预编码粒度、DMRS加扰ID等参数。
一个小区可以给UE配多个CORESET,但它们承担的任务不同。有的用来做公共搜索空间,有的专供某UE的专用搜索空间。BWP切换时,CORESET也要跟着适配,否则终端在换到新BWP后就不知道去哪找控制信令。我见过一些配置问题,就是CORESET的带宽小于SSB所在带宽,或者CORESET和SSB重叠导致冲突,结果终端始终解不到SIB1,卡在小区选择这一步。
3.2 盲检为什么这么耗资源
UE拿到CORESET和搜索空间配置后,仍然不知道基站到底把DCI塞在哪个位置。它只知道自己该在某个时隙的某个符号上,到某个聚合级别下的一组PDCCH候选里去找。候选集就是搜索空间里预先定义好的一组CCE组合,终端要从AL1、AL2、AL4、AL8甚至AL16逐级别去试,每试一次就要做一次Polar解码、CRC解扰和校验。
这个过程的成本非常高,协议里因此加了硬约束:UE每个时隙能够盲检的PDCCH候选数量有限,且能够在这上面做信道估计的CCE总数也有限。网络侧配置出来的候选数量如果超过终端能力,终端不会全部去试,而是按优先级挑选一部分,剩下那些没试到的DCI就会被漏掉。优化时如果把所有搜索空间都打开,很可能换来的是大量漏检而不是更高可靠性。
3.3 USS和CSS不是一回事,别混着调
公共搜索空间(CSS)和UE专用搜索空间(USS)承担的角色完全不同。CSS里主要放的是回退DCI、寻呼、随机接入响应、系统消息SIB1调度等,通常要和CORESET 0绑定,覆盖所有用户;USS则放针对特定用户的DCI,可以通过C-RNTI加扰精确送达。为了控制盲检总开销,协议还提出了一种格式对齐机制,DCI 0_0和1_0、0_1和1_1等在尺寸上尽量对齐,这样终端可以用更少的候选处理更多DCI变体。
终端为了减少盲检,还会跳过与已知尺寸不匹配的候选、或者只在实际有数据可调度的时候才去监听。UE省电和PDCCH的监控周期强相关,DRX开启的时候,如果网络侧在UE休眠期把下行小包调度过来,PDCCH盲检再准也没用——UE根本不监听。
4. 从小区搜索到波束管理:CORESET 0和TCI状态不能忽略
4.1 CORESET 0是“头一公里”的咽喉
终端刚完成小区搜索时,除了SSB,它还不知道任何下行资源配置,靠的是MIB里的pdcch-ConfigSIB1字段找到CORESET 0和对应的搜索空间0,然后才有机会读SIB1。CORESET 0的配置不是任意选的,而是从有限表项里查出来的,协议用索引把CORESET 0的时频资源、符号位置和复用模式全部约定好。SSB与CORESET 0可以时分复用、频分复用或者两者结合,选择不好就会互相碰撞,导致终端解析不了SIB1。
做基站侧参数规划时,CORESET 0配置直接决定了覆盖和接入成功率。把CORESET 0放在系统带宽偏边上,虽然能避开SSB,但会影响频率分集;放在中间偏又可能与SSB重叠。通常建议根据子载波间隔和小区带宽,选择一个既能与SSB错开又不会离控制信道资源太远的表项,并在路测中统计SIB1解码成功率来验证。
4.2 PDCCH也有自己的“波束指向”
PDCCH在NR里不只是转发信令,它还能被配置成不同波束。基站通过TCI状态告诉终端,某个CORESET上的DMRS跟哪个SSB或CSI-RS在空间上是准并址(QCL)的,这样终端可以用对应参考信号的信道估计结果来解调PDCCH。一个CORESET可以配置多个TCI状态,DCI里还可以动态指示切换,这也是NR波束管理的一个重要入口。
工程中常见的奇怪现象是:终端上报的SSB RSRP非常高,但PDCCH BLER却压不下来。这时候要看CORESET用的TCI状态是不是对应了弱波束。我遇到过一个外场问题,终端跟基站间明明有很强的主波束,但公共搜索空间固定挂在宽波束上,覆盖够了,SINR不够,只要把CSS的CORESET关联到占空比更大的辅助波束上,问题就解决了。PDCCH的资源映射和波束选择,永远要一起看。
5. 外场与实验室结合:PDCCH指标异常时的定位思路
5.1 先看盲检成功率,再看调度侧资源利用率
排查PDCCH问题的第一步永远是分“终端侧没解出来”还是“基站侧没调度出去”。终端modem日志里能看到每个候选上的盲检结果和DCI正确率,如果UE盲检次数已经触顶,说明配置的搜索空间太多太密,要把一些低优搜索空间合并或拉大监控周期。如果盲检没问题但调度成功率低,那要往基站调度器查,是不是PDCCH资源被占满,是不是聚合级别放大后CCE不够分,又或者DCI format size没有对齐导致调度器把一部分候选放在了UE盲检范围之外。
我曾在外场抓过一组数据,UE在某个时间点收不到任何下行业务,后台看PDSCH PRB利用率很低,后来翻完整条信令流程才发现,PDCCH的CCE利用率很高,但大部分给了寻呼和公共信令,留给专用调度的CCE已经耗尽。这种资源挤占问题在基站配置比较复杂的小区尤其容易发生。
5.2 从SINR和RSRP的差值找干扰特征
PDCCH对SINR的敏感度远高于PDSCH。PDSCH可以用高阶MCS和HARQ重传扛住较差信道,PDCCH一旦解错,整个TTI的调度就白费,还没有那么多重传机会。所以控制信道通常要求SINR保持在某个门槛以上,比如低于某个值时盲检错误率会迅速抬升。排查时不能只看RSRP,要把PDCCH所在符号的SINR单独取出来看,很多弱覆盖区RSRP并不低,但控制信道SINR已经被邻区干扰打穿。
干扰的另一个来源是符号级干扰:如果邻区SSB或CORESET恰好安排在同一符号上,即便频域错开,也可能造成符号级功率抬升和AGC抖动。比如某次排查发现PDCCH BLER持续偏高,而PDSCH却正常,最后定位到是同频邻区把CORESET配置到了与本小区完全相同的符号位置,导致终端在盲检窗口里收到的干扰远大于数据信道。这种问题,纯粹看平均SINR指标是发现不了的。
5.3 调聚合级别之前,先想想能不能改搜索空间
聚合级别从AL1调到AL2甚至AL4,本质上就是用更多CCE换可靠性。调高之后能显著降低漏检,但代价是整个小区控制信道容量下降,阻塞率上升。所以在决定调高聚合级别之前,先看看当前搜索空间的监控周期是不是过密、持续时间是不是过长。把一些不太重要的DCI合并到更长的周期里,或把持续时间缩短到只覆盖一个实际数据调度窗口,比盲目提高聚合级别更划算。
另一个常用手段是打开交织映射,让一个PDCCH的REG在频域上尽量散开。这样做适合大带宽、频率选择性衰落明显的场景,但在小带宽或集中式波束场景下反而会损失波束成形增益。参数之间是联动关系,不能只动一个维度。
5.4 实际项目中容易踩的几个暗坑
DCI大小没有对齐。网络侧给不同搜索空间配了携带不同字段的DCI,但没有做尺寸对齐,终端只能把较多候选全部盲检一遍,结果漏检和功耗一起恶化。SSB功率明显高于PDCCH时,很多现场测试员会因为RSRP好看而低估控制信道风险,实际上PDCCH的覆盖经常比想象中差。
载波聚合场景里,各个小区搜索空间的监控时机重叠,超过终端能力后只能靠优先级挑,那么优先级配低的DCI可能整周期都收不到。这类问题在联合调度时很隐蔽,采集日志时要把每个小区的监听时机和DCI类型都列出来,才能看清。
6. 给不同背景的人一份PDCCH学习路径建议
如果是刚转5G的网优工程师,最不合适的学习方式是直接抄配置模板。建议先下载协议文档中关于PDCCH的章节,把CORESET、搜索空间、聚合级别、RNTI这几个概念用一张草图画清楚:谁配了谁、谁监听谁、谁真正发送。然后找一个首呼失败的日志,从空口消息一路跟到RRC配置里的ControlResourceSet和SearchSpace字段,把两个字段做逐条对应,差不多就能形成肌肉记忆。
做协议栈或测试工具开发的人,则应当把重点放在DCI payload的结构解析上。不同DCI格式的字段顺序和比特宽度各不一样,解析器写错一个字段,后面全是乱的。建议先拿回退格式练手,再延展到非回退格式,最后再处理DCI尺寸对齐和RNTI解扰那一步。控制信道解析比数据信道解析要难,因为你不先知道调度结果,根本不知道比特流里哪些字段该按什么含义解。
我自己带的几个新人,我一般让他们先回答三个问题:终端盲检一次PDCCH候选,大概要经过哪些处理步骤?把一个聚合级别从AL2调到AL8,RRU侧发射功率变了没有?在同一个CORESET上,为什么CSS和USS都能存在?这三个问题能回答清楚,PDCCH的架构基本就通了。我的体会是,控制信道问题的排查思路比数据信道更需要系统思维,不要一上来就调功率、调波束,先把配置和盲检链路捋清楚,往往问题就露出来了。