272 lines
8.8 KiB
Tcl
272 lines
8.8 KiB
Tcl
# Test Sim.cc logic simulation, clock network queries, Genclks.cc,
|
|
# ClkNetwork.cc, various Sta.cc clock/timing query functions.
|
|
# Targets: Sim.cc findLogicConstants, clearLogicConstants,
|
|
# simLogicValue, setCaseAnalysis/removeCaseAnalysis incremental,
|
|
# setLogicValue/removeLogicValue,
|
|
# Sta.cc isClock, isIdealClock, isPropagatedClock,
|
|
# clocks(pin), clockDomains, clkPinsInvalid,
|
|
# ensureClkArrivals, ensureClkNetwork,
|
|
# findClkMinPeriod, findClkDelays,
|
|
# ClkNetwork.cc clock pin queries,
|
|
# Genclks.cc updateGeneratedClks,
|
|
# Levelize.cc levelize, graphLoops,
|
|
# vertexLevel, maxPathCountVertex
|
|
source ../../test/helpers.tcl
|
|
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog search_gated_clk.v
|
|
link_design search_gated_clk
|
|
|
|
create_clock -name clk -period 10 [get_ports clk]
|
|
set_input_delay -clock clk 1.0 [get_ports en]
|
|
set_input_delay -clock clk 1.0 [get_ports in1]
|
|
set_output_delay -clock clk 2.0 [get_ports out1]
|
|
|
|
# Baseline
|
|
report_checks -path_delay max > /dev/null
|
|
|
|
############################################################
|
|
# isClock queries
|
|
############################################################
|
|
puts "--- isClock queries ---"
|
|
catch {
|
|
set clk_pin_is_clk [sta::is_clock [get_ports clk]]
|
|
puts "clk port is_clock: $clk_pin_is_clk"
|
|
}
|
|
catch {
|
|
set in1_is_clk [sta::is_clock [get_ports in1]]
|
|
puts "in1 port is_clock: $in1_is_clk"
|
|
}
|
|
puts "PASS: isClock"
|
|
|
|
############################################################
|
|
# isIdealClock / isPropagatedClock
|
|
############################################################
|
|
puts "--- ideal/propagated clock queries ---"
|
|
catch {
|
|
puts "clk isIdealClock: [sta::is_ideal_clock [get_ports clk]]"
|
|
puts "clk isPropagatedClock: [sta::is_propagated_clock [get_ports clk]]"
|
|
}
|
|
set_propagated_clock [get_clocks clk]
|
|
catch {
|
|
puts "after propagate - clk isIdealClock: [sta::is_ideal_clock [get_ports clk]]"
|
|
puts "after propagate - clk isPropagatedClock: [sta::is_propagated_clock [get_ports clk]]"
|
|
}
|
|
unset_propagated_clock [get_clocks clk]
|
|
puts "PASS: ideal/propagated clock"
|
|
|
|
############################################################
|
|
# Logic simulation values
|
|
############################################################
|
|
puts "--- sim logic values ---"
|
|
set sv_en [sta::pin_sim_logic_value [get_pins clk_gate/A2]]
|
|
set sv_clk [sta::pin_sim_logic_value [get_pins clk_gate/A1]]
|
|
set sv_gated [sta::pin_sim_logic_value [get_pins clk_gate/ZN]]
|
|
set sv_buf1 [sta::pin_sim_logic_value [get_pins buf1/Z]]
|
|
set sv_reg1_d [sta::pin_sim_logic_value [get_pins reg1/D]]
|
|
puts "en=$sv_en clk_gate_a1=$sv_clk gated=$sv_gated buf1=$sv_buf1 reg1/D=$sv_reg1_d"
|
|
puts "PASS: sim logic values"
|
|
|
|
############################################################
|
|
# Case analysis and logic simulation
|
|
############################################################
|
|
puts "--- case analysis 0 on en ---"
|
|
set_case_analysis 0 [get_ports en]
|
|
set sv_gated_0 [sta::pin_sim_logic_value [get_pins clk_gate/ZN]]
|
|
puts "en=0: gated_clk=$sv_gated_0"
|
|
report_checks -path_delay max
|
|
unset_case_analysis [get_ports en]
|
|
puts "PASS: case_analysis 0 en"
|
|
|
|
puts "--- case analysis 1 on en ---"
|
|
set_case_analysis 1 [get_ports en]
|
|
set sv_gated_1 [sta::pin_sim_logic_value [get_pins clk_gate/ZN]]
|
|
puts "en=1: gated_clk=$sv_gated_1"
|
|
report_checks -path_delay max
|
|
unset_case_analysis [get_ports en]
|
|
puts "PASS: case_analysis 1 en"
|
|
|
|
puts "--- case analysis rising on en ---"
|
|
set_case_analysis rising [get_ports en]
|
|
report_checks -path_delay max
|
|
unset_case_analysis [get_ports en]
|
|
puts "PASS: case_analysis rising en"
|
|
|
|
puts "--- case analysis falling on en ---"
|
|
set_case_analysis falling [get_ports en]
|
|
report_checks -path_delay max
|
|
unset_case_analysis [get_ports en]
|
|
puts "PASS: case_analysis falling en"
|
|
|
|
############################################################
|
|
# set_logic_one/zero
|
|
############################################################
|
|
puts "--- set_logic_zero ---"
|
|
set_logic_zero [get_ports in1]
|
|
set sv_buf_z [sta::pin_sim_logic_value [get_pins buf1/Z]]
|
|
puts "in1=0: buf1/Z=$sv_buf_z"
|
|
report_checks -path_delay max
|
|
puts "PASS: logic_zero"
|
|
|
|
puts "--- set_logic_one ---"
|
|
set_logic_one [get_ports en]
|
|
set sv_en_1 [sta::pin_sim_logic_value [get_pins clk_gate/A2]]
|
|
puts "en=1: clk_gate/A2=$sv_en_1"
|
|
report_checks -path_delay max
|
|
puts "PASS: logic_one"
|
|
|
|
############################################################
|
|
# findLogicConstants / clearLogicConstants
|
|
############################################################
|
|
puts "--- findLogicConstants ---"
|
|
catch { sta::find_logic_constants }
|
|
puts "PASS: findLogicConstants"
|
|
|
|
puts "--- clearLogicConstants ---"
|
|
catch { sta::clear_logic_constants }
|
|
puts "PASS: clearLogicConstants"
|
|
|
|
############################################################
|
|
# Levelize and graph queries
|
|
############################################################
|
|
puts "--- levelize ---"
|
|
sta::levelize
|
|
puts "PASS: levelize"
|
|
|
|
puts "--- graphLoops ---"
|
|
catch {
|
|
set loops [sta::graph_loop_count]
|
|
puts "Graph loops: $loops"
|
|
}
|
|
puts "PASS: graphLoops"
|
|
|
|
puts "--- max_path_count_vertex ---"
|
|
catch {
|
|
set maxv [sta::max_path_count_vertex]
|
|
if { $maxv != "NULL" } {
|
|
puts "max_path_count vertex: [get_full_name [$maxv pin]]"
|
|
puts " path_count: [sta::vertex_path_count $maxv]"
|
|
puts " level: [sta::vertex_level $maxv]"
|
|
}
|
|
}
|
|
puts "PASS: max_path_count_vertex"
|
|
|
|
############################################################
|
|
# Generated clock (exercises Genclks.cc)
|
|
############################################################
|
|
puts "--- generated clock ---"
|
|
create_generated_clock -name gclk -source [get_ports clk] -divide_by 2 [get_pins reg1/Q]
|
|
report_checks -path_delay max
|
|
report_checks -path_delay min
|
|
puts "PASS: generated clock"
|
|
|
|
puts "--- report_clock_properties with genclk ---"
|
|
report_clock_properties
|
|
puts "PASS: clock properties with genclk"
|
|
|
|
puts "--- clock skew with genclk ---"
|
|
report_clock_skew -setup
|
|
report_clock_skew -hold
|
|
puts "PASS: clock skew genclk"
|
|
|
|
############################################################
|
|
# Clock min period
|
|
############################################################
|
|
puts "--- clock min period ---"
|
|
report_clock_min_period
|
|
catch {
|
|
report_clock_min_period -include_port_paths
|
|
}
|
|
puts "PASS: clock min period"
|
|
|
|
############################################################
|
|
# Clock latency reporting
|
|
############################################################
|
|
puts "--- clock latency report ---"
|
|
set_propagated_clock [get_clocks clk]
|
|
report_clock_latency
|
|
catch {
|
|
report_clock_latency -include_internal_latency
|
|
}
|
|
report_clock_latency -digits 6
|
|
unset_propagated_clock [get_clocks clk]
|
|
puts "PASS: clock latency report"
|
|
|
|
############################################################
|
|
# find_timing_paths for different clk domains
|
|
############################################################
|
|
puts "--- find_timing_paths for clock groups ---"
|
|
set paths [find_timing_paths -path_delay max -endpoint_path_count 5 -group_path_count 10]
|
|
puts "Max paths: [llength $paths]"
|
|
foreach pe $paths {
|
|
puts " pin=[get_full_name [$pe pin]] slack=[$pe slack]"
|
|
}
|
|
puts "PASS: timing paths"
|
|
|
|
############################################################
|
|
# report_checks with -through for clock gate
|
|
############################################################
|
|
puts "--- report_checks through clock gate ---"
|
|
report_checks -through [get_pins clk_gate/ZN] -path_delay max
|
|
report_checks -through [get_pins clk_gate/ZN] -path_delay min
|
|
puts "PASS: through clock gate"
|
|
|
|
############################################################
|
|
# Various bidirectional/tristate enable flags
|
|
############################################################
|
|
puts "--- bidirect inst paths ---"
|
|
catch {
|
|
sta::set_bidirect_inst_paths_enabled 1
|
|
report_checks -path_delay max
|
|
sta::set_bidirect_inst_paths_enabled 0
|
|
report_checks -path_delay max
|
|
}
|
|
puts "PASS: bidirect inst paths"
|
|
|
|
puts "--- bidirect net paths ---"
|
|
catch {
|
|
sta::set_bidirect_net_paths_enabled 1
|
|
report_checks -path_delay max
|
|
sta::set_bidirect_net_paths_enabled 0
|
|
report_checks -path_delay max
|
|
}
|
|
puts "PASS: bidirect net paths"
|
|
|
|
puts "--- clk thru tristate ---"
|
|
catch {
|
|
sta::set_clk_thru_tristate_enabled 1
|
|
report_checks -path_delay max
|
|
sta::set_clk_thru_tristate_enabled 0
|
|
report_checks -path_delay max
|
|
}
|
|
puts "PASS: clk thru tristate"
|
|
|
|
puts "--- dynamic loop breaking ---"
|
|
catch {
|
|
sta::set_dynamic_loop_breaking 1
|
|
report_checks -path_delay max
|
|
sta::set_dynamic_loop_breaking 0
|
|
report_checks -path_delay max
|
|
}
|
|
puts "PASS: dynamic loop breaking"
|
|
|
|
puts "--- use default arrival clock ---"
|
|
catch {
|
|
sta::set_use_default_arrival_clock 1
|
|
report_checks -path_delay max
|
|
sta::set_use_default_arrival_clock 0
|
|
report_checks -path_delay max
|
|
}
|
|
puts "PASS: use default arrival clock"
|
|
|
|
puts "--- propagate all clocks ---"
|
|
catch {
|
|
sta::set_propagate_all_clocks 1
|
|
report_checks -path_delay max
|
|
sta::set_propagate_all_clocks 0
|
|
report_checks -path_delay max
|
|
}
|
|
puts "PASS: propagate all clocks"
|
|
|
|
puts "ALL PASSED"
|