Skip to content
This repository has been archived by the owner on Aug 20, 2024. It is now read-only.

Commit

Permalink
Add --target:fpga flag to prioritize FPGA-friendly compilation
Browse files Browse the repository at this point in the history
* Update name of FPGA flag based on Jack's comment
* Add Scaladoc to describe what each constituent transform does
  • Loading branch information
albert-magyar committed Mar 11, 2021
1 parent 4d3571f commit df5c997
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/main/scala/firrtl/stage/FirrtlCli.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ trait FirrtlCli { this: Shell =>
NoCircuitDedupAnnotation,
WarnNoScalaVersionDeprecation,
PrettyNoExprInlining,
DisableFold
DisableFold,
OptimizeForFPGA
)
.map(_.addOptions(parser))

Expand Down
42 changes: 42 additions & 0 deletions src/main/scala/firrtl/stage/FirrtlCompilerTargets.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// SPDX-License-Identifier: Apache-2.0

package firrtl.stage

import firrtl.transforms._
import firrtl.passes.memlib._
import firrtl.options.{ShellOption, HasShellOptions}

/**
* This flag enables a set of options that guide the FIRRTL compilation flow to ultimately
* generate Verilog that is more amenable to using for synthesized FPGA designs. Currently, this
* flag affects only memories, as the need to emit memories that support downstream inference of
* hardened RAM macros. These options are not intended to be specialized to any particular vendor;
* instead, they aim to emit simple Verilog that more closely reflects traditional human-written
* definitions of synchronous-read memories.
*
* 1) Allow some synchronous-read memories and readwrite ports to pass through VerilogMemDelays
* without introducing explicit pipeline registers or splitting ports.
* 2) Use the SimplifyMems transform to Lower aggregate-typed memories with always-high masks to
* packed memories without splitting.
* 3) Specify that memories with undefined read-under-write behavior should map to emitted
* microarchitectures characteristic of "read-first" ports by default. This eliminates the
* difficulty of inferring a RAM macro that matches the strict semantics of "write-first" ports.
* 4) Enable the InferReadWrite transform to reduce port count, where applicable.
*/
object OptimizeForFPGA extends HasShellOptions {
private val fpgaAnnos = Seq(
InferReadWriteAnnotation,
RunFirrtlTransformAnnotation(new InferReadWrite),
DefaultReadFirstAnnotation,
RunFirrtlTransformAnnotation(new SetDefaultReadUnderWrite),
RunFirrtlTransformAnnotation(new SimplifyMems),
PassthroughSimpleSyncReadMemsAnnotation
)
val options = Seq(
new ShellOption[Unit](
longOption = "target:fpga",
toAnnotationSeq = a => fpgaAnnos,
helpText = "Choose compilation strategies that generally favor FPGA targets",
)
)
}

0 comments on commit df5c997

Please sign in to comment.