cttc-nr-demo tutorial[译][4]

NrGnbMac

NrGnbMac,位于nr/model/nr-gnb-mac.cc中,实现了NR通信的MAC SAP。
如果我们在INFO级别启用NrGnbMac日志组件,可以看到连接初始化,在RACH通信和RNTI分配方面:

+0.016125000s 0 [ CellId 2, bwpId 0] NrGnbMac:DoSlotDlIndication(): [INFO ]␣
,
→Informing MAC scheduler of the RACH preamble for RAPID 1 in slot FrameNum: 1,
→SubFrameNum: 6 SlotNum: 4; Allocated RNTI: 1
+0.016125000s 0 [ CellId 2, bwpId 0] NrGnbMac:DoSlotDlIndication(): [INFO ]␣
,
→Informing MAC scheduler of the RACH preamble for RAPID 0 in slot FrameNum: 1,
→SubFrameNum: 6 SlotNum: 4; Allocated RNTI: 2
+0.016125000s 0 [ CellId 2, bwpId 0] NrGnbMac:SendRar(): [INFO ] In slot FrameNum: 1,
→SubFrameNum: 6 SlotNum: 2 send to PHY the RAR message for RNTI 1 rapId 1
+0.016125000s 0 [ CellId 2, bwpId 0] NrGnbMac:SendRar(): [INFO ] In slot FrameNum: 1,
→SubFrameNum: 6 SlotNum: 2 send to PHY the RAR message for RNTI 2 rapId 0

乍一看,可以注意到这些日志提供了两个关键信息,即CellId和bwpId。这些信息可以作为上下文信息,更好地追踪特定小区在BWP上提供的流量。要了解更多关于这些ID的工作原理,请参考NR手册的第2.2节。
一旦RLC传输缓冲区更新,NrGnbMac::DoReportBufferStatus()与MAC调度器SAP进行中间传送以报告缓冲区状态:

+0.400000282s 0 [ CellId 2, bwpId 0] NrGnbMac:DoReportBufferStatus(): [INFO ]␣
,
→Reporting RLC buffer status update to MAC Scheduler for RNTI=2, LCID=4,,
→Transmission Queue HOL Delay=0, Transmission Queue Size=132, Retransmission Queue␣
,
→HOL delay=0, Retransmission Queue Size=0, PDU Size=0
+0.400002262s 0 [ CellId 3, bwpId 1] NrGnbMac:DoReportBufferStatus(): [INFO ]␣
,
→Reporting RLC buffer status update to MAC Scheduler for RNTI=1, LCID=4,,
→Transmission Queue HOL Delay=0, Transmission Queue Size=1284, Retransmission Queue␣
,
→HOL delay=0, Retransmission Queue Size=0, PDU Size=0

通过跟踪这些消息,可以追踪传输队列的大小,该队列由传入的RLC PDU填充,并通过调度传输进行清空。默认情况下,NrHelper将TDMA RR作为此示例的MAC调度器考虑,由NrMacSchedulerTdmaRR处理。调度器在NR手册的2.5.2和2.5.3节以及Doxygen文档中有详细介绍。
MAC层通过调用NrGnbMac::DoSchedConfigIndication()接收到调度的分配。所有调度器参数都打包在NrMacSchedSapUser::SchedConfigIndParameters结构中。其中,HARQ进程ID对于完全追踪(i)调度时机,(ii)帧传输时机,以及(iii)UE正确接收帧的ACK非常关键。这些是帮助评估该层数据包延迟的关键信息。
例如,让我们看一下以下INFO日志消息,重点关注与HARQ Process ID对应关系。

+0.400062500s 0 [ CellId 2, bwpId 0] NrGnbMac:DoSchedConfigIndication(): [INFO ] New␣
,
→scheduled data TX in DL for HARQ Process ID: 19, Var. TTI from symbol 1 to 13. 1,
→TBs of sizes [ 84 ] with MCS [ 0 ]
+0.400062500s 0 [ CellId 2, bwpId 0] NrGnbMac:DoSchedConfigIndication(): [INFO ]␣
,
→Notifying RLC of TX opportunity for HARQ Process ID 19 LC ID 4 stream 0 size 81,
→bytes
+0.400062500s 0 [ CellId 2, bwpId 0] NrGnbMac:DoTransmitPdu(): [INFO ] Sending MAC␣
,
→PDU to PHY Layer
...
+0.400374995s 0 [ CellId 2, bwpId 0] NrGnbMac:DoDlHarqFeedback(): [INFO ] HARQ-ACK␣
,
→UE RNTI 2 HARQ Process ID 19 Stream ID 0

