跳到主要内容

03 - NoC 网络与多芯片通信

概述 -- TPUPerf 的三级通信架构

TPUPerf 仿真器对 SG2260/SG2262 的片上和片间通信建模分为三个层次:

=============================================================================
Layer 3: C2C + CDMA 跨芯片通信
Cdma (命令驱动) --> C2C (物理链路) --> 远端芯片
alpha-beta 延迟模型 | Credit 流控 | Outstanding 限制
-----------------------------------------------------------------------------
Layer 2: NoC 网格路由器
NocRn (TLM->Flit) --> Router[req/dat/rsp] --> NocSn (Flit->TLM)
XY/OddEven 路由 | Wormhole 交换 | LinkSlice 链路延迟
-----------------------------------------------------------------------------
Layer 1: SimpleBus 片内总线
GDMA/SDMA --> SimpleBus<N,M> --> DDR/L2M/Cache
NxM Crossbar | 地址路由表(SAM) | 距离相关延迟矩阵
=============================================================================

Layer 1 (SimpleBus): 连接各核的 GDMA/SDMA 到 DDR 控制器,是一个 NxM TLM 总线,支持 per-path 延迟配置和 Outstanding 控制。用于核内存访问的主路径。

Layer 2 (NoC): 基于 Noxim 修改的 2D Mesh 网络,每个 Tile 包含三个独立的 Router(req/dat/rsp 三通道),通过 RN/SN 协议节点将 TLM 事务转换为 Flit 级传输。适用于需要精确建模网络竞争和拥塞的场景。

Layer 3 (C2C + CDMA): 跨芯片通信。CDMA 负责命令调度和数据分段,C2C 负责物理链路传输,支持 Credit 流控协议。


SimpleBus 片内总线

模块结构

SimpleBus 定义在 c_model/include/fabric/simple_bus.h,是一个模板类:

template <int NrOfInitiators, int NrOfTargets>
class SimpleBus : public sc_core::sc_module, public BusInterface

NrOfInitiators 对应发起端数量(GDMA + SDMA, 每核各一个), NrOfTargets 对应目标端数量(DDR bank、L2M 等)。

  Initiator[0]  Initiator[1]  ...  Initiator[N-1]
(GDMA_0) (SDMA_0) (SDMA_K)
| | |
v v v
tsocket_[0] tsocket_[1] tsocket_[N-1]
| | |
+------+------+------+----------+
| SimpleBus Crossbar |
| (仲裁 + 延迟注入) |
+------+------+------+----------+
| | |
isocket_[0] isocket_[1] isocket_[M-1]
| | |
v v v
DDR[0] DDR[1] L2M/Cache

地址路由

SimpleBus 通过 sam_port_ (System Address Map) 接口解码目标地址:

sc_port<SamBaseIf> sam_port_;
std::unordered_map<mem_alias, uint32_t> port_map_;

当 Initiator 发起事务时,总线通过 sam_port_->decode(address) 获取 mem_alias,再从 port_map_ 查找对应的 isocket 索引,实现地址到物理端口的映射。

延迟矩阵

SimpleBus 为每一对 (Initiator, Target) 维护独立的延迟参数:

std::vector<std::vector<uint32_t>> param_rsp_rd_lat_;  // [N][M] 响应读延迟
std::vector<std::vector<uint32_t>> param_rsp_wr_lat_; // [N][M] 响应写延迟
std::vector<std::vector<uint32_t>> param_req_rd_lat_; // [N][M] 请求读延迟
std::vector<std::vector<uint32_t>> param_req_wr_lat_; // [N][M] 请求写延迟

BusLatencyConfig (scheme/simple_bus_config.h) 支持两种延迟模式:

固定延迟模式 (SG2260, BM1684X2): 按路径类型配置固定值。例如 BM1684X2 中 GDMA->DDR 的响应读延迟为 2 cycle, GDMA->L2M 为 60 cycle。

动态延迟模式 (SG2262): 延迟与 Initiator 和 Target 之间的拓扑距离成比例:

// SG2262: 8 cluster x 8 core, 坐标通过 lambda 计算
config.get_x_coord = [CLUSTER_NUM](int i) {
int base_x[] = {0, 4, 0, 4, 0, 4, 0, 4};
return base_x[i/CLUSTER_NUM] + (i%CLUSTER_NUM) % 4;
};
// 延迟 = |x_init - x_tgt| * lat_x + |y_init - y_tgt| * lat_y

