aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/tools/scripts/viv_sim_project.tcl
blob: 3e7cb429b2693111a4ae043f49d60bd983ab55ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#
# Copyright 2014 Ettus Research
#

# ---------------------------------------
# Gather all external parameters
# ---------------------------------------
set simulator       $::env(VIV_SIMULATOR)
set design_srcs     $::env(VIV_DESIGN_SRCS)
set sim_srcs        $::env(VIV_SIM_SRCS)
set inc_srcs        $::env(VIV_INC_SRCS)
set sim_top         $::env(VIV_SIM_TOP)
set part_name       $::env(VIV_PART_NAME)
set sim_runtime     $::env(VIV_SIM_RUNTIME)
set sim_fast        $::env(VIV_SIM_FAST)
set vivado_mode     $::env(VIV_MODE)
set verilog_defs    $::env(VIV_VERILOG_DEFS)
set working_dir     [pwd]

set sim_fileset "sim_1"
set project_name "[string tolower $simulator]_proj"

if [info exists ::env(VIV_SIM_COMPLIBDIR) ] {
    set sim_complibdir  $::env(VIV_SIM_COMPLIBDIR)
    if [expr [file isdirectory $sim_complibdir] == 0] {
        set sim_complibdir  ""
    }
} else {
    set sim_complibdir  ""
}
if [expr ([string equal $simulator "XSim"] == 0) && ([string length $sim_complibdir] == 0)] {
    puts "BUILDER: \[ERROR\]: Could not resolve the location for the compiled simulation libraries."
    puts "                  Please build libraries for chosen simulator and set the env or"
    puts "                  makefile variable SIM_COMPLIBDIR to point to the location."
    exit 1
}

# ---------------------------------------
# Vivado Commands
# ---------------------------------------
puts "BUILDER: Creating Vivado simulation project part $part_name"
create_project -part $part_name -force $project_name/$project_name