从第一条消息中,我们可以观察到计划了一个只有84字节的流的新传输。因此,从第二条日志消息中,MAC通知RLC层此机会。之后,准备MAC PDU。过一段时间后,UE的ACK到达。这意味着该帧需要312微秒才能发送并确认。
在此,通过调用其TransmitPdu()方法,RLC PDU经过封装后由MAC层转发给PHY SAP,同时带有其SfnSf和起始符号索引,如日志消息中所示的Var. TTI从符号1到13。要了解变量TTI的工作原理,请参考NR手册的2.5.1节。
此外,观察BWP ID为1的TB大小更大:但延迟增加到1,249微秒。

+0.400250000s 0 [ CellId 3, bwpId 1] NrGnbMac:DoSchedConfigIndication(): [INFO ] New␣
,
→scheduled data TX in DL for HARQ Process ID: 19, Var. TTI from symbol 1 to 13. 1,
→TBs of sizes [ 348 ] with MCS [ 0 ]
...
+0.401499997s 0 [ CellId 3, bwpId 1] NrGnbMac:DoDlHarqFeedback(): [INFO ] HARQ-ACK␣
,
→UE RNTI 1 HARQ Process ID 19 Stream ID 0

#Packet latency
Packet latency 在 NrGnbMac 中会产生延迟,因为它们可能会被留在缓冲区中,直到从UE接收到成功的HARQ ACK为止。此外,根据BWP配置的不同,延迟也会有所差异。
#Packet drops
在NrGnbMac中不会丢弃数据包。

NrGnbPhy

NrGnbPhy定制了NrPhy,以使gNB在其物理层上的行为适应。其实现可以在model/nr-gnb-phy.cc、model/nr-phy.cc和model/nr-phy-mac-common.cc中找到。物理层在NR手册的第2.3节中得到了广泛地讨论。此外,在NrGnbPhy和NrPhy类的doxygen文档中还有更详细的技术描述。通过启用NrGnbPhy和NrPhy日志组件,可以配置该模拟:

NS_LOG="NrGnbPhy=info|prefix_all:NrPhy=info|prefix_all" ./ns3 run cttc-nr-demo &>,out.log

在模拟开始时,配置了物理层。由于我们处于TDD环境中,设置了其模式。此外,根据可用带宽,设置了每个BWP的RB数量。最后,请求并获取了信道访问。考虑到这个模拟的简单性,信道被长时间分配,但需要注意的是,一旦gNB不再用于数据传输,就会释放信道。下面的日志消息中可以获取所有这些信息:

+0.000000000s -1 [ CellId 0, bwpId 65535] NrGnbPhy:SetTddPattern(): [INFO ] Set,
→pattern : F|F|F|F|F|F|F|F|F|F|
+0.000000000s -1 [ CellId 0, bwpId 0] NrPhy:DoUpdateRbNum(): [INFO ] Updated RbNum␣
,to 33
+0.000000000s -1 [ CellId 0, bwpId 1] NrPhy:DoUpdateRbNum(): [INFO ] Updated RbNum␣
,to 133
+0.000000000s -1 [ CellId 2, bwpId 0] NrPhy:DoUpdateRbNum(): [INFO ] Updated RbNum␣
,to 6
+0.000000000s -1 [ CellId 2, bwpId 0] NrPhy:DoUpdateRbNum(): [INFO ] Updated RbNum␣
,to 6
+0.000000000s 0 [ CellId 2, bwpId 0] NrGnbPhy:StartSlot(): [INFO ] Channel not,
→granted, request the channel
+0.000000000s 0 [ CellId 2, bwpId 0] NrGnbPhy:ChannelAccessGranted(): [INFO ]␣
,
→Channel access granted for +9.22337e+18ns, which corresponds to 147573952589675,
→slot in which each slot is +62500ns. We lost +62500ns
...
+0.000062500s 0 [ CellId 2, bwpId 0] NrGnbPhy:EndSlot(): [INFO ] Release the channel␣
,
→because we did not have any data to maintain the grant

TDD模式中的F表示对于每个TDD时隙,可以处理从下行到上行的任何类型的帧,包括CTRL或DATA类型.关LteNrTddSlotType的更多信息可以在NR doxygen中找到。
gNB的物理层通过NrPhy::SetMacPdu()方法接收MAC PDU。首先,检查数值以了解PHY是否正在该数值上工作。如果条件成立,则将PDU添加到ns3::PacketBurst对象中,这是一个数据包列表的抽象表示。此列表与上下文信息进行映射,上下文信息由流ID和起始符号组成。实际上,可以注意到此INFO日志消息,它标志着MAC PDU进入该层,以及其属性,例如SfnSf(用于跟踪帧号、子帧号和时隙号)和起始符号:

+0.400125000s 0 [ CellId 2, bwpId 0] NrPhy:SetMacPdu(): [INFO ] Adding a packet for,
→the Packet Burst of FrameNum: 40 SubFrameNum: 0 SlotNum: 4 at sym 1