仲裁与 Outstanding 控制

每个 Target 端口维护 per-Initiator 的请求 pending 队列:

std::deque<XactPtrT> slv_rcmd_req_pend_[NrOfTargets][NrOfInitiators];
std::deque<XactPtrT> slv_wcmd_req_pend_[NrOfTargets][NrOfInitiators];

仲裁通过 slv_req_arb_mth() (每 Target 一个独立的 SC_METHOD) 实现轮转选择。Outstanding 通过 sc_semaphore 控制:

std::unique_ptr<sc_semaphore> slv_req_rd_ost_sema_[NrOfTargets];
std::unique_ptr<sc_semaphore> slv_req_wr_ost_sema_[NrOfTargets];

事务生命周期经过四个自定义 Phase: REQ_ARB -> REQ_ARB_DONE -> RSP_ARB -> RSP_ARB_DONE,通过 peq_with_cb_and_phase 实现非阻塞流水线。


NoC 网格路由器

Router 微架构

Router 定义在 noc/include/Router.h,是一个 SC_MODULE,每个时钟上升沿执行 process(),内部包含:

                      free_slots_neighbor[N/E/S/W]
|
+-------------------v-------------------+
| Router |
| |
rx_flit_[N] --> buffer_[NORTH][VC0..VC7] |
rx_flit_[E] --> buffer_[EAST][VC0..VC7] |
rx_flit_[S] --> buffer_[SOUTH][VC0..VC7] |
rx_flit_[W] --> buffer_[WEST][VC0..VC7] |
rx_flit_[RN] --> buffer_[LOCAL][VC0..VC7] --> tx_flit_[N/E/S/W/RN/SN]
rx_flit_[SN] --> buffer_[HUB][VC0..VC7] |
| |
| routing_algorithm_ --> route() |
| selection_strategy_ --> apply() |
| reservation_table_ (输出端口预留) |
| rr_priority_ (轮转优先级) |
+----------------------------------------+

端口数量: DIRECTIONS + 2 = 6 个端口。4 个方向 (N=0, E=1, S=2, W=3) + LOCAL=4 (连接 RN) + HUB=5 (连接 SN)。

Buffer 结构: BufferBank buffer_[6],每个 BufferBank 是 Buffer[MAX_VIRTUAL_CHANNELS]Bufferqueue<Flit> 的封装,支持 push/pop/front/is_full/is_empty,并内置死锁检测 (deadlock_check)。

Virtual Channel: 最多 MAX_VIRTUAL_CHANNELS = 8 条,但当前 SG2260 配置中 n_virtual_channels = 1,仅使用 VC0。

Flit 格式

Flit 是 NoC 中的最小传输单元,定义在 DataStructs.h:

struct Flit {
int src_id_; // 源 Tile ID
int dst_id_; // 目的 Tile ID
int vc_id_; // Virtual Channel 编号
FlitType flit_type_; // HEAD / BODY / TAIL
int sequence_no_; // 包内序号
int sequence_length_; // 包总长度
Payload payload_; // 32-bit 数据负载
double timestamp_; // 生成时间戳
int hop_no_; // 已跳数
Packet* pck_; // 关联的 Packet 指针
};

Flit 类型三种: FLIT_TYPE_HEAD (头 flit,携带路由信息), FLIT_TYPE_BODY (数据 flit), FLIT_TYPE_TAIL (尾 flit,释放资源)。

每个 Flit 通过 pck_ 指针反向关联到所属的 Packet,Packet 包含完整的 TLM transaction 指针和时序统计信息 (read_begin_req_, write_end_dat_ 等)。

流水线处理

Router 的 process() 在每个时钟周期内顺序执行两个阶段:

rx_process (接收): 扫描所有 6 个输入端口,当 rx_valid_[i]rx_ready_[i] 时,将收到的 Flit 推入 buffer_[i][vc]。若 buffer 满则断言失败。完成后更新 rx_ready_[i] 信号反映 buffer 可用状态。

tx_process (发送): 扫描所有 6 个输出端口。对每个输出端口 i,按轮转优先级 rr_priority_[i] 遍历所有输入端口,取出 buffer 头部 Flit,调用 route(flit, inport) 计算输出方向。若路由结果恰好是当前输出端口 i,则转发该 Flit 并更新轮转优先级。