# Expand directories to include their contents (needed for HLS outputs)
foreach src_file $design_srcs {
    if [expr [file isdirectory $src_file] == 1] {
        puts "BUILDER: Expanding Directory : $src_file"
        set dir_contents [glob $src_file/*.*]
        append design_srcs " " $dir_contents
    }
}

foreach src_file $design_srcs {
    set src_ext [file extension $src_file ]
    if [expr [lsearch {.vhd .vhdl} $src_ext] >= 0] {
        puts "BUILDER: Adding VHDL    : $src_file"
        read_vhdl $src_file
    } elseif [expr [lsearch {.v .vh} $src_ext] >= 0] {
        puts "BUILDER: Adding Verilog : $src_file"
        read_verilog $src_file
    } elseif [expr [lsearch {.sv .svh} $src_ext] >= 0] {
        puts "BUILDER: Adding SVerilog: $src_file"
        read_verilog -sv $src_file
    } elseif [expr [lsearch {.xdc} $src_ext] >= 0] {
        puts "BUILDER: Adding XDC     : $src_file"
        read_xdc $src_file
    } elseif [expr [lsearch {.xci} $src_ext] >= 0] {
        puts "BUILDER: Adding IP      : $src_file"
        read_ip $src_file
    } elseif [expr [lsearch {.ngc .edif} $src_ext] >= 0] {
        puts "BUILDER: Adding Netlist : $src_file"
        read_edif $src_file
    } elseif [expr [lsearch {.dat} $src_ext] >= 0] {
        puts "BUILDER: Adding Data File : $src_file"
        add_files -fileset $sim_fileset -norecurse $src_file
    } elseif [expr [lsearch {.bd} $src_ext] >= 0] {
        puts "BUILDER: Adding Block Diagram: $src_file"
        add_files -norecurse $src_file
    } elseif [expr [lsearch {.bxml} $src_ext] >= 0] {
        puts "BUILDER: Adding Block Diagram XML: $src_file"
        add_files -norecurse $src_file
    } else {
        puts "BUILDER: \[WARNING\] File ignored!!!: $src_file"
    }
}

foreach sim_src $sim_srcs {
    puts "BUILDER: Adding Sim Src : $sim_src"
    add_files -fileset $sim_fileset -norecurse $sim_src
}

foreach inc_src $inc_srcs {
    puts "BUILDER: Adding Inc Src : $inc_src"
    add_files -fileset $sim_fileset -norecurse $inc_src
}

# Simulator independent config
set_property top $sim_top [get_filesets $sim_fileset]
set_property default_lib xil_defaultlib [current_project]
update_compile_order -fileset sim_1 -quiet

# Select the simulator
# WARNING: Do this first before setting simulator specific properties!
set_property target_simulator $simulator [current_project]

# Vivado quirk when passing options to external simulators
if [expr [string equal $simulator "XSim"] == 1] {
    append verilog_defs " WORKING_DIR=\"$working_dir\""
} else {
    append verilog_defs " WORKING_DIR=$working_dir"
}

# Pass Verilog definitions to simulation for all files
set_property verilog_define $verilog_defs [get_filesets $sim_fileset]

# XSim specific settings
set_property xsim.simulate.runtime "${sim_runtime}us" -objects [get_filesets $sim_fileset]
set_property xsim.elaborate.debug_level "all" -objects [get_filesets $sim_fileset]
set_property xsim.elaborate.unifast $sim_fast -objects [get_filesets $sim_fileset]
# Set default timescale to prevent bogus warnings
set_property xsim.elaborate.xelab.more_options -value {-timescale 1ns/1ns} -objects [get_filesets $sim_fileset]

# Modelsim specific settings
if [expr [string equal $simulator "Modelsim"] == 1] {
    set sim_64bit       $::env(VIV_SIM_64BIT)

    set_property compxlib.modelsim_compiled_library_dir $sim_complibdir [current_project]
    # Does not work yet (as of Vivado 2015.2), but will be useful for 32-bit support
    # See: http://www.xilinx.com/support/answers/62210.html
    set_property modelsim.64bit $sim_64bit -objects [get_filesets $sim_fileset]
    set_property modelsim.simulate.runtime "${sim_runtime}ns" -objects [get_filesets $sim_fileset]
    set_property modelsim.elaborate.acc "true" -objects [get_filesets $sim_fileset]
    set_property modelsim.simulate.log_all_signals "true" -objects [get_filesets $sim_fileset]
    set_property modelsim.simulate.vsim.more_options -value "-c" -objects [get_filesets $sim_fileset]
    set_property modelsim.elaborate.unifast $sim_fast -objects [get_filesets $sim_fileset]
    if [info exists ::env(VIV_SIM_USER_DO) ] {
        set_property modelsim.simulate.custom_udo -value "$::env(VIV_SIM_USER_DO)" -objects [get_filesets $sim_fileset]
    }
}

# Launch simulation
launch_simulation

if { [info exists ::env(VIV_SYNTH_TOP)] } {
   puts "BUILDER: Synthesizing"
   # Synthesize requested modules
   foreach synth_top "$::env(VIV_SYNTH_TOP)" {
      set_property top $synth_top [current_fileset]
      synth_design -mode out_of_context
      # Perform a simple regex-based search for all clock signals and constrain
      # them to 500 MHz for the timing report.
      set clk_regexp "(?i)^(?!.*en.*).*(clk|clock).*"
      foreach clk_inst [get_ports -regexp $clk_regexp] {
         create_clock -name $clk_inst -period 2.0 [get_ports $clk_inst]
      }
      report_utilization -no_primitives -file ${working_dir}/${synth_top}_synth.rpt
      report_timing_summary -setup -max_paths 3 -unique_pins -no_header -append -file ${working_dir}/${synth_top}_synth.rpt
      write_checkpoint -force ${working_dir}/${synth_top}_synth.dcp
   }
} else {
   puts "BUILDER: Skipping resource report because VIV_SYNTH_TOP is not set"
}
# Close project
if [string equal $vivado_mode "batch"] {
    puts "BUILDER: Closing project"
    close_project
} else {
    puts "BUILDER: In GUI mode. Leaving project open."
}