From 96963487696a98d43d191045828fd3b9ee8a9f5c Mon Sep 17 00:00:00 2001 From: snigupta Date: Wed, 23 Sep 2026 15:21:00 -0600 Subject: [PATCH 1/2] bug fixes Signed-off-by: snigupta --- profile/plugin/aie_trace/ve2/aie_trace.cpp | 212 ++++----------------- profile/plugin/aie_trace/ve2/aie_trace.h | 5 - 2 files changed, 39 insertions(+), 178 deletions(-) diff --git a/profile/plugin/aie_trace/ve2/aie_trace.cpp b/profile/plugin/aie_trace/ve2/aie_trace.cpp index d49cb29e..04c6fc67 100644 --- a/profile/plugin/aie_trace/ve2/aie_trace.cpp +++ b/profile/plugin/aie_trace/ve2/aie_trace.cpp @@ -1437,7 +1437,9 @@ namespace xdp { } // Build 2-channel broadcast network for trace start synchronization - build2ChannelBroadcastNetwork(hwCtxImpl, traceStartBroadcastChId1, traceStartBroadcastChId2, XAIE_EVENT_PERF_CNT_0_PL); + aie::trace::build2ChannelBroadcastNetwork(&aieDevInst, metadata, traceStartBroadcastChId1, + traceStartBroadcastChId2, XAIE_EVENT_PERF_CNT_0_PL, + startCol, numCols, metadataReader->getNumRows()); xrt_core::message::send(severity_level::info, "XRT", "Finished AIE Windowed Trace Settings."); auto hwContext = metadata->getHwContext(); @@ -1512,6 +1514,16 @@ namespace xdp { xrt_core::message::send(severity_level::info, "XRT", "Synchronizing AIE timers so trace and ML timeline share a time domain."); timerSynchronization(startCol, numCols, metadataReader->getNumRows()); + if (metadata->getTraceStartBroadcast() && metadata->getStartTypeSetting() != "layer") + { + aie::trace::build2ChannelBroadcastNetwork(&aieDevInst, metadata, traceStartBroadcastChId1, + traceStartBroadcastChId2, XAIE_EVENT_COMBO_EVENT_0_PL, + startCol, numCols, metadataReader->getNumRows()); + + coreTraceStartEvent = (XAie_Events) (XAIE_EVENT_BROADCAST_0_CORE + traceStartBroadcastChId1); + memoryTileTraceStartEvent = (XAie_Events) (XAIE_EVENT_BROADCAST_0_MEM_TILE + traceStartBroadcastChId1); + interfaceTileTraceStartEvent = (XAie_Events) (XAIE_EVENT_BROADCAST_A_0_PL + traceStartBroadcastChId2); + } } // Using user event for trace end to enable flushing @@ -1519,7 +1531,6 @@ namespace xdp { // core might be running infinitely. if (metadata->getUseUserControl()) coreTraceStartEvent = XAIE_EVENT_INSTR_EVENT_0_CORE; - coreTraceEndEvent = XAIE_EVENT_USER_EVENT_3_CORE; // Iterate over all used/specified tiles // NOTE: rows are stored as absolute as required by resource manager @@ -1701,30 +1712,33 @@ namespace xdp { } else if (type == module_type::core) { // Route core start/stop into memory-module trace via broadcast (same as client/NPU3). - if (!m_trace_start_broadcast) { + uint16_t phyBroadcast = 0; + if (!(metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer + && metadata->getTraceStartBroadcast() + && metadata->getStartTypeSetting() != "layer")) { if (XAie_EventBroadcast(&aieDevInst, loc, XAIE_CORE_MOD, 8, traceStartEvent) != XAIE_OK) break; - } - if (XAie_EventBroadcast(&aieDevInst, loc, XAIE_CORE_MOD, 9, traceEndEvent) != XAIE_OK) - break; - - uint16_t phyBroadcast = 0; - if (!m_trace_start_broadcast) { XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_CORE_MOD, traceStartEvent, &phyBroadcast); cfgTile->core_trace_config.internal_events_broadcast[8] = phyBroadcast; } + if (XAie_EventBroadcast(&aieDevInst, loc, XAIE_CORE_MOD, 9, traceEndEvent) != XAIE_OK) + break; XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_CORE_MOD, traceEndEvent, &phyBroadcast); cfgTile->core_trace_config.internal_events_broadcast[9] = phyBroadcast; - if (m_trace_start_broadcast) - traceStartEvent = - static_cast(XAIE_EVENT_BROADCAST_0_MEM + traceStartBroadcastChId1); - else - traceStartEvent = XAIE_EVENT_BROADCAST_8_MEM; + traceStartEvent = XAIE_EVENT_BROADCAST_8_MEM; traceEndEvent = XAIE_EVENT_BROADCAST_9_MEM; firstBroadcastId = 10; } + if (metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer + && type == module_type::core + && metadata->getTraceStartBroadcast() + && metadata->getStartTypeSetting() != "layer") + { + traceStartEvent = static_cast(XAIE_EVENT_BROADCAST_0_MEM + traceStartBroadcastChId1); + } + if (type == module_type::core) { if (XAie_EventBroadcastBlockMapDir(&aieDevInst, loc, XAIE_CORE_MOD, XAIE_EVENT_SWITCH_A, 0xFF00, XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_NORTH | @@ -1881,12 +1895,21 @@ namespace xdp { cfgTile->interface_tile_trace_config.traced_events[i] = phyEvent; } + XAie_Events shimTraceStartEvent = interfaceTileTraceStartEvent; + if (col == startCol + && metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer + && metadata->getTraceStartBroadcast() + && metadata->getStartTypeSetting() != "layer") + { + shimTraceStartEvent = XAIE_EVENT_COMBO_EVENT_0_PL; + } + // Update config file { // Add interface trace control events // Start uint16_t phyEvent = 0; - XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_PL_MOD, interfaceTileTraceStartEvent, &phyEvent); + XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_PL_MOD, shimTraceStartEvent, &phyEvent); cfgTile->interface_tile_trace_config.start_event = phyEvent; // Stop XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_PL_MOD, interfaceTileTraceEndEvent, &phyEvent); @@ -1900,7 +1923,7 @@ namespace xdp { if (XAie_TracePktConfig(&aieDevInst, loc, mod, pkt) != XAIE_OK) break; if (startType != "layer" || startLayer == UINT_MAX) { - if (XAie_TraceStartEvent(&aieDevInst, loc, mod, interfaceTileTraceStartEvent) != XAIE_OK) + if (XAie_TraceStartEvent(&aieDevInst, loc, mod, shimTraceStartEvent) != XAIE_OK) break; } if (XAie_TraceStopEvent(&aieDevInst, loc, mod, interfaceTileTraceEndEvent) != XAIE_OK) @@ -1946,14 +1969,6 @@ namespace xdp { (db->getStaticInfo()).addAIECoreEventResources(deviceId, n, mNumTileTraceEvents[m][n]); } - if (m_trace_start_broadcast) { - xrt_core::message::send(severity_level::info, "XRT", "before build2ChannelBroadcastNetwork"); - build2ChannelBroadcastNetwork(handle, traceStartBroadcastChId1, traceStartBroadcastChId2, interfaceTileTraceStartEvent); - xrt_core::message::send(severity_level::info, "XRT", "before XAie_EventGenerate"); - XAie_EventGenerate(&aieDevInst, XAie_TileLoc(startCol, 0), XAIE_PL_MOD, interfaceTileTraceStartEvent); - reset2ChannelBroadcastNetwork(handle, traceStartBroadcastChId1, traceStartBroadcastChId2); - } - auto hwContextSubmit = metadata->getHwContext(); if (!tranxHandler->submitTransaction(&aieDevInst, hwContextSubmit)) { xrt_core::message::send(severity_level::error, "XRT", @@ -2108,155 +2123,6 @@ namespace xdp { startCol, numCols, numRows); } - /*************************************************************************** - * Build broadcast network using specified channels - ***************************************************************************/ - void AieTrace_VE2Impl::build2ChannelBroadcastNetwork(void *hwCtxImpl, uint8_t broadcastId1, - uint8_t broadcastId2, XAie_Events event) - { - boost::property_tree::ptree aiePartitionPt = xdp::aie::getAIEPartitionInfo(hwCtxImpl); - if (aiePartitionPt.empty()) { - xrt_core::message::send(severity_level::warning, "XRT", - "AIE trace: no partition info for trace-start broadcast; skipping broadcast network."); - return; - } - // Currently, assuming only one Hw Context is alive at a time - // uint8_t startCol = static_cast(aiePartitionPt.front().second.get("start_col")); - uint8_t startCol = 0; - // uint8_t numCols = static_cast(aiePartitionPt.front().second.get("num_cols")); - uint8_t numCols = 36; - const uint8_t startColShift = metadata->getPartitionOverlayStartCols().front(); - - std::vector maxRowAtCol(startCol + numCols, 0); - for (auto& tileMetric : metadata->getConfigMetrics()) { - auto tile = tileMetric.first; - auto col = tile.col; - auto row = tile.row; - maxRowAtCol[startCol + col] = std::max(maxRowAtCol[col], (uint8_t)row); - } - - XAie_Events bcastEvent2_PL = static_cast(XAIE_EVENT_BROADCAST_A_0_PL + broadcastId2); - XAie_EventBroadcast(&aieDevInst, XAie_TileLoc(startCol, 0), XAIE_PL_MOD, broadcastId2, event); - - for (uint8_t col = startCol; col < (startCol + numCols); col++) { - for (uint8_t row = 0; row <= maxRowAtCol[col]; row++) { - module_type tileType = aie::getModuleType(row, metadata->getRowOffset()); - auto loc = XAie_TileLoc(col, row); - - // shim tile - if (tileType == module_type::shim) { - // first channel is only used to send north - if (col == startCol) { - XAie_EventBroadcast(&aieDevInst, loc, XAIE_PL_MOD, broadcastId1, event); - } else { - XAie_EventBroadcast(&aieDevInst, loc, XAIE_PL_MOD, broadcastId1, bcastEvent2_PL); - } - if (maxRowAtCol[col] != row) { - XAie_EventBroadcastBlockDir(&aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_EAST); - } else { - XAie_EventBroadcastBlockDir( - &aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_EAST | XAIE_EVENT_BROADCAST_NORTH); - } - - // second channel is only used to send east - if (col != startCol + numCols - 1) { - XAie_EventBroadcastBlockDir(&aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_A, broadcastId2, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_NORTH); - } else { - XAie_EventBroadcastBlockDir(&aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_A, broadcastId2, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_NORTH); - } - } - - // mem tile - else if (tileType == module_type::mem_tile) { - if (maxRowAtCol[col] != row) { - XAie_EventBroadcastBlockDir(&aieDevInst, loc, XAIE_MEM_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_EAST); - } else { - XAie_EventBroadcastBlockDir( - &aieDevInst, loc, XAIE_MEM_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_EAST | XAIE_EVENT_BROADCAST_NORTH); - } - } - - // core tile - else { - if (maxRowAtCol[col] != row) { - XAie_EventBroadcastBlockDir(&aieDevInst, loc, XAIE_CORE_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_EAST); - } else { - XAie_EventBroadcastBlockDir( - &aieDevInst, loc, XAIE_CORE_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_SOUTH | XAIE_EVENT_BROADCAST_WEST | XAIE_EVENT_BROADCAST_EAST | XAIE_EVENT_BROADCAST_NORTH); - } - } - } - } - } - - /*************************************************************************** - * Reset using broadcast network on specified channels - ***************************************************************************/ - void AieTrace_VE2Impl::reset2ChannelBroadcastNetwork(void *hwCtxImpl, uint8_t broadcastId1, - uint8_t broadcastId2) - { - boost::property_tree::ptree aiePartitionPt = xdp::aie::getAIEPartitionInfo(hwCtxImpl); - if (aiePartitionPt.empty()) { - xrt_core::message::send(severity_level::warning, "XRT", - "AIE trace: no partition info for trace-start broadcast reset; skipping."); - return; - } - // Currently, assuming only one Hw Context is alive at a time - //uint8_t startCol = static_cast(aiePartitionPt.back().second.get("start_col")); - uint8_t startCol = 0; - //uint8_t numCols = static_cast(aiePartitionPt.back().second.get("num_cols")); - uint8_t numCols = 36; - const uint8_t startColShift = metadata->getPartitionOverlayStartCols().front(); - - std::vector maxRowAtCol(startCol + numCols, 0); - for (auto& tileMetric : metadata->getConfigMetrics()) { - auto tile = tileMetric.first; - auto col = tile.col; - auto row = tile.row; - maxRowAtCol[startCol + col] = std::max(maxRowAtCol[col], (uint8_t)row); - } - - XAie_EventBroadcastReset(&aieDevInst, XAie_TileLoc(startCol, 0), XAIE_PL_MOD, broadcastId2); - - for (uint8_t col = startCol; col < (startCol + numCols); col++) { - for (uint8_t row = 0; row <= maxRowAtCol[col]; row++) { - module_type tileType = aie::getModuleType(row, metadata->getRowOffset()); - auto loc = XAie_TileLoc(col, row); - - // shim tile - if (tileType == module_type::shim) { - XAie_EventBroadcastReset(&aieDevInst, loc, XAIE_PL_MOD, broadcastId1); - XAie_EventBroadcastUnblockDir(&aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_ALL); - XAie_EventBroadcastUnblockDir(&aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_A, broadcastId2, - XAIE_EVENT_BROADCAST_ALL); - XAie_EventBroadcastUnblockDir(&aieDevInst, loc, XAIE_PL_MOD, XAIE_EVENT_SWITCH_B, broadcastId2, - XAIE_EVENT_BROADCAST_ALL); - } - - // mem tile - else if (tileType == module_type::mem_tile) { - XAie_EventBroadcastUnblockDir(&aieDevInst, loc, XAIE_MEM_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_ALL); - } - - // core tile - else { - XAie_EventBroadcastUnblockDir(&aieDevInst, loc, XAIE_CORE_MOD, XAIE_EVENT_SWITCH_A, broadcastId1, - XAIE_EVENT_BROADCAST_ALL); - } - } - } - } - /**************************************************************************** * Modify events in metric set based on type and channel ***************************************************************************/ diff --git a/profile/plugin/aie_trace/ve2/aie_trace.h b/profile/plugin/aie_trace/ve2/aie_trace.h index 7a583779..300171dc 100755 --- a/profile/plugin/aie_trace/ve2/aie_trace.h +++ b/profile/plugin/aie_trace/ve2/aie_trace.h @@ -107,10 +107,6 @@ namespace xdp { // ------------------------------------------------------------------------- bool configureWindowedEventTrace(void* handle); void timerSynchronization(uint8_t startCol, uint8_t numCols, uint8_t numRows); - void build2ChannelBroadcastNetwork(void* handle, uint8_t broadcastId1, - uint8_t broadcastId2, XAie_Events event); - void reset2ChannelBroadcastNetwork(void* handle, uint8_t broadcastId1, - uint8_t broadcastId2); uint32_t bcIdToEvent(int bcId); void configStreamSwitchPorts(const tile_type& tile, const XAie_LocType loc, @@ -134,7 +130,6 @@ namespace xdp { XAie_DevInst aieDevInst = {0}; std::unique_ptr tranxHandler; - bool m_trace_start_broadcast = false; EventType memoryModTraceStartEvent; #endif }; From f4ccfba2ff1c39a39605e1d4f87393cb9fdacbc2 Mon Sep 17 00:00:00 2001 From: snigupta Date: Wed, 23 Sep 2026 17:07:45 -0600 Subject: [PATCH 2/2] bug fixes Signed-off-by: snigupta --- profile/plugin/aie_trace/ve2/aie_trace.cpp | 39 ++++++++++------------ 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/profile/plugin/aie_trace/ve2/aie_trace.cpp b/profile/plugin/aie_trace/ve2/aie_trace.cpp index 04c6fc67..3c2f5803 100644 --- a/profile/plugin/aie_trace/ve2/aie_trace.cpp +++ b/profile/plugin/aie_trace/ve2/aie_trace.cpp @@ -1437,9 +1437,7 @@ namespace xdp { } // Build 2-channel broadcast network for trace start synchronization - aie::trace::build2ChannelBroadcastNetwork(&aieDevInst, metadata, traceStartBroadcastChId1, - traceStartBroadcastChId2, XAIE_EVENT_PERF_CNT_0_PL, - startCol, numCols, metadataReader->getNumRows()); + aie::trace::build2ChannelBroadcastNetwork(&aieDevInst, metadata, traceStartBroadcastChId1, traceStartBroadcastChId2, XAIE_EVENT_PERF_CNT_0_PL, startCol, numCols, metadataReader->getNumRows()); xrt_core::message::send(severity_level::info, "XRT", "Finished AIE Windowed Trace Settings."); auto hwContext = metadata->getHwContext(); @@ -1503,6 +1501,7 @@ namespace xdp { } auto metadataReader = (VPDatabase::Instance()->getStaticInfo()).getAIEmetadataReader(deviceId); + bool enableMultiLayer = metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer; if (!metadataReader) { if (aie::isDebugVerbosity()) { std::stringstream msg; @@ -1510,15 +1509,13 @@ namespace xdp { xrt_core::message::send(severity_level::debug, "XRT", msg.str()); } } - else if (metadataReader->getAIECompilerOptions().enable_multi_layer) { + else if (enableMultiLayer) { xrt_core::message::send(severity_level::info, "XRT", "Synchronizing AIE timers so trace and ML timeline share a time domain."); timerSynchronization(startCol, numCols, metadataReader->getNumRows()); if (metadata->getTraceStartBroadcast() && metadata->getStartTypeSetting() != "layer") { - aie::trace::build2ChannelBroadcastNetwork(&aieDevInst, metadata, traceStartBroadcastChId1, - traceStartBroadcastChId2, XAIE_EVENT_COMBO_EVENT_0_PL, - startCol, numCols, metadataReader->getNumRows()); + aie::trace::build2ChannelBroadcastNetwork(&aieDevInst, metadata, traceStartBroadcastChId1, traceStartBroadcastChId2, XAIE_EVENT_COMBO_EVENT_0_PL, startCol, numCols, metadataReader->getNumRows()); coreTraceStartEvent = (XAie_Events) (XAIE_EVENT_BROADCAST_0_CORE + traceStartBroadcastChId1); memoryTileTraceStartEvent = (XAie_Events) (XAIE_EVENT_BROADCAST_0_MEM_TILE + traceStartBroadcastChId1); @@ -1713,7 +1710,7 @@ namespace xdp { else if (type == module_type::core) { // Route core start/stop into memory-module trace via broadcast (same as client/NPU3). uint16_t phyBroadcast = 0; - if (!(metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer + if (!(enableMultiLayer && metadata->getTraceStartBroadcast() && metadata->getStartTypeSetting() != "layer")) { if (XAie_EventBroadcast(&aieDevInst, loc, XAIE_CORE_MOD, 8, traceStartEvent) != XAIE_OK) @@ -1731,8 +1728,7 @@ namespace xdp { firstBroadcastId = 10; } - if (metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer - && type == module_type::core + if (enableMultiLayer && type == module_type::core && metadata->getTraceStartBroadcast() && metadata->getStartTypeSetting() != "layer") { @@ -1895,21 +1891,12 @@ namespace xdp { cfgTile->interface_tile_trace_config.traced_events[i] = phyEvent; } - XAie_Events shimTraceStartEvent = interfaceTileTraceStartEvent; - if (col == startCol - && metadataReader && metadataReader->getAIECompilerOptions().enable_multi_layer - && metadata->getTraceStartBroadcast() - && metadata->getStartTypeSetting() != "layer") - { - shimTraceStartEvent = XAIE_EVENT_COMBO_EVENT_0_PL; - } - // Update config file { // Add interface trace control events // Start uint16_t phyEvent = 0; - XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_PL_MOD, shimTraceStartEvent, &phyEvent); + XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_PL_MOD, interfaceTileTraceStartEvent, &phyEvent); cfgTile->interface_tile_trace_config.start_event = phyEvent; // Stop XAie_EventLogicalToPhysicalConv(&aieDevInst, loc, XAIE_PL_MOD, interfaceTileTraceEndEvent, &phyEvent); @@ -1922,8 +1909,16 @@ namespace xdp { XAie_Packet pkt = {0, packetType}; if (XAie_TracePktConfig(&aieDevInst, loc, mod, pkt) != XAIE_OK) break; - if (startType != "layer" || startLayer == UINT_MAX) { - if (XAie_TraceStartEvent(&aieDevInst, loc, mod, shimTraceStartEvent) != XAIE_OK) + if (col == startCol && enableMultiLayer + && metadata->getTraceStartBroadcast() + && metadata->getStartTypeSetting() != "layer") + { + if (XAie_TraceStartEvent(&aieDevInst, loc, mod, XAIE_EVENT_COMBO_EVENT_0_PL) != XAIE_OK) + break; + } + else if (startType != "layer" || startLayer == UINT_MAX) + { + if (XAie_TraceStartEvent(&aieDevInst, loc, mod, interfaceTileTraceStartEvent) != XAIE_OK) break; } if (XAie_TraceStopEvent(&aieDevInst, loc, mod, interfaceTileTraceEndEvent) != XAIE_OK)