由于时隙顺序由调度程序处理,因此传输由事件循环引导,该循环调用NrGnbPhy::StartSlot()并通过NrPhy::PushFrontSlotAllocInfo()查询数据包突发。数据包最终通过DlData()通过无线信道发送,然后通过SendDataChannels()与频谱交互。按照相同的逻辑,数据包从UlData()和PhyDataPacketReceived()接收。
从此时起,NrGnbPhy与NrSpectrumPhy::StartTxDataFrames()进行交互,后者充当gNB物理层与信道之间的接口。NrSpectrumPhy充当状态机,用于了解PHY层(在所关注的BWP上)目前正在做什么,包括传输/接收数据或控制信息还是处于空闲状态。一旦给定了带有相关的控制消息和传输持续时间的数据包突发,将创建NrSpectrumSignalParameterDataFrame结构。该对象包含上述信息,以及小区标识符(GetCellId())和传输PSD。然后将此信息转发到信道。
日志消息非常详细,但在有数据要传输时会保持一致的模式。实际上,在数据到达物理层时可以注意到以下日志消息:

+0.400187500s 0 [ CellId 2, bwpId 0] NrGnbPhy:RetrieveDciFromAllocation(): [INFO ]␣
,
→Send DCI to RNTI 2 from sym 1 to 13
+0.400187500s 0 [ CellId 2, bwpId 0] NrGnbPhy:FillTheEvent(): [INFO ] Scheduled␣
,
→allocation RNTI=0|DL|SYM=0|NSYM=1|TYPE=2|BWP=0|HARQP=0|RBG=[0;32] at +0ns
+0.400187500s 0 [ CellId 2, bwpId 0] NrGnbPhy:FillTheEvent(): [INFO ] Scheduled␣
,
→allocation RNTI=2|DL|SYM=1|NSYM=12|McsStream0=0|TBsStream0=84|NdiStream0=1|RvS
tream0=0|TYPE=1|BWP=0|HARQP=19|RBG=[0;32] at +4464ns
+0.400187500s 0 [ CellId 2, bwpId 0] NrGnbPhy:FillTheEvent(): [INFO ] Scheduled␣
,
→allocation RNTI=0|UL|SYM=13|NSYM=1|TYPE=2|BWP=0|HARQP=0|RBG=[0;32] at +58032ns
+0.400191964s 0 [ CellId 2, bwpId 0] NrGnbPhy:DlData(): [INFO ] ENB TXing DL DATA,
→frame FrameNum: 40 SubFrameNum: 0 SlotNum: 3 symbols 1-12 start +4.00192e+08ns end,+4.00246e+08ns
+0.400250000s 0 [ CellId 3, bwpId 1] NrGnbPhy:EndSlot(): [INFO ] Release the channel␣
,
→because we did not have any data to maintain the grant

NrGnbPhy::FillTheEvent()在仿真器中计划了变量TTI作为事件。第一个计划的信息在下行发送一个符号的控制信息给UE;第二个发送的是数据TB,而第三个是在上行接收来自UE的ACK。

#Packet latency
在这一层,每个数据包都会根据特征而具有不同的时延,这些特征是NR的特征。例如,处理时间会影响数据包的时延,其参数由L1L2CtrlLatency以timeslots为单位进行参数化。该参数被硬编码为2,表示在数据包发送到空中之前,需要两个timeslots进行分配。此外,时延可能会受到NR处理延迟的影响。具体而言,如果将N0Delay设置为大于0的值,进而将K0设置为大于0的值,将导致额外的时延。如需更多信息,请参阅NR手册2.5.6节。可以注意到,数据包在达到预定传输时间时增加了0.19毫秒的时延,并且所需传输感兴趣数据的总时间为54微秒。

#Packet drops
在NrGnbPhy中,包不能被丢弃,但在接收时,如果包被发现损坏,可能会在NrSpectrumPhy中被丢弃。包的损坏与否是通过调用NrSpectrumPhy中的函数NrErrorModel::GetTbDecodificationStats()进行评估的,该函数考虑了HARQ历史(用于为此仿真配置的HARQ模型,即Chase Combining或Incremental Redundancy)。

在无线通信中,下行控制信息(Downlink Control Information,简称DCI)是一种特殊的信号,用于传递关于数据传输的参数。其中,starting symbol index是DCI中的一个参数,它指示了物理层数据单元(PDU)在时间和频率资源网格中的起始位置。
在5G NR(新无线)中,一个slot(时隙)被划分为多个符号。每个符号都有一个索引号,从0开始。因此,starting symbol index就是这个数据包在哪个符号开始的标记。例如,如果starting symbol index为1,那么数据包就从该时隙的第二个符号开始。
这个参数对于正确解码和接收数据包非常重要,因为它告诉接收端在何处开始解码数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值