I've just discovered the joy of using Vivado in 'tcl mode" or "non-project mode" to build a project where I am trying different things, and just want to find utilization and timing.
In my source directory I run (well, actually just hit up arrow and hit enter):
(cd ../vivado; echo source build.tcl | vivado -mode tcl | tee /tmp/log)
And in the ../vivado directory I have the 'build.tcl' script:
set_part "xc7a35tcpg236-1"
# read all design files
read_vhdl ../src/sign_extender.vhd
read_vhdl ../src/data_bus_mux_a.vhd
read_vhdl ../src/decode.vhd
read_vhdl ../src/data_bus_mux_b.vhd
read_vhdl ../src/program_counter.vhd
read_vhdl ../src/station_alu.vhd
read_vhdl ../src/result_bus_mux.vhd
read_vhdl ../src/ram.vhd
read_vhdl ../src/station_test.vhd
read_vhdl ../src/top_level.vhd
read_vhdl ../src/riscv_cpu.vhd
read_vhdl ../src/register_file.vhd
read_vhdl ../src/branch_test.vhd
read_vhdl ../src/station_shifter.vhd
read_vhdl ../src/program_memory.vhd
# read constraints
read_xdc ../src/cmod_a7.xdc
# Synthesize Design
synth_design -top top_level -part "xc7a35tcpg236-1" -flatten_hierarchy none
# Opt Design
opt_design
# Place Design
place_design
# Route Design
route_design
report_timing -nworst 1
report_utilization -hierarchical
# Write out bitfile
## write_bitstream -force my_proj.bit
A million lines of stuff scrolls past, and a short while later I get the worst timing, the path details and the utilization appear in the terminal window, without having to click on anything or navigate anywhere:
...
Timing Report
Slack (MET) : 0.174ns (required time - arrival time)
Source: i_program_memory/instr_reg_reg/CLKARDCLK
(rising edge-triggered cell RAMB36E1 clocked by clk_pin {rise@0.000ns fall@6.900ns period=13.800ns})
Destination: i_program_memory/instr_reg_reg/RSTRAMARSTRAM
(rising edge-triggered cell RAMB36E1 clocked by clk_pin {rise@0.000ns fall@6.900ns period=13.800ns})
Path Group: clk_pin
Path Type: Setup (Max at Slow Process Corner)
Requirement: 13.800ns (clk_pin rise@13.800ns - clk_pin rise@0.000ns)
Data Path Delay: 13.231ns (logic 6.302ns (47.629%) route 6.929ns (52.371%))
Logic Levels: 18 (CARRY4=9 LUT2=2 LUT4=1 LUT5=1 LUT6=4 RAMD32=1)
Clock Path Skew: 0.000ns (DCD - SCD + CPR)
Destination Clock Delay (DCD): 4.848ns = ( 18.648 - 13.800 )
Source Clock Delay (SCD): 5.145ns
Clock Pessimism Removal (CPR): 0.297ns
Clock Uncertainty: 0.035ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
Total System Jitter (TSJ): 0.071ns
Total Input Jitter (TIJ): 0.000ns
Discrete Jitter (DJ): 0.000ns
Phase Error (PE): 0.000ns
Location Delay type Incr(ns) Path(ns) Netlist Resource(s)
------------------------------------------------------------------- -------------------
(clock clk_pin rise edge) 0.000 0.000 r
L17 0.000 0.000 r clk (IN)
net (fo=0) 0.000 0.000 clk
L17 IBUF (Prop_ibuf_I_O) 1.476 1.476 r clk_IBUF_inst/O
net (fo=1, routed) 1.972 3.448 clk_IBUF
BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.096 3.544 r clk_IBUF_BUFG_inst/O
net (fo=213, routed) 1.602 5.145 i_program_memory/clk
RAMB36_X1Y3 RAMB36E1 r i_program_memory/instr_reg_reg/CLKARDCLK
------------------------------------------------------------------- -------------------
RAMB36_X1Y3 RAMB36E1 (Prop_ramb36e1_CLKARDCLK_DOADO[1])
2.454 7.599 f i_program_memory/instr_reg_reg/DOADO[1]
net (fo=16, routed) 1.205 8.804 i_riscv_cpu/i_decoder/instr[1]
SLICE_X49Y14 LUT6 (Prop_lut6_I0_O) 0.124 8.928 f i_riscv_cpu/i_decoder/out_immed[30]_INST_0_i_1/O
net (fo=43, routed) 0.354 9.282 i_riscv_cpu/i_decoder/out_immed[30]_INST_0_i_1_n_0
SLICE_X49Y14 LUT2 (Prop_lut2_I1_O) 0.124 9.406 r i_riscv_cpu/i_decoder/out_reg_a[0]_INST_0/O
net (fo=36, routed) 1.061 10.467 i_riscv_cpu/i_register_file/registers_1_reg_0_31_0_5/ADDRA0
SLICE_X50Y14 RAMD32 (Prop_ramd32_RADR0_O)
0.150 10.617 r i_riscv_cpu/i_register_file/registers_1_reg_0_31_0_5/RAMA/O
net (fo=10, routed) 0.816 11.433 i_riscv_cpu/reg_read_data_a[0]
SLICE_X48Y12 LUT2 (Prop_lut2_I0_O) 0.328 11.761 r i_riscv_cpu/ram_addr[0]_INST_0_i_4/O
net (fo=1, routed) 0.000 11.761 i_riscv_cpu/ram_addr[0]_INST_0_i_4_n_0
SLICE_X48Y12 CARRY4 (Prop_carry4_S[0]_CO[3])
0.532 12.293 r i_riscv_cpu/ram_addr[0]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.293 i_riscv_cpu/ram_addr[0]_INST_0_n_0
SLICE_X48Y13 CARRY4 (Prop_carry4_CI_CO[3])
0.114 12.407 r i_riscv_cpu/ram_addr[4]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.407 i_riscv_cpu/ram_addr[4]_INST_0_n_0
SLICE_X48Y14 CARRY4 (Prop_carry4_CI_CO[3])
0.114 12.521 r i_riscv_cpu/ram_addr[8]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.521 i_riscv_cpu/ram_addr[8]_INST_0_n_0
SLICE_X48Y15 CARRY4 (Prop_carry4_CI_CO[3])
0.114 12.635 r i_riscv_cpu/ram_addr[12]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.635 i_riscv_cpu/ram_addr[12]_INST_0_n_0
SLICE_X48Y16 CARRY4 (Prop_carry4_CI_CO[3])
0.114 12.749 r i_riscv_cpu/ram_addr[16]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.749 i_riscv_cpu/ram_addr[16]_INST_0_n_0
SLICE_X48Y17 CARRY4 (Prop_carry4_CI_CO[3])
0.114 12.863 r i_riscv_cpu/ram_addr[20]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.863 i_riscv_cpu/ram_addr[20]_INST_0_n_0
SLICE_X48Y18 CARRY4 (Prop_carry4_CI_CO[3])
0.114 12.977 r i_riscv_cpu/ram_addr[24]_INST_0/CO[3]
net (fo=1, routed) 0.000 12.977 i_riscv_cpu/ram_addr[24]_INST_0_n_0
SLICE_X48Y19 CARRY4 (Prop_carry4_CI_O[1])
0.348 13.325 r i_riscv_cpu/ram_addr[28]_INST_0/O[1]
net (fo=2, routed) 0.557 13.882 i_ram/ram_addr[29]
SLICE_X49Y17 LUT6 (Prop_lut6_I2_O) 0.303 14.185 r i_ram/busy_INST_0_i_4/O
net (fo=1, routed) 0.000 14.185 i_ram/busy_INST_0_i_4_n_0
SLICE_X49Y17 CARRY4 (Prop_carry4_S[1]_CO[2])
0.570 14.755 r i_ram/busy_INST_0_i_1/CO[2]
net (fo=1, routed) 0.532 15.286 i_ram/busy21_in
SLICE_X44Y17 LUT4 (Prop_lut4_I3_O) 0.313 15.599 r i_ram/busy_INST_0/O
net (fo=62, routed) 0.403 16.002 i_riscv_cpu/i_program_counter/p_0_in
SLICE_X44Y16 LUT6 (Prop_lut6_I1_O) 0.124 16.126 r i_riscv_cpu/i_program_counter/pc_next[18]_INST_0/O
net (fo=1, routed) 0.808 16.934 i_program_memory/pc_next[18]
SLICE_X44Y17 LUT6 (Prop_lut6_I0_O) 0.124 17.058 r i_program_memory/instr_reg_reg_i_2/O
net (fo=1, routed) 0.573 17.631 i_program_memory/instr_reg_reg_i_2_n_0
SLICE_X45Y19 LUT5 (Prop_lut5_I0_O) 0.124 17.755 r i_program_memory/instr_reg_reg_i_1/O
net (fo=1, routed) 0.622 18.377 i_program_memory/instr_reg_reg_i_1_n_0
RAMB36_X1Y3 RAMB36E1 r i_program_memory/instr_reg_reg/RSTRAMARSTRAM
------------------------------------------------------------------- -------------------
(clock clk_pin rise edge) 13.800 13.800 r
L17 0.000 13.800 r clk (IN)
net (fo=0) 0.000 13.800 clk
L17 IBUF (Prop_ibuf_I_O) 1.406 15.206 r clk_IBUF_inst/O
net (fo=1, routed) 1.868 17.074 clk_IBUF
BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 17.165 r clk_IBUF_BUFG_inst/O
net (fo=213, routed) 1.484 18.648 i_program_memory/clk
RAMB36_X1Y3 RAMB36E1 r i_program_memory/instr_reg_reg/CLKARDCLK
clock pessimism 0.297 18.945
clock uncertainty -0.035 18.910
RAMB36_X1Y3 RAMB36E1 (Setup_ramb36e1_CLKARDCLK_RSTRAMARSTRAM)
-0.359 18.551 i_program_memory/instr_reg_reg
-------------------------------------------------------------------
required time 18.551
arrival time -18.377
-------------------------------------------------------------------
slack 0.174
# report_utilization -hierarchical
Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.
------------------------------------------------------------------------------------
| Tool Version : Vivado v.2019.2 (lin64) Build 2708876 Wed Nov 6 21:39:14 MST 2019
| Date : Sun Dec 29 21:04:14 2019
| Host : hamster-nuc running 64-bit Ubuntu 16.04.6 LTS
| Command : report_utilization -hierarchical
| Design : top_level
| Device : 7a35tcpg236-1
| Design State : Routed
------------------------------------------------------------------------------------
Utilization Design Information
Table of Contents
-----------------
1. Utilization by Hierarchy
1. Utilization by Hierarchy
---------------------------
+-----------------------+-----------------+------------+------------+---------+------+-----+--------+--------+--------------+
| Instance | Module | Total LUTs | Logic LUTs | LUTRAMs | SRLs | FFs | RAMB36 | RAMB18 | DSP48 Blocks |
+-----------------------+-----------------+------------+------------+---------+------+-----+--------+--------+--------------+
| top_level | (top) | 813 | 740 | 72 | 1 | 65 | 2 | 0 | 0 |
| (top_level) | (top) | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| i_program_memory | program_memory | 4 | 4 | 0 | 0 | 0 | 1 | 0 | 0 |
| i_ram | ram | 56 | 56 | 0 | 0 | 33 | 1 | 0 | 0 |
| i_riscv_cpu | riscv_cpu | 752 | 680 | 72 | 0 | 31 | 0 | 0 | 0 |
| (i_riscv_cpu) | riscv_cpu | 32 | 32 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_branch_test | branch_test | 29 | 29 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_data_bus_mux_a | data_bus_mux_a | 16 | 16 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_data_bus_mux_b | data_bus_mux_b | 18 | 18 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_decoder | decoder | 78 | 78 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_program_counter | program_counter | 185 | 185 | 0 | 0 | 31 | 0 | 0 | 0 |
| i_register_file | register_file | 73 | 1 | 72 | 0 | 0 | 0 | 0 | 0 |
| i_result_bus_mux | result_bus_mux | 32 | 32 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_sign_extender | sign_extender | 24 | 24 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_station_alu | station_alu | 144 | 144 | 0 | 0 | 0 | 0 | 0 | 0 |
| i_station_shifter | station_shifter | 121 | 121 | 0 | 0 | 0 | 0 | 0 | 0 |
+-----------------------+-----------------+------------+------------+---------+------+-----+--------+--------+--------------+
* Note: The sum of lower-level cells may be larger than their parent cells total, due to cross-hierarchy LUT combining
Next up is to get it to run my verification test benches so I can do regression automated testing without having to do anything.
The best, best thing, is that I can change code and build over an SSH session from a laptop, while sitting on the sofa, rather than disappearing to my study nook.