// 简化的 tx_process 逻辑
for (int i = 0; i < 6; i++) {
for (auto inport : rr_priority_[i]) {
flit = buffer_[inport][vc].front();
int o = route(flit, inport);
if (o == i) {
buffer_[inport][vc].pop();
tx_flit_[i].write(flit);
tx_valid_[i].write(true);
// 轮转优先级更新
break;
}
}
}

当前实现是单周期 crossbar 交换: 同一个时钟周期内完成路由计算、仲裁、转发,没有多级流水线。这是对 Noxim 原始设计的简化,减少仿真开销。


路由算法

所有路由算法继承自 RoutingAlgorithm 基类,通过工厂模式注册:

class RoutingAlgorithm {
public:
virtual vector<int> route(Router* router, const RouteData& route_data) = 0;
};

route() 返回一个候选方向列表。若只有一个方向则直接使用,否则交给 Selection Strategy 选择。

XY 路由 (确定性)

注册名: "XY"。先 X 后 Y 的确定性路由,无死锁。

// Routing_XY.cpp
if (destination.x_ > current.x_) directions.push_back(DIRECTION_EAST);
else if (destination.x_ < current.x_) directions.push_back(DIRECTION_WEST);
else if (destination.y_ > current.y_) directions.push_back(DIRECTION_SOUTH);
else directions.push_back(DIRECTION_NORTH);

总是返回恰好一个方向。适用于流量均匀场景,是 SG2260 默认配置(2260_config.yaml)中使用的算法。

West-First 路由 (部分自适应)

注册名: "WEST_FIRST"。约束: 先完成西方向移动。

  • 若目标在西方或同列 -> 退化为 XY 路由 (确定性)
  • 若目标在东北方 -> 返回 {NORTH, EAST} (两条候选)
  • 若目标在东南方 -> 返回 {SOUTH, EAST} (两条候选)

通过禁止"先东后西"的转向,消除特定的死锁环路。

Odd-Even 路由 (自适应)

注册名: "ODD_EVEN"。基于列奇偶性的自适应路由,规则较复杂:

  • 奇数列 (c0 % 2 == 1) 或源列: 允许南/北转向
  • 偶数列: 向西时允许附加南/北方向
  • 目标奇数列 (d0 % 2 == 1) 或距离 > 1: 允许东方向

返回 1-2 个候选方向,保证无死锁且路径多样性高于 XY。

其他路由算法

算法注册名特点
Negative-First"NEGATIVE_FIRST"优先走负方向(W/S),再走正方向(E/N)
North-Last"NORTH_LAST"北方向只能作为最后一步,与 West-First 对偶
DYAD"DYAD"拥塞感知: 无拥塞时用 Odd-Even 的第一个候选, 拥塞时返回全部候选
Table-Based"TABLE_BASED"从预加载的路由表查找,通过 LocalRoutingTable 查询
Delta"DELTA"用于 Butterfly/Omega/Baseline 等 Delta 拓扑,非 Mesh

算法比较与选择

                    延迟优化        吞吐优化        死锁自由      适用场景
XY ++ + Yes 均匀流量, 简单实现
West-First + ++ Yes 偏西向流量
Odd-Even + +++ Yes 通用自适应
DYAD ++ +++ Yes 动态负载
Negative-First + ++ Yes 偏负方向流量
Table-Based +++ +++ Depends 定制优化

选路策略 (Selection Strategy)

当路由算法返回多个候选方向时,Selection Strategy 从中选择最终方向。

RANDOM

注册名: "RANDOM"。最简单: directions[rand() % directions.size()]。不依赖任何状态信息。SG2260 默认使用此策略。

BUFFER_LEVEL

注册名: "BUFFER_LEVEL"。选择下游 buffer 空闲槽位最多的方向:

for (each candidate direction) {
int free_slots = router->free_slots_neighbor_[direction].read();
bool available = router->reservation_table_.is_not_reserved(direction);
if (available && free_slots > max_free_slots) {
best_dirs = {direction};
max_free_slots = free_slots;
}
}

同时在 per_cycle_update() 中每周期更新 free_slots_ 信号和 NoP 数据。

NOP (Neighbors-on-Path)

注册名: "NOP"。两跳前瞻策略: 对每个候选方向,模拟在邻居节点上再执行一次路由,读取邻居的 NoPData (包含各方向的 ChannelStatus),计算 score = sum(available * free_slots),选择得分最高的方向。

NOP 策略信息通过专用信号 no_p_data_out_/no_p_data_in_ 在相邻路由器间交换,无需额外带宽。


