Running Exact Mode Simulations
In this section, we provide a step-by-step tutorial on how to partition a RocketTile out from the SoC and run exact-mode simulations on EC1 F1. Similar steps can be applied to perform locally partitioned FPGA simulations. This assumes that you have read the FireAxe running fast-mode simulations.
Building Partitioned Sims: Setting up FireAxe Target configs
Section titled “Building Partitioned Sims: Setting up FireAxe Target configs”We will be reusing the FireAxe target configurations from fast-mode.
//////////////////////////////////////////////////////////////////////////////// - F1 partition a RocketTile out// - Connect FPGAs using PCIe peer to peer communication scheme//// FPGA 0 (RocketTile) ----------- FPGA 1 (SoC subsystem)//////////////////////////////////////////////////////////////////////////////class RocketTileF1Config extends Config( new WithPCIM ++ // Use PCIM (PCIe peer to peer) communication scheme // WithPartitionGlobalInfo takes in a Seq of Seq // The inner Seq specifies the list of modules that should be grouped together in a single partition. // The outer Seq specifies the list of partition groups. // Each partition group is mapped onto a separate FPGA. new WithPartitionGlobalInfo( Seq( Seq("RocketTile") ) ) ++ new BaseF1Config )
class RocketTileF1PCIMBase extends Config( new WithPartitionBase ++ // Base partition (SoC subsystem) new RocketTileF1Config )
class RocketTileF1PCIMPartition0 extends Config( new WithPartitionIndex(0) ++ // Partition 0 containing the partitioned RocketTile new RocketTileF1Config )Building Partitioned Sims: config_build_recipes.yaml
Section titled “Building Partitioned Sims: config_build_recipes.yaml”We can specify the config_build_recipes.yaml at this point. One thing to note is
that we added the ExactMode_ in the PLATFORM_CONFIG field. This indicates to the
FireAxe compiler to perform additional steps while partitioning so that the target
behavior can be simulated in a cycle-exact manner.
################################################################################################# Exact-mode : pull out a RocketTile out from your SoC################################################################################################# f2_firesim_rocket_soc_exact:# ...# PLATFORM: f2# TARGET_CONFIG: FireSimRocketConfig# PLATFORM_CONFIG: ExactMode_RocketTileF1PCIMBase# bit_builder_recipe: bit-builder-recipes/f2.yaml# ...## f2_firesim_rocket_tile_exact:# ...# PLATFORM: f2# TARGET_CONFIG: FireSimRocketConfig# PLATFORM_CONFIG: ExactMode_RocketTileF1PCIMPartition0# bit_builder_recipe: bit-builder-recipes/f2.yaml# ...Running Partitioned Simulations: user_topology.py
Section titled “Running Partitioned Simulations: user_topology.py”Again, we have to specify the deploy/runtools/user_topology.py to run FireAxe simulations.
def fireaxe_rocket_exactmode_config(self) -> None: hwdb_entries = { 0: "f1_firesim_rocket_tile_exact", 1: "f1_firesim_rocket_soc_exact", } slotid_to_pidx = [0, 1] edges = [ # DOC include start: fireaxe_rocket_exactmode_config edge 0 FireAxeEdge(FireAxeNodeBridgePair(0, 0), FireAxeNodeBridgePair(1, 0)), # DOC include end: fireaxe_rocket_exactmode_config edge 0 # DOC include start: fireaxe_rocket_exactmode_config edge 1 FireAxeEdge(FireAxeNodeBridgePair(0, 1), FireAxeNodeBridgePair(1, 1)), # DOC include end: fireaxe_rocket_exactmode_config edge 1 ] # DOC include start: fireaxe_rocket_exactmode_config mode mode = PartitionMode.EXACT_MODE # DOC include end: fireaxe_rocket_exactmode_config mode self.fireaxe_topology_config(hwdb_entries, edges, slotid_to_pidx, mode)We should go over a couple of changes that are made compared to the fast-mode configuration.
First of all the FireAxe topology specified by edges has changed. This is because in
the exact-mode, the compiler has to generate multiple communication channels (or edges)
in between the partitions in order to model combinational logic correctly.
The partitioning topology now looks like this:
The upper edge connecting partition 0’s bridge 0 to partition 1’s bridge 0 can be described like this:
FireAxeEdge(FireAxeNodeBridgePair(0, 0), FireAxeNodeBridgePair(1, 0)),The lower edge connecting partition 0’s bridge 1 to partition 1’s bridge 1 can be described like this:
FireAxeEdge(FireAxeNodeBridgePair(0, 1), FireAxeNodeBridgePair(1, 1)),We also changed the partition mode to EXACT_MODE:
mode = PartitionMode.EXACT_MODERunning Partitioned Simulations: config_runtime.yaml
Section titled “Running Partitioned Simulations: config_runtime.yaml”Now we can update config_runtime.yaml to run FireAxe simulations.
target_config: topology: fireaxe_rocket_exactmode_config
