Ich beschäftige mich gerade intensiver mit Timing Constraints.
Bislang waren mir die nicht so recht geheuer und ich habe immer nur das
Notwendigste gemacht, bis es eben lief, aber jetzt wollte ich mich mal
"richtig" einarbeiten (also nicht bloss irgendwie die Ports
"geradebiegen" bis das Design gerade so funzt, sondern ich hatte den
Ehrgeiz, eine simple Config vollständig zu constrainen und das auch noch
zu verstehen).
Verwendet habe ich dazu
http://www.alterawiki.com/uploads/3/3f/TimeQuest_User_Guide.pdf , das
allgemein als schlaue Anleitung für Dummies gilt.
Eine der ersten Regeln, die da drin stehen, ist die Verwendung von
Virtual Clocks für alles, was "draussen" passiert, damit interne und
externe Constraints sich nicht beissen. set_input_delay und
set_output_delay werden dann nur auf diesen Virtual Clocks verwendet.
Seh' ich ein.
also das da hingeschrieben:
1 | set period [expr roundto(1000000.0 / 33000.0, 3)]
|
2 |
|
3 | create_clock -period $period -name CLK_MAIN [get_ports {CLK_MAIN}]
|
4 | create_clock -period $period -name virt_clk_main
|
dann meine Ports definiert:
1 | set flexbus_in_ports [list FB_AD[*] FB_ALE FB_OEn FB_WRn]
|
2 | set flexbus_out_ports [list FB_AD[*] FB_TAn]
|
(wen's interessiert: der Cyclone III hängt an einem FreeScale FlexBus
mit 33 MHz)
Der Bus ist INOUT, deswegen erscheint FB_AD in beiden Listen.
Dann constrained:
1 | foreach in_port $flexbus_in_ports {
|
2 | set_input_delay -clock virt_clk_main -min -0 $in_port
|
3 | set_input_delay -clock virt_clk_main -max 0 $in_port
|
4 | }
|
5 |
|
6 | foreach out_port $flexbus_out_ports {
|
7 | set_output_delay -clock virt_clk_main -min -0 $out_port
|
8 | set_output_delay -clock virt_clk_main -max 0 $out_port
|
9 | }
|
Soweit, so gut. TimeQuest meckert nicht und zunächst sieht der Timing
Report so aus, wie wenn ich direkt überall CLK_MAIN angegeben hätte.
Mit einer Ausnahme (und die will mir nicht in den Kopf):
1 | +-----------------------------------------------------------------------------------------------+
|
2 | ; Slow 1200mV 85C Model Fmax Summary ;
|
3 | +------------+-----------------+---------------+------------------------------------------------+
|
4 | ; Fmax ; Restricted Fmax ; Clock Name ; Note ;
|
5 | +------------+-----------------+---------------+------------------------------------------------+
|
6 | ; 61.66 MHz ; 5.81 MHz ; virt_clk_main ; limit due to minimum period restriction (tmin) ;
|
7 | ; 141.96 MHz ; 141.96 MHz ; CLK_MAIN ; ;
|
8 | +------------+-----------------+---------------+------------------------------------------------+
|
virt_clk_main hat plötzlich ein lächerliches "Restricted Fmax" (und ich
bin eigentlich gewillt, das ernst zu nehmen).
Weiss jemand, wo das herkommt und was ich damit anzufangen (bzw. mir
darunter vorzustellen) habe?
Das passiert nur, wenn ich meinen INOUT Bus constraine und
virt_clk_main verwende. Sobald ich eine Richtung weglasse oder CLK_MAIN
verwende, ist alles wieder gut (das Design läuft übrigens in Hardware so
oder so - mit 33 MHz).