Partially Connected 3D NoC
Abhishek Madav (86378148) Suhas Tikoo (22363556)
Saurebh Raut (27481720) Urjit Khadilkar (24449837)
In this paper, we detail the design and implementation of a router for vertically-partially-connected 3D-
NoCs based on stacked 2D-meshes. The project implements open source Access Noxim V0.3 for creating a 3D
NoC and routing algorithms defined to adequately prove the partial implementation.
The Access Noxim is a co-simulation platform for 3D NoC system that couples the network model,
power model and thermal model. The project starts with an implementation of a fully connected NoC and later
invalidating the vertical links for all the diagonal elements in a layer. The process of invalidation stays consistent
throughout the layers and can be certified by shooting flits from a source_id to a specific destination_id such
that the path is across the layers and involve nodes which have their vertical links invalidated as a part of the
BuildMesh() in NoximNoc.cpp.
Step 1: Invalidate the vertical links for all diagonal elements in a layer (i==j)
Also, as a part of the partial implementation, we invalidate the reservation stations linked for the choice of
Step 2: After the mesh has been built, we need to make changes in the Routing Algorithm involved.
To verify the construction of a partially connected NoC, we use the XYZ algorithm, which is bound to fail for
such a partial connection and we certify the failure using the notion that the buffer linked with the nodes
along the path get full and cannot proceed due to invalidated vertical link.
Changing the type of routing involved: (NoximMain.h)
#define DEFAULT_ROUTING_ALGORITHM ROUTING_XYZ
Step 3: To demonstrate the path which cannot send packets through it because of an invalidated link, we set
a source_id and a destination_id for which we shall trace the route taken.
To specify a source_id and a destination_id, we modify the id’s within the trafficRandom() in
Step 4: To enable only the source_id to generate flits, we change the parameters to the canShot() function as
a part of the NoximProcessingElement.cpp by including an additional condition in the if statement.
Step 5: As a part of the debugging, we could trace each flit an its consequent properties in the rxProcess()
within the NoximRouter.cpp. The cout’s help understand the details regarding the received flit.
The process of transmission fails when the buffer associated with the source_id or a local_id along the path
chosen through a vertically invalidated node and to detect the same, we modify the code for routingXYZ() in
NoximRouter.cpp to detect the buffer being full. The check for the same, certifies that the chosen path of
source and destination cannot be completed, which in turn proves of an adequate implementation of the
The function gets called, each time a local_id receives the first body flit. The counter implemented helps us
track the number of buffers full and when it exceeds the default limit, it is safe to say that the path has been
blocked and that “Packet Transmission Failed!”.
The results for a specific test case has been shown:
1) Destination ID – 64 (layer 1)
2) Source ID – 0 (Layer 0)
The route should be stuck according to the implementation since the XYZ algorithm traces a path involving a
node which has its vertical link invalidated.
Similarly, we should be able to route packets through a path which does not involve invalidated vertical links.
Results for one such pair of source and destination can be depicted as:
1) Destination ID – 68 (layer 1)
2) Source ID – 0 (Layer 0)
Intermediate result showing the trace for the route:
Final result shows the sharing of the packets across the layers in the source and destination:
Conclusion: The project has successfully implemented a 3D partially connected NoC with vertical links for all
the diagonal elements invalidated. The test cases show correct results for different paths involving or
exempting the node with vertical link invalidated.