UE在一个PUCCH(或PUSCH)上发送HARQ-ACK信息时,信息bit很可能是多个bits位数,这个多bits位数的HARQ-ACK信息,也称为HARQ-ACK codebook码本
UE物理层在以下几种情况下,需要产生对应的HARQ-ACK 信息bit:UE收到PDCCH调度的PDSCH,动态调度;UE接收的PDSCH没有对应的PDCCH,即DL SPS PDSCH调度; UE接收到PDCCH指示的SPS release,并没有PDSCH。
影响HARQ-ACK 码本长度的因素包括:接收到的PDSCH的个数,在一个PUCCH/PUSCH上反馈;下行是否空分复用,即下行传输是1个或2个TB;PDSCH 是否进行CBG码块组传输;载波聚合CA时,服务小区(即下行载波)的个数;其他参数和开关,例如 harq-ACK-SpatialBundlingPUCCH/PUSCH;因为在生成码本时都会考虑到上述参数。
UE成功检测到SPS PDSCH release或相关的TB ,要生成ACK,对应HARQ-ACK bit =1;UE没有正确接收TB时,要生成NACK,对应HARQ-ACK bit =0。有关SPS PDSCH介绍详见 NR PDSCH (七)DL SPS。
在R16版本中NR中支持3种HARQ-ACK 码本类型,基站根据UE的能力,通过高层RRC信令配置
1 semi-Static:半静态码本,Type-1 HARQ-ACK codebook(pdsch-HARQ-ACK-Codebook = semi-static)。即UE根据RRC层PDSCH 相关半静态配置,生成需要发送的HARQ-ACK 码本。
2 dynamic:动态码本,Type-2 HARQ-ACK codebook(pdsch-HARQ-ACK-Codebook = dynamic), 即UE根据DCI下行动态调度的情况,生成需要发送的动态HARQ-ACK码本。
3 针对NR-U场景新增的type-3 HARQ-ACK codebook,根据RRC层有配置pdsch-HARQ-ACK-OneShotFeedback且UE检测到DCI 1_1 带有One-shotHARQ-ACK request field=1,才会用type-3 HARQ-ACK codebook。本篇主要看下semi-static 码本即Type-1 HARQ-ACK codebook的内容。
Type-1 HARQ-ACK codebook determination
所谓Type-1 HARQ-ACK codebook 就是指pdsch-HARQ-ACK-Codebook=semi-static的情况,配置结构如上,一般在RRC setup或RRC Reconfiguration中配置。收到PDSCH data或SPS PDSCH release后UE要根据DCI 中的PDSCH-to-HARQ_feedback timing indicator 确定的位置report相应的HARQ-ACK info;其他DCI format并未用的到的PDSCH-to-HARQ_feedback timing indicator的位置,UE要报HARQ-ACK NACK,这句话与semi-static码本的生成相关,可以先行忽略,后面会提及什么情况下要报NACK。
semi-static码本的生成概括的说,当UE被配置为semi-static HARQ-ACK codebook时,UE要根据HARQ-ACK反馈时序(K1)、时隙结构和PDSCH候选时域资源分配信息确定每个载波c上对应在同一时隙n中进行HARQ-ACK反馈的PDSCH时域位置集合M_A,c 。
然后根据M_A,c,将在PDSCH候选位置集合中接收到的PDSCH和SPS PDSCH释放的HARQ-ACK映射到HARQ-ACK反馈序列中的对应位置,从而得到时隙n中传输的HARQ-ACK码本。
具体来说,首先,UE基于RRC层信令配置的HARQ反馈时序(dl-DataToUL-ACK),确定该载波上在同一个时隙中需要进行HARQ-ACK反馈的时隙个数,其次,确定每个需要进行HARQ-ACK反馈的时隙中可以传输的最大PDSCH个数。
如果UE能够在同一个载波的同一个时隙中接收大于一个unicast PDSCH传输,则基于RRC层信令配置的PDSCH时域资源分配表格中的候选时域资源分配信息,确定每个时隙中可以传输的最大PDSCH个数。还要根据配置的时隙结构,将不满足PDSCH传输条件的候选PDSCH去掉。
特别地,如果PDSCH和PUCCH的SCS配置不同,当PDSCH的SCS大于或者等于PUCCH的SCS时,每一个K1值都对应X个下行传输时隙;当PDSCH的SCS小于PUCCH的SCS时,连续的1/X个K1值只有一个对应的下行传输时隙,其中X为PDSCH SCS相对于PUCCH SCS的倍数。
当存在CA时,每个载波上的HARQ-ACK码本需要分别按照上述过程进行确定,最后将不同载波的HARQ-ACK码本按照载波顺序进行级联得到最终的HARQ-ACK码本。
下面根据上面的内容具体来看下每一步的处理方式。
对于服务小区C,一个激活的DL BWP和UL BWP中,UE要确定接收PDSCH的候选位置集合,候选PDSCH位置对应的HARQ-ACK信息要在之后PUCCH时隙n_v发送;
UE根据PUCCH slot n_v的位置,要确定一个PDSCH候选位置集合,集合中对应M_A,c 个pdsch候选位置,如下图,PDSCH 候选位置有3个,UE要根据这3个候选位置生成对应的semi-static harq-ack codebook。
如果服务小区c 被deactive,那UE将 firstActiveDownlinkBWP-Id 提供的 DL BWP 用作acitve 的DL BWP,以确定用于候选 PDSCH 接收的 M_(A,c) 时机集合。
PDSCH reception candidated occasion的确定
对于PUCCH 时隙n_v,确定PDSCH接收位置候选集的因素包括:
1 PDSCH 到HARQ-ACK时隙的K1配置集合:
UE只收到监听DCI 1_0 PDCCH配置(没有配置DCI1_1/1_2),K1对应的slot偏移值为1~8;
UE只收到监听DCI 1_1 PDCCH配置(没有配置DCI1_2),K1对应的slot偏移值由RRC层的参数dl-DataToUL-ACK 提供;
UE只收到监听DCI 1_2 PDCCH配置(没有配置DCI1_1),K1对应的slot偏移值由RRC层的参数dl-DataToUL-ACK-ForDCIFormat1_2提供;
UE收到监听DCI 1_1/1_2 PDCCH配置,K1对应的slot偏移值分别由RRC层的参数dl-DataToUL-ACK和dl-DataToUL-ACK-ForDCIFormat1_2提供;
2 PDSCH 时域资源分配表,pdsch-TimeDomainAllocationList,包括pdsch-ConfigCommon和pdsch-Config中配置的两个表,或两个表的并集。在UE获取时域资源分配表之前,要按照spec定义的PDSCH 默认时域资源分配表A,这个内容在 NR PDSCH (一)时域资源中有具体描述。
对于DCI 1_2 如果有配置referenceOfSLIVDCI-1-2时,如果确定完K0=0(同时隙调度)且是PDSCH mapping Type B的情况,例如上图SLIV=54的情况,对应S=1,,L=12,S0是检测到DCI format 1_2的PDCCH监听时机的起始符号,此时配置时要满足S0+1+12<=14(normal cyclic prefix) 或S0+1+12<=12(extended cycloc prefix)的关系,其他情况不考虑S0。
3 上下行BWP有可能是不同的SCS子载波间隔(u_UL由激活的上行BWP获得,u_DL由激活的下行BWP获得),也要考虑到不同子载波间隔时隙换算关系。
4 还要考虑高层配置的上下行时隙结构tdd-UL-DL-ConfigurationCommon and tdd-UL-DL-ConfigurationDedecated.
5 配置ca-SlotOffset 的情况
主要根据以上1~5的配置参数,确定PDSCH接收位置候选集。
UE要在时隙n_u通过PUCCH发送HARQ-ACK info,那就要根据dl-DataToUL-ACK提供的K1集合,结合pdsch-TimeDomainAllocationList K0和时隙配置,确定M_A,c ;如果UE支持一个时隙内多次PDSCH调度,还要再根据SLIV 进一步确定和n_u相关的PDSCH候选集,38.213 中用一大段伪代码表示M_A,c的具体确定方式,这里简单看下。
对应于单个SPS PDSCH release的HARQ-ACK info 在Type-1 HARQ-ACK码本中的位置与对应的SPS PDSCH reception相同;single DCI format 调度的多个SPS PDSCH release的HARQ-ACK信息在Type-1 HARQ-ACK码本中的位置与多个SPS PDSCH release中具有最小SPS configuration index的SPS PDSCH reception相同(这段话好像很绕,但是好像又能理解...)
M_A,c 代表PDSCH 候选集(PDSCH receptions or SPS PDSCH releases),初始为空集;j代表PDSCH候选集的index,初始为0;B 代表UE支持一个时隙内调度多个PDSCH接收时使用的集合,初始为空集 ;C(k1)代表k1集合的基数;k代表k1集合中的index,初始为0,k1集合中按照slot timing value 降序排列,例如C(k1) 有3个值,k1,0 k1,1 k1,2 在集合内降序排列{5,3,1}。
先看不配置ca-SlotOffset的情况,即R15 版本中的情况。
橙色while k<C(K1)代表对k1集合进行遍历,C(k1)是按照降序排列,第一个元素k1,0是数字最大的,即代表的是与PUCCH HARQ-ACK时隙n_u间隔最大那个PDCCH候选 时隙n_D。黄色框中的内容代表开始对C(k1)遍历后,首先考虑上下行SCS 是否一样。先看下mod(n_u-K1,k+1,max(2^(u_dl-u_ul),1))=0 成立的场景,即u_dl<=u_ul时,上述求模运算才成立,为简化伪代码过程,直接考虑上下行SCS相同的情况即u_dl=u_ul,目前实网环境下也都是这种情况,这时候下面绿色while n_D<max(2^(u_dl-u_ul),1) ->while n_D<1,即后面部分只考虑n_D=0的情况即可
红色if 部分,毫无疑问slot n_u是在n_D之后的时隙,如果在n_u和n_D之间有发生DL/UL BWP 变化(假如说在slot n_c),此时n_u>=n_c,n_u-K1,k+n_D<n_c的话,n_D++,上下行SCS相同,n_D++后,直接跳出while 循环,k++,进行C(k1)中下一个k的判断。
没有发生BWP切换时,跳入蓝色if else的判断,这里会对PDSCH时域资源分配表中的每一行元素(K0,SLIV)进行遍历,k0是DCI至PDSCH data间的时隙偏移,毫无疑问,n_u-K1,k+n_D+k0 对应的时隙应该是DL ,如果判断完是UL slot,则要从时域资源分配表中剔除这样的组合,针对这步看个例子。
pdsch-TimeDomainAllocationList
{k0=2.....
k0=5....
k0=3....
k0=4...}
假设有4行,从k1=7开始遍历pdsch-TimeDomainAllocationList,k0=2时对应的slot为UL 不符号要求删除k0=2
针对K1=5遍历pdsch-TimeDomainAllocationList,此时k1对应的符号就是UL,在遍历时所有的row都不会保留。
对PDSCH时域资源分配表遍历完成后,下一步根据UE是否支持一个时隙内多次PDSCH调度,进行不同的操作;如果UE仅支持一个时隙内进行一次PDSCH 调度且PDSCH时域资源分配表不为空集(即有对应的k0 SLIV组合),M_A,c (PDSCH 候选集)就多一个j,这个j 与C(K1,k)中的k1有对应关系。
如果UE支持一个时隙内多次PDSCH调度时,根据PDSCH时域资源分配表中的SLIV,找到最小的"last OFDM symbol index",作为m, 根据m继续确定PDSCH候选位置;再次从第一行开始,如果S<=m,剔除对应的行,B 集合中多一个PDSCH候选 index j,直到R成为空集,针对这步看个例子。
例如 上面的SLIV分配情况
r=0 SLIV =S+L=2+4
r=1 SLIV=S+L=4+3
r=2 SLIV=S+L=8+2
r=3 SLIV=S+L=3+2
r=4 SLIV=S+L=5+3
r=5 SLIV=S+L=11+2
假设j=0,第一步m=5,从r=0开始遍历,r=0/1/3/4 的S<=5,删除r=0/1/3/4,将j=0并入m_A,c;j++,R不是空集,此时m=9,r=2 的S<=m,删除r=2,将j=1并入m_A,c; j++,R不是空集,m=12,r=5的S<=m,删除r=5,将j=2并入m_A,c,R为空集,结束,此时得到M_A,c={0,1,2}。
M_A,c的确定过程大概就是上面的内容,R16中还针对配置ca-SlotOffset的情况,列了一段伪代码,但其实也是类似的判断逻辑,不再多说。
semi-static codebook的生成
PDSCH reception位置候选集和M_A,c确定后,UE就要生成对应的semi-static HARQ-ACK codebook,再看下生成codebook的相关规定。
UE如果由于没有收到DCI 导致没有收到调度的TB或CBG,那UE要对TB或CBG生成NACK,这个考虑的是DCI漏检情况,即网络侧调度了DCI,但是UE没有检测到对应的DCI,反馈NACK后,网络侧会再次重传,防止漏检。
semi-static的码本生成同样对应一段伪代码,其中UE由M_A,c得到服务小区包含的候选PDSCH 的数量,即下面的Mc,。
set c 代表服务小区的index,set j代表HARQ-ACKinfo 的bit index;set N_DL_cells 代表RRC成配置的服务小区个数(CA场景)。
对PDSCH reception候选位置进行遍历
m代表候选PDSCH 的index,对候选PDSCH进行遍历,不配置 harq-ACK-SpatialBundlingPUCCH 和CBG传输,但是进行2TB传输时, 针对每个TB生成一个HARQ-ACK bit。
有配置harq-ACK-SpatialBundlingPUCCH且进行2TB传输时,将2个TB的HARQ-ACK进行位与 AND操作,最后对应1bit;如果只收到1个TB,另一个TB的HARQ-ACK 认为是ACK。harq-ACK-SpatialBundlingPUCCH只有在传输layer 大于4 时才可能配置,大概意思是把两个TB的HARQ-ACK info 进了绑定传输。
CBG这部分在上一篇 NR HARQ (二) CBG部分中有提及,这里就不在多说,但是要注意最后j=j+N_DL_TB,c *N_CBG/TB,max_HARQ-ACK,后面再说。
其他情况 1个候选PDSCH生成1 bit HARQ-ACK即可;c++代表CA场景时,对其他服务小区的候选PDSCH 也要进行候选PDSCH的遍历。
由上述伪代码可见,semi-static codebook 在CA场景下,PDSCH reception 候选位置多以及CBG 传输场景,会有很大的开销;即使网络侧的PDSCH 调度并不多的情况下,也需要整个走一边流程,网络侧即使没有调度,也会带有很多NACK位,处理流程复杂。
有时候UE RRC配置的CBG传输,但是实际的DCI format却没有进行用CBG进行调度(仅DCI0_1和DCI 1_1支持CBG传输,在配置CBG时,对于其他DCI,只能进行基于TB 的传输);这时候semi-static码本的生成有相应的规定,如下。
如果UE收到SPS PDSCH/SPS PDSCH release/PDSCH,此时只有一个服务小区,且C(M_A,c)=1,即只有一个PDSCH候选位置,配置了CBG,实际DCI调度时没有进行CBG传输,这时候UE根据收到的TB 生成1 bit HARQ-ACK 即可。
如果UE收到SPS PDSCH/SPS PDSCH release/PDSCH,此时有多个服务小区,且C(M_A,c)>1,配置了CBG,实际DCI调度时没有进行CBG传输,这时候UE对应收到的TB 生成HARQ-ACK 时,要重复N_CBG/TB,max_HARQ-ACK 次,N_CBG/TB,max_HARQ-ACK由RRC层参数maxCodeBlockGroupsPerTransportBlock确定。
就如上面生成CBG HARQ-ACK伪代码的最后一句j=j+N_DL_TB,c *N_CBG/TB,max_HARQ-ACK,就是说对于配置CBG传输的服务小区的PDSCH 候选位置,无论DCI是否有使用CBG传输,UE都要生成N_DL_TB,c *N_CBG/TB,max_HARQ-ACK bit HARQ-ACK反馈,这里也进一步说明了semi-static 的开销大的问题,如下图的例子。
例如上图中的serving cell 1中的绿色和seving cell 2的黄色部分,虽然没有收到任何data,但是在生成codebook时,同样要根据设定生成对应bits的码本,进一步的如果每个serving cell 都只一个位置收到data,例如serving cell 0只收到第一个TB1/TB2, serving cell 1和2只收到一个PDSCH CBG传输,正常只要生成10bits 码本,但是按照semi-static 码本的设计,总共要反馈30bits的信息,开销确实很大。
因而某些场景网络侧不希望UE反馈完整的semi-static码本,只想收到1个简单的HARQ-ACK应答,例如DCI 1_0 counter DAI=1时的SPS PDSCH release;Pcell 收到DCI 1_0 counter DAI =1 的PDSCH reception或者SPS PDSCH reception,这三种场景,UE只要针对其产生应答即可,不用生成完整的semi-static码本。
在配置了pdsch-AggregationFactor时,PDSCH 发送时隙n_D-N_repeat_PDSCH+1 到时隙n_D,或时隙n_D-repetitionNumber+1 到时隙n_D 或n_D,其HARQ-ACK 要在slot n+k反馈;如果其他semi-statci码本中也包含上述PDSCH 接收情况,要将其相关的HARQ-ACK 置为NACK,即在n+k slot正常上报PDSCH reception 的HARQ-ACK info,其他时隙的码本与n+k 时隙的码本重合时,要将其他时隙码本中PDSCH接收相关的HARQ-ACK 置为NACK。
例如上图,根据算法生成HARQ-ACK codebook显示,紫色DL 中的PDSCH 要在绿色的UL slot 上报HARQ-ACK;但是红色的UL slot 的HARQ-ACK codebook 也包含紫色DL 中的PDSCH且根据要求UE要在红色UL slot 上报 紫色DL PDSCH 的HARQ-ACK,那绿色UL HARQ-ACK codebook中的相应bit 要置为NACK,红色UL HARQ-ACK codebook根据实际情况上报NACK/ACK。
PUSCH
PUSCH也可能用于HARQ-ACK,首先看V_UL_T-DAI 的确定,当UL DCI format 带有DAI field 且DAI=0时,V_UL_T-DAI=0,否则V_UL_T-DAI=1。
具体的当 UL DCI 包含DAI field 且V_UL_T-DAI=1时,UE要按照上面的方式生成semi-static 码本,在生成码本时要用harq-ACK-SpatialBundlingPUSCH替换harq-ACK-SpatialBundlingPUCCH; 当UL_T-DAI=0时就不用生成码本,除非UE 只收到由DCI 1_0 调度的SPS PDSCH release/SPS PDSCH/PDSCH,且DCI 1_0 DAI=1,这时候UE也要生成对应的码本。