1
0
mirror of https://github.com/YosysHQ/nextpnr.git synced 2026-01-11 23:53:21 +00:00

gatemate: document clock distribution strategies (#1580)

* gatemate: document clock distribution strategies

* gatemate: rename option to strategy
This commit is contained in:
Miodrag Milanović 2025-10-16 10:54:55 +02:00 committed by GitHub
parent f245185da8
commit f19a67122f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -428,6 +428,28 @@ void GateMatePacker::assign_clocks()
} }
} }
/*
Since A2 and A4 (multi-die) devices are composed of multiple A1 dies, and each die has its own
separate set of global clocks, there are several strategies for distributing these clocks:
mirror (default)
Allows up to four clocks. A mirrored PLL and BUFG are instantiated on each die.
This ensures all clocks are available on all dies, but clocks are not phase-synchronized
across dies. As a result, designs may experience timing issues at higher frequencies.
clk1 (experimental)
Most designs use a single global clock. In this mode, the clock is generated on one die,
output through an unused dedicated clock pin, and re-entered as an input on the other dies.
Since global clock inputs are shared between dies, this enables higher-frequency operation
for designs that span multiple dies.
full (experimental)
Intended for designs that need to utilize all available PLLs across all dies.
In this strategy, placement is restricted so that logic using a specific clock
resides only in the die where that clock is available. This generally works well,
though it can be problematic for RAM blocks that may require access to multiple
global clock signals.
*/
void GateMateImpl::pack() void GateMateImpl::pack()
{ {
const ArchArgs &args = ctx->args; const ArchArgs &args = ctx->args;
@ -435,8 +457,8 @@ void GateMateImpl::pack()
parse_ccf(args.options.at("ccf")); parse_ccf(args.options.at("ccf"));
} }
if (args.options.count("multi")) { if (args.options.count("strategy")) {
std::string val = args.options.at("multi"); std::string val = args.options.at("strategy");
if (val == "mirror") { if (val == "mirror") {
strategy = MultiDieStrategy::CLOCK_MIRROR; strategy = MultiDieStrategy::CLOCK_MIRROR;
log_info("Multidie mode: CLOCK MIRROR\n"); log_info("Multidie mode: CLOCK MIRROR\n");
@ -447,7 +469,7 @@ void GateMateImpl::pack()
strategy = MultiDieStrategy::FULL_USE; strategy = MultiDieStrategy::FULL_USE;
log_info("Multidie mode: FULL USE\n"); log_info("Multidie mode: FULL USE\n");
} else { } else {
log_error("Unknown value for 'multi' option. Allowed values are 'mirror', 'full' and 'clk1'.\n"); log_error("Unknown value for 'strategy' option. Allowed values are 'mirror', 'full' and 'clk1'.\n");
} }
} else { } else {
strategy = MultiDieStrategy::CLOCK_MIRROR; strategy = MultiDieStrategy::CLOCK_MIRROR;