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]。Buffer 是 queue<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)
存在两种实现:
NocSnsn.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 的核心逻辑相同:
req_method(): 从 req 通道接收 HEAD Flit,按 TLM command 类型分派到r_table_(读) 或w_table_(写)rx_tlm(): 从r_table_取请求发送到下游 Slave;从w_data_buffer_取写数据发送到下游rsp_method(): 写请求完成后发送响应 Flit 回 rsp 通道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:
- 创建 Tile 矩阵:
t_[i][j] = new Tile(tile_name, tile_id),tile_id = j * mesh_dim_x + i - 配置 Router: 调用
configure(id, warm_up_time, buffer_depth, grt)设置 buffer 大小,禁用边界方向的 buffer - 创建 RN 实例:
noc_rn_inst_[i][j] = new NocRn(name, idx),与 Tile 的 LOCAL 端口相连 - 连接相邻 Tile: 通过信号矩阵
req/rsp/dat_rx/tx_valid/ready/flit_[i][j].north/east/south/west连接。每个方向同时连接三个通道 (req/rsp/dat) - 插入 LinkSlice: 在每对相邻 Tile 之间插入 LinkSlice 模块模拟链路延迟
- 清理边界: 将 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_)设置延迟 timerdelay_path_mth(): 延迟到期后将 Entry 标记为committed_ = truetx_process_mth(): 仅转发committed_的 Flitrx_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
- CDMA 从命令队列取出 AllReduce 描述符
- 读路径:
rdata_seg_th()将 Tensor 分段,通过gmem_agt_从本地 DDR 读取 - 发送: 数据通过
tx_socket_-> C2C 链路 -> 远端rx_socket_ - 远端 C2C 收到后通过
gmem_master_写入远端 DDR - 远端 CDMA 收到 Credit (通过
credit_port_),得知数据已到达 - Reduce 操作:
CdmaExtension中的are_en_/are_op_code_/are_psum_op_字段指示 SN 端执行 atomic reduce
关键参数与配置汇总
NoC 参数
| 参数 | 默认值 | 说明 |
|---|---|---|
mesh_dim_x | 8 | Mesh X 维度 |
mesh_dim_y | 8 | Mesh Y 维度 |
buffer_depth | 2 | 每方向 Buffer 深度 (flit) |
n_virtual_channels | 1 | VC 数量 |
routing_algorithm | XY | 路由算法 |
selection_strategy | RANDOM | 选路策略 |
clock_period_ps | 500 | NoC 时钟周期 (ps) |
bus_width (NoC) | 128 | RN/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/s | C2C 链路有效带宽 |
param_internal_delay_ | 0 | C2C 内部处理延迟 (cycle) |
param_wr/rd_outstanding_ | 128 | C2C 读/写 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) |