@@ -29,11 +29,11 @@ set_driving_cell [all_inputs] -lib_cell sg13g2_IOPadOut16mA -pin pad
2929# #################
3030puts " Clocks..."
3131
32- # We target 80 MHz
33- set TCK_SYS 12.5
32+ # We target 100 MHz
33+ set TCK_SYS 10.0
3434create_clock -name clk_sys -period $TCK_SYS [get_ports clk_i]
3535
36- set TCK_JTG 20 .0
36+ set TCK_JTG 25 .0
3737create_clock -name clk_jtg -period $TCK_JTG [get_ports jtag_tck_i]
3838
3939set TCK_RTC 50.0
@@ -45,7 +45,9 @@ create_clock -name clk_rtc -period $TCK_RTC [get_ports ref_clk_i]
4545# #################################
4646
4747# Define which clocks are asynchronous to each other
48- # -allow_paths re-activates timing checks between asyncs -> we must constrain CDCs!
48+ # If you have added a clock it is a good idea to temporarily add -allow_paths.
49+ # This means the paths between clocks (CDC) are timed and will show up as violations,
50+ # making them very easy to find and write constraints for.
4951set_clock_groups -asynchronous -name clk_groups_async \
5052 -group {clk_rtc} \
5153 -group {clk_jtg} \
@@ -62,17 +64,17 @@ set_clock_transition 0.2 [all_clocks]
6264# ###################
6365puts " CDC/Sync..."
6466
65- # Clock Domain Crossings: paths going from a FF with one clock to an FF with another another)
66- # to increase the metastability-recovery window we do not wants any additional delays in these paths
67- # so we deactivate the hold checking (as it may add buffers)
67+ # Clock Domain Crossings: paths going from an FF with one clock to an FF with another.
68+ # The setup/hold checks on these paths are deactivated by set_clock_groups -asynchronous.
69+ # An additional requirement is that the max delay is below min($TCK_SYS, $TCK_JTG)
70+ # to make sure any change propages within one cycle of either clock.
71+ # An (optional) lower delay is better for metastability recovery -> 3ns as a reasonable goal
6872
69- # Constrain `cdc_2phase` for DMI request
70- set_false_path -hold -through $JTAG_ASYNC_REQ
71- set_max_delay [expr $TCK_SYS * 0.35] -through $JTAG_ASYNC_REQ -ignore_clock_latency
73+ # # Constrain `cdc_2phase` for DMI request
74+ set_max_delay 3.0 -from $JTAG_ASYNC_REQ_START -to $JTAG_ASYNC_REQ_END -ignore_clock_latency
7275
7376# Constrain `cdc_2phase` for DMI response
74- set_false_path -hold -through $JTAG_ASYNC_RSP
75- set_max_delay [expr $TCK_SYS * 0.35] -through $JTAG_ASYNC_RSP -ignore_clock_latency
77+ set_max_delay 3.0 -from $JTAG_ASYNC_RSP_START -to $JTAG_ASYNC_RSP_END -ignore_clock_latency
7678
7779
7880# ############
@@ -91,10 +93,10 @@ set_max_delay $TCK_SYS -from [get_ports rst_ni]
9193# #########
9294puts " JTAG..."
9395
94- set_input_delay -min -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.10 ] [get_ports {jtag_tdi_i jtag_tms_i}]
95- set_input_delay -max -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.50 ] [get_ports {jtag_tdi_i jtag_tms_i}]
96- set_output_delay -min -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.10 / 2 ] [get_ports jtag_tdo_o]
97- set_output_delay -max -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.50 / 2 ] [get_ports jtag_tdo_o]
96+ set_input_delay -min -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.10 ] [get_ports {jtag_tdi_i jtag_tms_i}]
97+ set_input_delay -max -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.30 ] [get_ports {jtag_tdi_i jtag_tms_i}]
98+ set_output_delay -min -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.10 ] [get_ports jtag_tdo_o]
99+ set_output_delay -max -add_delay -clock clk_jtg [ expr $TCK_JTG * 0.30 ] [get_ports jtag_tdo_o]
98100
99101# Reset should propagate to system domain within a clock cycle.
100102set_input_delay -max [ expr $TCK_JTG * 0.10 ] [get_ports jtag_trst_ni]
@@ -110,8 +112,12 @@ puts "GPIO..."
110112set_input_delay -min -add_delay -clock clk_sys [ expr $TCK_SYS * 0.10 ] [get_ports {gpio* fetch_en_i}]
111113set_input_delay -max -add_delay -clock clk_sys [ expr $TCK_SYS * 0.30 ] [get_ports {gpio* fetch_en_i}]
112114
113- set_output_delay -min -add_delay -clock clk_sys [ expr $TCK_SYS * 0.10 ] [get_ports {status_o gpio*}]
114- set_output_delay -max -add_delay -clock clk_sys [ expr $TCK_SYS * 0.30 ] [get_ports {status_o gpio*}]
115+ set_output_delay -min -add_delay -clock clk_sys [ expr $TCK_SYS * 0.10 ] [get_ports {gpio*}]
116+ set_output_delay -max -add_delay -clock clk_sys [ expr $TCK_SYS * 0.30 ] [get_ports {gpio*}]
117+
118+ # The timing of these signals are not important but we want to keep them in-cycle
119+ set_output_delay -min -add_delay -clock clk_sys [ expr $TCK_SYS * 0.10 ] [get_ports {status_o unused*}]
120+ set_output_delay -max -add_delay -clock clk_sys [ expr $TCK_SYS * 0.10 ] [get_ports {status_o unused*}]
115121
116122
117123# #########
0 commit comments