RN/SN 协议节点

RN (Request Node) 和 SN (Service Node) 是 NoC 与外部 TLM 世界之间的协议转换层。

整体数据流

   TLM Master (GDMA/SDMA)
|
| TLM nb_transport_fw (BEGIN_REQ)
v
+----------+ +----------+
| NocRn | --- req_flit_ ---> NoC Mesh --- req_flit_ --> | NocSn |
| | <-- rsp_flit_ --- (Routers) <-- rsp_flit_ --- | |
| | --- wdat_flit_ -> --- rdat_flit_ --> | |
| | <-- rdat_flit_ - <-- wdat_flit_ --- | |
+----------+ +----------+
^ |
| TLM nb_transport_bw (BEGIN_RESP) | TLM (to DDR)
v v
TLM Master TLM Slave (DDR/L2M)

三通道分离: req (请求), rsp (响应), dat (数据) 各自独立路由, 对应 Tile 中的三个 Router 实例 (router_req_, router_dat_, router_rsp_)。

NocRn (Request Node)

定义在 noc/include/rn.h,实现在 noc/src/rn.cpp

TLM 入口 (init_nb_trans_fw): 接收 TLM 事务的 BEGIN_REQ,通过 SAM 解码目标地址获取 dst_id,创建 Packet 对象(包含 src/dst/vc/timestamp/size 和 transaction 指针),存入 transaction_tracker_,然后放入 central_control_ PEQ。

Flit 组装 (req_method): 每时钟周期从 r_table_w_table_ 中轮转仲裁(arbiter_flag_)取出一个待发请求,封装为 HEAD Flit 发送到 req 通道:

flit.src_id_    = packet.src_id_;
flit.dst_id_ = packet.dst_id_;
flit.flit_type_ = FlitType::FLIT_TYPE_HEAD;
flit.pck_ = &packet;
req_valid_.write(true);
req_flit_.write(flit);

写数据发送 (wdat_method): 对写事务,等待 packet.finished_ 标志(SN 返回写响应后设置),然后逐 beat 发送 BODY Flit 到 dat 通道。每 beat 宽度为 bus_width_ 字节, flit_left_ 递减至 0 时发送 BEGIN_RESP 回 TLM Master。

读数据接收 (rdat_method): 当 sequence_length_ == sequence_no_ (最后一个 data flit) 时,向 TLM Master 发送 BEGIN_RESP 完成事务。

NocSn (Service Node)

存在两种实现:

NocSn (sn.h): 连接 SCML2 protocol engine (scml2::tlm2_ft_initiator_port_pe),用于与精确 AXI 模型对接。通过 data_out_protocol_engine 发送/接收 AXI 事务,在 peq_cbs 回调中将 AXI 响应数据转换为 Flit 推入 r_data_buffer_

NocSnTlm (sn_tlm.h): 使用标准 TLM-2.0 simple_initiator_socket,通过 nb_transport_fw 与下游 Slave 通信。实现相同的 req/rsp/wdat/rdat 四通道协议,但不依赖 SCML2,更轻量。

两种 SN 的核心逻辑相同:

  1. req_method(): 从 req 通道接收 HEAD Flit,按 TLM command 类型分派到 r_table_(读) 或 w_table_(写)
  2. rx_tlm(): 从 r_table_ 取请求发送到下游 Slave;从 w_data_buffer_ 取写数据发送到下游
  3. rsp_method(): 写请求完成后发送响应 Flit 回 rsp 通道
  4. rdat_method(): 读数据 Flit 从 r_data_buffer_ 发送到 dat 通道

Tile 和 NoC 顶层组装

Tile 结构

每个 Tile (noc/include/Tile.h) 包含三个 Router 实例:

Router* router_req_;  // 请求通道路由器
Router* router_dat_; // 数据通道路由器
Router* router_rsp_; // 响应通道路由器

三个 Router 共享 clock/reset,但各自维护独立的 buffer、路由表和统计信息。端口信号按通道隔离:

Tile[i][j]
+------------------------------------------------------------------+
| req_rx/tx_flit_[0..5] --> router_req_ --> req_rx/tx_flit_[0..5]|
| dat_rx/tx_flit_[0..5] --> router_dat_ --> dat_rx/tx_flit_[0..5]|
| rsp_rx/tx_flit_[0..5] --> router_rsp_ --> rsp_rx/tx_flit_[0..5]|
| |
| *_free_slots_[N/E/S/W] (Buffer 水位信号) |
| *_no_p_data_out/in_[N/E/S/W] (NoP 选路信息) |
+------------------------------------------------------------------+

