Forum Discussion
Altera_Forum
Honored Contributor
11 years agoThanks Rysc. I appreciate your advice.
I did the report and found 6 setup paths. They are from bus_tri_d to my generated virtual clock. slack from node to node launch clock latch clock relat. clock_skew data_delay -20.747 fmrc_i|bus_tri_d|q flash_ce_n not_a_clock Nand_flash_wr_strobe 5.000 0.000 5.597 I noticed when I was writing my SDC constraints for this interface that Timequest was complaining that I had not constrained the bus_tri_d node. For a tristate signal I did not believe this was necessary. Here are my sdc write memory constraints. Is there some not quite right in here that is making Timequest get a bit upset # Read memory access time set tREH_min 10 # Read memory hold time set tREA_max 20 # Create write strobe signal maximum 25MHz but use 50MHz just incase. This is the virtual clock create_generated_clock -name Nand_flash_wr_strobe -source [get_nets {dctu_i|a_uniphy_i|a_uniphy_inst|pll0|afi_phy_clk}] -divide_by 3 [get_ports {flash_we_n}] # Constrain command latch cycle set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -min -5.00 [get_ports {flash_cle}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -max 10.00 [get_ports {flash_cle}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -min -5.00 [get_ports {flash_ce_n}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -max 20.00 [get_ports {flash_ce_n}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -min -5.00 [get_ports {flash_ale}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -max 10.00 [get_ports {flash_ale}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -min -5.00 [get_ports {flash_wp_n}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -max 10.00 [get_ports {flash_wp_n}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -min -5.00 [get_ports {flash_data[*]}] set_output_delay -add_delay -clock { Nand_flash_wr_strobe} -max 10.00 [get_ports {flash_data[*]}] set_multicycle_path -from [get_clocks {dctu_i|a_uniphy_i|a_uniphy_inst|pll0|pll_afi_clk}] -to [get_clocks {Nand_flash_wr_strobe}] -setup -end 6 set_multicycle_path -from [get_clocks {dctu_i|a_uniphy_i|a_uniphy_inst|pll0|pll_afi_clk}] -to [get_clocks {Nand_flash_wr_strobe}] -hold -end 5 # set false path on tri-state enable and cut timing paths between bi-dir pads that don't require timing now set_false_path -from {fmrc:fmrc_i|bus_tri_d*} -to {flash_*} set_false_path -from [get_clocks {Nand_flash_wr_strobe}] -to [get_clocks {dctu_i|a_uniphy_i|a_uniphy_inst|pll0|pll_afi_clk}] Essentially what I am doing here is creating a virtual clock that represents the write strobe signal that clocks in the data to the NAND flash device. I then create setup and hold constraints for the signals that are sampled by the write strobe line. I also add a multicycle constraint to open up the size of the timing window. I finally do some cutting on some paths. You can see I have cut the path between bus_tri_d and all flash signals. Below is what my verilog looks like //tristate flash bus signals when not in use assign flash_cle = (bus_tri_d) ? 1'bz : cle_d; assign flash_ale = (bus_tri_d) ? 1'bz : ale_d; assign flash_ce_n = (bus_tri_d) ? 1'bz : ce_n_d; assign flash_we_n = (bus_tri_d) ? 1'bz : we_n_d; assign flash_re_n = (bus_tri_d) ? 1'bz : re_n_d; Any guidance you can provide would be most appreciated C