diff --git a/litex/build/lattice/icestorm.py b/litex/build/lattice/icestorm.py
index 2c45d1e0e..2f959cec9 100644
--- a/litex/build/lattice/icestorm.py
+++ b/litex/build/lattice/icestorm.py
@@ -218,12 +218,10 @@ class LatticeIceStormToolchain:
         self.clocks[clk] = period
 
 def icestorm_args(parser):
-    parser.add_argument("--nextpnr-timingstrict", action="store_true",
-                        help="fail if timing not met, i.e., do NOT pass '--timing-allow-fail' to nextpnr")
-    parser.add_argument("--nextpnr-ignoreloops", action="store_true",
-                        help="ignore combinational loops in timing analysis, i.e. pass '--ignore-loops' to nextpnr")
-    parser.add_argument("--nextpnr-seed", default=1, type=int,
-                        help="seed to pass to nextpnr")
+    toolchain_group = parser.add_argument_group("toolchain")
+    toolchain_group.add_argument("--nextpnr-timingstrict", action="store_true", help="Make the build fail when Timing is not met.")
+    toolchain_group.add_argument("--nextpnr-ignoreloops",  action="store_true", help="Use strict Timing mode (Build will fail when Timings are not met).")
+    toolchain_group.add_argument("--nextpnr-seed",         default=1, type=int, help="Set Nextpnr's seed.")
 
 def icestorm_argdict(args):
     return {
diff --git a/litex/build/lattice/oxide.py b/litex/build/lattice/oxide.py
index f59863937..ba51d177f 100644
--- a/litex/build/lattice/oxide.py
+++ b/litex/build/lattice/oxide.py
@@ -189,18 +189,13 @@ class LatticeOxideToolchain:
             self.false_paths.add((from_, to))
 
 def oxide_args(parser):
-    parser.add_argument("--yosys-nowidelut", action="store_true",
-                        help="pass '-nowidelut' to yosys synth_nexus")
-    parser.add_argument("--yosys-abc9", action="store_true",
-                        help="pass '-abc9' to yosys synth_nexus")
-    parser.add_argument("--nextpnr-timingstrict", action="store_true",
-                        help="fail if timing not met, i.e., do NOT pass '--timing-allow-fail' to nextpnr")
-    parser.add_argument("--nextpnr-ignoreloops", action="store_true",
-                        help="ignore combinational loops in timing analysis, i.e. pass '--ignore-loops' to nextpnr")
-    parser.add_argument("--nextpnr-seed", default=1, type=int,
-                        help="seed to pass to nextpnr")
-    parser.add_argument("--nexus-es-device", action="store_true",
-                        help="device is a ES1 Nexus part")
+    toolchain_group = parser.add_argument_group("toolchain")
+    toolchain_group.add_argument("--yosys-nowidelut",      action="store_true", help="Use Yosys's nowidelut mode.")
+    toolchain_group.add_argument("--yosys-abc9",           action="store_true", help="Use Yosys's abc9 mode.")
+    toolchain_group.add_argument("--nextpnr-timingstrict", action="store_true", help="Use strict Timing mode (Build will fail when Timings are not met).")
+    toolchain_group.add_argument("--nextpnr-ignoreloops",  action="store_true", help="Ignore combinatorial loops in Timing Analysis.")
+    toolchain_group.add_argument("--nextpnr-seed",         default=1, type=int, help="Set Nextpnr's seed.")
+    toolchain_group.add_argument("--nexus-es-device",      action="store_true", help="Use Nexus-ES1 part.")
 
 def oxide_argdict(args):
     return {
diff --git a/litex/build/lattice/radiant.py b/litex/build/lattice/radiant.py
index a5017a565..3ffcba358 100644
--- a/litex/build/lattice/radiant.py
+++ b/litex/build/lattice/radiant.py
@@ -320,8 +320,8 @@ class LatticeRadiantToolchain:
             self.false_paths.add((from_, to))
 
 def radiant_build_args(parser):
-    parser.add_argument("--synth-mode", default="synplify", help="synthesis mode (synplify or yosys).")
-
+    toolchain_group = parser.add_argument_group("toolchain")
+    toolchain_group.add_argument("--synth-mode", default="synplify", help="Synthesis mode (synplify or yosys).")
 
 def radiant_build_argdict(args):
     return {"synth_mode": args.synth_mode}
diff --git a/litex/build/lattice/trellis.py b/litex/build/lattice/trellis.py
index 7775d0c29..b9e6de713 100644
--- a/litex/build/lattice/trellis.py
+++ b/litex/build/lattice/trellis.py
@@ -250,22 +250,15 @@ class LatticeTrellisToolchain:
             self.false_paths.add((from_, to))
 
 def trellis_args(parser):
-    parser.add_argument("--yosys-nowidelut", action="store_true",
-                        help="pass '-nowidelut' to yosys synth_ecp5")
-    parser.add_argument("--yosys-abc9", action="store_true",
-                        help="pass '-abc9' to yosys synth_ecp5")
-    parser.add_argument("--nextpnr-timingstrict", action="store_true",
-                        help="fail if timing not met, i.e., do NOT pass '--timing-allow-fail' to nextpnr")
-    parser.add_argument("--nextpnr-ignoreloops", action="store_true",
-                        help="ignore combinational loops in timing analysis, i.e. pass '--ignore-loops' to nextpnr")
-    parser.add_argument("--ecppack-bootaddr", default=0,
-                        help="Set boot address for next image, i.e. pass '--bootaddr xxx' to ecppack")
-    parser.add_argument("--ecppack-spimode", default=None,
-                        help="Set slave SPI programming mode")
-    parser.add_argument("--ecppack-compress", action="store_true",
-                        help="Compress bitstream to reduce size")
-    parser.add_argument("--nextpnr-seed", default=1, type=int,
-                        help="seed to pass to nextpnr")
+    toolchain_group = parser.add_argument_group("toolchain")
+    toolchain_group.add_argument("--yosys-nowidelut",      action="store_true", help="Use Yosys's nowidelut mode.")
+    toolchain_group.add_argument("--yosys-abc9",           action="store_true", help="Use Yosys's abc9 mode.")
+    toolchain_group.add_argument("--nextpnr-timingstrict", action="store_true", help="Use strict Timing mode (Build will fail when Timings are not met).")
+    toolchain_group.add_argument("--nextpnr-ignoreloops",  action="store_true", help="Ignore combinatorial loops in Timing Analysis.")
+    toolchain_group.add_argument("--nextpnr-seed",         default=1, type=int, help="Set Nextpnr's seed.")
+    toolchain_group.add_argument("--ecppack-bootaddr",     default=0,           help="Set boot address for next image.")
+    toolchain_group.add_argument("--ecppack-spimode",      default=None,        help="Set slave SPI programming mode.")
+    toolchain_group.add_argument("--ecppack-compress",     action="store_true", help="Use Bitstream compression.")
 
 def trellis_argdict(args):
     return {
diff --git a/litex/build/xilinx/vivado.py b/litex/build/xilinx/vivado.py
index 1b63d3c9d..1558df805 100644
--- a/litex/build/xilinx/vivado.py
+++ b/litex/build/xilinx/vivado.py
@@ -391,8 +391,8 @@ class XilinxVivadoToolchain:
             self.false_paths.add((from_, to))
 
 def vivado_build_args(parser):
-    parser.add_argument("--synth-mode", default="vivado", help="synthesis mode (vivado or yosys).")
-
+    toolchain_group = parser.add_argument_group("toolchain")
+    toolchain_group.add_argument("--synth-mode", default="vivado", help="Synthesis mode (vivado or yosys).")
 
 def vivado_build_argdict(args):
     return {"synth_mode": args.synth_mode}