Mesh 拓扑构建

NoC::build_mesh() (noc/src/NoC.cpp) 构建 mesh_dim_x * mesh_dim_y 的 2D Mesh:

  1. 创建 Tile 矩阵: t_[i][j] = new Tile(tile_name, tile_id),tile_id = j * mesh_dim_x + i
  2. 配置 Router: 调用 configure(id, warm_up_time, buffer_depth, grt) 设置 buffer 大小,禁用边界方向的 buffer
  3. 创建 RN 实例: noc_rn_inst_[i][j] = new NocRn(name, idx),与 Tile 的 LOCAL 端口相连
  4. 连接相邻 Tile: 通过信号矩阵 req/rsp/dat_rx/tx_valid/ready/flit_[i][j].north/east/south/west 连接。每个方向同时连接三个通道 (req/rsp/dat)
  5. 插入 LinkSlice: 在每对相邻 Tile 之间插入 LinkSlice 模块模拟链路延迟
  6. 清理边界: 将 Mesh 边缘不存在的方向信号置零

SN 实例 (noc_sn_inst_) 在外部创建后通过 HUB 端口连接到 Tile。

LinkSlice 链路延迟模型

LinkSlice (noc/include/link_slice.h) 模拟路由器间的物理链路传播延迟:

uint32_t param_slice_num_;    // FIFO 深度 (流控反压阈值)
uint32_t param_slice_delay_; // 传播延迟 (时钟周期数)

工作原理:

  • rx_process_mth(): 接收 Flit 后放入 slice_fifo_,同时通过 delay_path_.notify(*f, param_slice_delay_ * period_) 设置延迟 timer
  • delay_path_mth(): 延迟到期后将 Entry 标记为 committed_ = true
  • tx_process_mth(): 仅转发 committed_ 的 Flit
  • rx_ack_mth(): 当 slice_fifo_.size() < param_slice_num_ 时拉高 rx_ready_,实现基于深度的流控

SG2260 配置中 param_slice_num_ = 4, param_slice_delay_ = 4,即 4 cycle 链路延迟,4 flit 深度的流水线。

关键参数配置

NoC 参数通过 sc_attribute 从 YAML 加载:

# 2260_config.yaml
topology: MESH
mesh_dim_x: 8 # X 方向 Tile 数
mesh_dim_y: 8 # Y 方向 Tile 数 (共 64 个 Tile)
buffer_depth: 2 # 每方向 Buffer 深度 (flit 数)
n_virtual_channels: 1 # VC 数量 (当前只用 1 条)
routing_algorithm: XY # 路由算法
selection_strategy: RANDOM # 选路策略
clock_period_ps: 500 # NoC 时钟周期 (2 GHz)

C2C 和 CDMA 跨芯片通信

CDMA 命令 DMA

Cdma (c_model/include/sg2260/cdma.h) 是跨芯片数据搬运的命令处理引擎。与 GDMA/SDMA 类似,它从命令队列 cdma_cmd_list_ 取出描述符,分解为内存事务执行。

  命令队列 (cdma_cmd_list_)
|
v
cmd_dispatch_mth() --> send_cmd_th() / recv_cmd_th()
| |
v v
rdata_seg_th() rd_tensor_to_fab_th() (读路径)
wdata_seg_th() wr_tensor_to_fab_th() (写路径)
| |
v v
gmem_agt_ (GmemAgent) tx_socket_ --> C2C --> 远端
|
v
gmem_master_socket_ --> SimpleBus --> DDR

命令类型 (cdma_cmd.h):

  • CdmaTensorCmd: 4D Tensor 搬运 (NCHW 形状),支持 stride 跨步和连续性检测优化
  • CdmaGeneralCmd: 通用线性搬运
  • CdmaLossyCompressCmd / CdmaLossyDecompressCmd: 有损压缩传输 (FP32 -> FP20)
  • CdmaReceiveCmd: 接收远端数据

Alpha-Beta 延迟模型: CDMA 支持伪延迟模式,通过以下参数快速估算通信时间:

sc_attribute<float> param_pseudo_alpha_us_;    // 固定延迟 alpha (us)
sc_attribute<float> param_pseudo_beta_us_; // 每字节延迟 beta (us)
sc_attribute<float> param_pseudo_c2c_bw_gps_; // C2C 链路带宽 (GB/s)

