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:
parent
f245185da8
commit
f19a67122f
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user