延迟计算: delay = alpha + data_size * beta + data_size / c2c_bw

Credit 流控: CDMA 通过 CreditIf 接口与 C2C 交换 Credit 信息,Credit 结构体携带远端目标地址和 reduce 操作类型:

class CreditIf : virtual public sc_interface {
public:
virtual void write_credit(tlm::tlm_generic_payload*) = 0;
};

Credit 容量由 param_credit_capacity_ 控制,send_issue_sema_recv_issue_sema_ 限制并发命令数。

C2C 物理链路

C2C (c_model/include/sg2260/c2c.h) 模拟芯片间物理链路,包含两个 GmemAgent (master + slave) 和 TX/RX socket。

  本芯片                          远端芯片
-------- --------
CDMA CDMA
| ^
v |
C2C.gmem_slave_ C2C.gmem_master_
| ^
v |
C2C.tx_socket_ ----链路----> C2C.rx_socket_
param_link_bw_gps_
param_internal_delay_

链路延迟模型:

// c2c.cc tx_external_th()
sc_core::sc_time delay =
c2c_pkt->get_data_length() / param_link_bw_gps_ * sc_core::sc_time(1, SC_NS);
tx_socket_->b_transport(*c2c_pkt, delay);

默认链路带宽 param_link_bw_gps_ = 256/8/2 * 0.7 = 11.2 GB/s (SerDes 256 Gbps, 双向, 70% 效率)。

Outstanding 控制: 读写各自独立的 semaphore:

uint32_t param_wr_outstanding_ = 128;  // 写 outstanding 上限
uint32_t param_rd_outstanding_ = 128; // 读 outstanding 上限

C2C 扩展字段 (c2c_extension.h): 每个 C2C 包携带 C2cExtension:

c2c_cmd_type_t cmd_type_;   // DATA 或 CREDIT
uint32_t src_chip_; // 源芯片 ID
uint32_t dst_chip_; // 目标芯片 ID
uint64_t bar_; // Base Address Register (地址重映射)
bool has_data_; // 是否携带数据负载
bool last_; // 是否为事务最后一个包

数据流示例: 跨芯片 AllReduce

  1. CDMA 从命令队列取出 AllReduce 描述符
  2. 读路径: rdata_seg_th() 将 Tensor 分段,通过 gmem_agt_ 从本地 DDR 读取
  3. 发送: 数据通过 tx_socket_ -> C2C 链路 -> 远端 rx_socket_
  4. 远端 C2C 收到后通过 gmem_master_ 写入远端 DDR
  5. 远端 CDMA 收到 Credit (通过 credit_port_),得知数据已到达
  6. Reduce 操作: CdmaExtension 中的 are_en_/are_op_code_/are_psum_op_ 字段指示 SN 端执行 atomic reduce

关键参数与配置汇总

NoC 参数

参数默认值说明
mesh_dim_x8Mesh X 维度
mesh_dim_y8Mesh Y 维度
buffer_depth2每方向 Buffer 深度 (flit)
n_virtual_channels1VC 数量
routing_algorithmXY路由算法
selection_strategyRANDOM选路策略
clock_period_ps500NoC 时钟周期 (ps)
bus_width (NoC)128RN/SN 数据宽度 (Bytes)
LinkSlice param_slice_num_4链路 FIFO 深度
LinkSlice param_slice_delay_4链路传播延迟 (cycle)

SimpleBus 参数

参数说明
bus_width_总线数据宽度 (Bytes)
max_burst_最大突发长度
mst_rd/wr_outstanding_Master 端读/写 Outstanding 上限
slv_rd/wr_outstanding_Slave 端读/写 Outstanding 上限
param_req/rsp_rd/wr_lat_[N][M](Initiator, Target) 延迟矩阵

C2C/CDMA 参数

参数默认值说明
param_link_bw_gps_11.2 GB/sC2C 链路有效带宽
param_internal_delay_0C2C 内部处理延迟 (cycle)
param_wr/rd_outstanding_128C2C 读/写 Outstanding
param_pseudo_alpha_us_-Alpha 延迟 (us)
param_pseudo_beta_us_-Beta 每字节延迟 (us)
param_pseudo_c2c_bw_gps_-伪模式 C2C 带宽 (GB/s)
param_credit_capacity_-Credit 容量
param_send_msg_delay_-消息发送延迟 (cycle)