Add OPT_GLOBAL to use for run-time library (#2373)

This allows compiling the run-time library with optimization even when OPT_FAST is not used in order to imporove model build speed, possibly during debug cycles.
This commit is contained in:
Geza Lore 2020-05-27 01:52:08 +01:00 committed by GitHub
parent 978c35995a
commit d737266f64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 47 additions and 9 deletions

View File

@ -33,6 +33,8 @@ The contributors that suggested a given feature are shown in []. Thanks!
medium and large designs with default options. User makefiles may medium and large designs with default options. User makefiles may
require changes. require changes.
**** The run-time library is now compiled with -Os by default. (#2369, #2373)
* Verilator 4.034 2020-05-03 * Verilator 4.034 2020-05-03

View File

@ -2103,13 +2103,21 @@ OPT_FAST specifies optimizations for those parts of the program that are on the
fast path. This is mostly code that is executed every cycle. OPT_SLOW fast path. This is mostly code that is executed every cycle. OPT_SLOW
specifies optimizations for slow-path files, which execute only rarely, yet specifies optimizations for slow-path files, which execute only rarely, yet
take a long time to compile with optimization on. OPT_SLOW is ignored if take a long time to compile with optimization on. OPT_SLOW is ignored if
VM_PARALLEL_BUILDS is not 1, in which case all code is compliled with OPT_FAST. VM_PARALLEL_BUILDS is not 1, in which case all code is compiled with OPT_FAST.
See also the C<--output-split> option. OPT specifies overall optimization and See also the C<--output-split> option. OPT specifies overall optimization and
affects all compiles, including those OPT_FAST and OPT_SLOW control. For best affects all compiles, including those OPT_FAST and OPT_SLOW control. For best
results, use OPT="-Os -march=native", and link with "-static". Nearly the same results, use OPT="-Os -march=native", and link with "-static". Nearly the same
results can be had with much better compile times with OPT_FAST="-O1 results can be had with much better compile times with OPT_FAST="-O1
-fstrict-aliasing". Higher optimization such as "-O2" or "-O3" may help, but -fstrict-aliasing". Higher optimization such as "-O2" or "-O3" may help, but
gcc compile times may be excessive under O3 on even medium sized designs. gcc compile times may be excessive under O3 on even medium sized designs.
There is a third variable, OPT_GLOBAL, which applies to common code in the
run-time library used by verilated models. This is set to "-Os" by default
and there should rarely be a need to change it. As the run-time library is
small in comparison to a lot of verilated models, disabling optimization on
the run-time library should not have a serious effect on overall compilation
time, but can have highly detrimental effect on run-time performance,
especially with tracing. The OPT variable also applies to files that are
controlled by OPT_GLOBAL.
Unfortunately, using the optimizer with SystemC files can result in Unfortunately, using the optimizer with SystemC files can result in
compiles taking several minutes. (The SystemC libraries have many little compiles taking several minutes. (The SystemC libraries have many little
@ -2670,7 +2678,7 @@ Verilator and add the generated C++ sources to the target specified.
verilate(target SOURCES source ... [TOP_MODULE top] [PREFIX name] verilate(target SOURCES source ... [TOP_MODULE top] [PREFIX name]
[TRACE] [TRACE_FST] [SYSTEMC] [COVERAGE] [TRACE] [TRACE_FST] [SYSTEMC] [COVERAGE]
[INCLUDE_DIRS dir ...] [OPT_SLOW ...] [OPT_FAST ...] [INCLUDE_DIRS dir ...] [OPT_SLOW ...] [OPT_FAST ...]
[DIRECTORY dir] [VERILATOR_ARGS ...]) [OPT_GLOBAL ..] [DIRECTORY dir] [VERILATOR_ARGS ...])
Lowercase and ... should be replaced with arguments, the uppercase parts Lowercase and ... should be replaced with arguments, the uppercase parts
delimit the arguments and can be passed in any order, or left out entirely delimit the arguments and can be passed in any order, or left out entirely
@ -2761,6 +2769,11 @@ optimization level to improve compile times with large designs.
Optional. Set compiler flags for the fast path. Optional. Set compiler flags for the fast path.
=item OPT_GLOBAL
Optional. Set compiler flags for the common run-time library used by verilated
models.
=item DIRECTORY =item DIRECTORY
Optional. Set the verilator output directory. It is preferable to use the Optional. Set the verilator output directory. It is preferable to use the

View File

@ -92,6 +92,11 @@ LDLIBS += $(VM_USER_LDLIBS)
#OPT_FAST = -Os -fstrict-aliasing #OPT_FAST = -Os -fstrict-aliasing
#OPT_FAST = -O #OPT_FAST = -O
#OPT_FAST = #OPT_FAST =
# Optimization applied to the common run-time library used by verilated models.
# For compatibility this is called OPT_GLOBAL even though it only applies to
# files in the run-time library. Normally there should be no need for the user
# to change this.
OPT_GLOBAL = -Os
####################################################################### #######################################################################
##### SystemC builds ##### SystemC builds
@ -170,6 +175,9 @@ VK_SLOW_OBJS = $(addsuffix .o, $(VM_SLOW))
VK_USER_OBJS = $(addsuffix .o, $(VM_USER_CLASSES)) VK_USER_OBJS = $(addsuffix .o, $(VM_USER_CLASSES))
# Note VM_GLOBAL_FAST and VM_GLOBAL_SLOW holds the files required from the
# run-time library. In practice everything is actually in VM_GLOBAL_FAST,
# but keeping the distinction for compatibility for now.
VK_GLOBAL_OBJS = $(addsuffix .o, $(VM_GLOBAL_FAST) $(VM_GLOBAL_SLOW)) VK_GLOBAL_OBJS = $(addsuffix .o, $(VM_GLOBAL_FAST) $(VM_GLOBAL_SLOW))
ifneq ($(VM_PARALLEL_BUILDS),1) ifneq ($(VM_PARALLEL_BUILDS),1)
@ -197,15 +205,16 @@ $(VM_PREFIX)__ALL.a: $(VK_OBJS)
### Compile rules ### Compile rules
ifneq ($(VM_DEFAULT_RULES),0) ifneq ($(VM_DEFAULT_RULES),0)
$(VM_PREFIX)__ALL.o: $(VM_PREFIX)__ALL.cpp # Anything not in $(VK_SLOW_OBJS) or $(VK_GLOBAL_OBJS), including verilated.o
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $< # and user files passed on the Verilator command line use this rule.
# Anything not in $(VK_SLOW_OBJS), including verilated.o use this rule
%.o: %.cpp %.o: %.cpp
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $< $(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_FAST) -c -o $@ $<
$(VK_SLOW_OBJS): %.o: %.cpp $(VK_SLOW_OBJS): %.o: %.cpp
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_SLOW) -c -o $@ $< $(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_SLOW) -c -o $@ $<
$(VK_GLOBAL_OBJS): %.o: %.cpp
$(OBJCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPT_GLOBAL) -c -o $@ $<
endif endif
#Default rule embedded in make: #Default rule embedded in make:

View File

@ -13,7 +13,8 @@
###################################################################### ######################################################################
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 3.8)
set(TEST_REQUIRED_VARS NAME CSOURCES OPT_FAST VERILATOR_ROOT VERILATOR_ARGS set(TEST_REQUIRED_VARS NAME CSOURCES OPT_FAST OPT_GLOBAL
VERILATOR_ROOT VERILATOR_ARGS
VERILATOR_SOURCES SYSTEMC VERBOSE VERILATION) VERILATOR_SOURCES SYSTEMC VERBOSE VERILATION)
foreach(var ${TEST_REQUIRED_VARS}) foreach(var ${TEST_REQUIRED_VARS})
if (NOT DEFINED TEST_${var}) if (NOT DEFINED TEST_${var})
@ -74,6 +75,9 @@ endif()
if(TEST_OPT_FAST) if(TEST_OPT_FAST)
list(APPEND verilate_ARGS OPT_FAST ${TEST_OPT_FAST}) list(APPEND verilate_ARGS OPT_FAST ${TEST_OPT_FAST})
endif() endif()
if(TEST_OPT_GLOBAL)
list(APPEND verilate_ARGS OPT_GLOBAL ${TEST_OPT_GLOBAL})
endif()
if(TEST_THREADS) if(TEST_THREADS)
list(APPEND verilate_ARGS THREADS ${TEST_THREADS}) list(APPEND verilate_ARGS THREADS ${TEST_THREADS})
endif() endif()

View File

@ -1112,6 +1112,7 @@ sub compile {
"-DTEST_SYSTEMC=\"" .($self->sc ? 1 : 0). "\"", "-DTEST_SYSTEMC=\"" .($self->sc ? 1 : 0). "\"",
"-DCMAKE_PREFIX_PATH=\"".(($ENV{SYSTEMC_INCLUDE}||$ENV{SYSTEMC}||'')."/..\""), "-DCMAKE_PREFIX_PATH=\"".(($ENV{SYSTEMC_INCLUDE}||$ENV{SYSTEMC}||'')."/..\""),
"-DTEST_OPT_FAST=\"" . ($param{benchmark} ? "-Os" : "") . "\"", "-DTEST_OPT_FAST=\"" . ($param{benchmark} ? "-Os" : "") . "\"",
"-DTEST_OPT_GLOBAL=\"" . ($param{benchmark} ? "-Os" : "-O0") . "\"",
"-DTEST_VERILATION=\"" . $::Opt_Verilation . "\"", "-DTEST_VERILATION=\"" . $::Opt_Verilation . "\"",
]); ]);
return 1 if $self->errors || $self->skips || $self->unsupporteds; return 1 if $self->errors || $self->skips || $self->unsupporteds;
@ -1130,6 +1131,7 @@ sub compile {
"CPPFLAGS_DRIVER=-D".uc($self->{name}), "CPPFLAGS_DRIVER=-D".uc($self->{name}),
($self->{verbose} ? "CPPFLAGS_DRIVER2=-DTEST_VERBOSE=1":""), ($self->{verbose} ? "CPPFLAGS_DRIVER2=-DTEST_VERBOSE=1":""),
($param{benchmark} ? "OPT_FAST=-Os" : ""), ($param{benchmark} ? "OPT_FAST=-Os" : ""),
($param{benchmark} ? "" : "OPT_GLOBAL=-O0"),
"$self->{VM_PREFIX}", # bypass default rule, as we don't need archive "$self->{VM_PREFIX}", # bypass default rule, as we don't need archive
($param{make_flags}||""), ($param{make_flags}||""),
]); ]);

View File

@ -38,6 +38,7 @@ while (1) {
($opt_verbose ? "CPPFLAGS_DRIVER2=-DTEST_VERBOSE=1":""), ($opt_verbose ? "CPPFLAGS_DRIVER2=-DTEST_VERBOSE=1":""),
"OPT_FAST=-O2", "OPT_FAST=-O2",
"OPT_SLOW=-O0", "OPT_SLOW=-O0",
"OPT_GLOBAL=-Os",
($param{make_flags}||""), ($param{make_flags}||""),
]); ]);
@ -111,13 +112,15 @@ sub check_gcc_flags {
while (defined (my $line = $fh->getline)) { while (defined (my $line = $fh->getline)) {
chomp $line; chomp $line;
print ":log: $line\n" if $Self->{verbose}; print ":log: $line\n" if $Self->{verbose};
if ($line =~ /\.cpp/) { if ($line =~ /$Self->{VM_PREFIX}\S*\.cpp/) {
my $filetype = ($line =~ /Slow|Syms/) ? "slow":"fast"; my $filetype = ($line =~ /Slow|Syms/) ? "slow":"fast";
my $opt = ($line !~ /-O2/) ? "slow":"fast"; my $opt = ($line !~ /-O2/) ? "slow":"fast";
print "$filetype, $opt, $line\n" if $Self->{verbose}; print "$filetype, $opt, $line\n" if $Self->{verbose};
if ($filetype ne $opt) { if ($filetype ne $opt) {
error("${filetype} file compiled as if was ${opt}: $line"); error("${filetype} file compiled as if was ${opt}: $line");
} }
} elsif ($line =~ /\.cpp/ and $line !~ /-Os/) {
error("library file not compiled with OPT_GLOBAL: $line");
} }
} }
} }

View File

@ -116,7 +116,7 @@ define_property(TARGET
function(verilate TARGET) function(verilate TARGET)
cmake_parse_arguments(VERILATE "COVERAGE;TRACE;TRACE_FST;SYSTEMC" cmake_parse_arguments(VERILATE "COVERAGE;TRACE;TRACE_FST;SYSTEMC"
"PREFIX;TOP_MODULE;THREADS;DIRECTORY" "PREFIX;TOP_MODULE;THREADS;DIRECTORY"
"SOURCES;VERILATOR_ARGS;INCLUDE_DIRS;OPT_SLOW;OPT_FAST" "SOURCES;VERILATOR_ARGS;INCLUDE_DIRS;OPT_SLOW;OPT_FAST;OPT_GLOBAL"
${ARGN}) ${ARGN})
if (NOT VERILATE_SOURCES) if (NOT VERILATE_SOURCES)
message(FATAL_ERROR "Need at least one source") message(FATAL_ERROR "Need at least one source")
@ -290,6 +290,11 @@ function(verilate TARGET)
set_property(SOURCE "${VFAST}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${OPT_FAST}") set_property(SOURCE "${VFAST}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${OPT_FAST}")
endforeach() endforeach()
endforeach() endforeach()
foreach(VGLOBAL ${${VERILATE_PREFIX}_GLOBAL})
foreach(OPT_GLOBAL ${VERILATE_OPT_GLOBAL} ${${VERILATE_PREFIX}_USER_CFLAGS})
set_property(SOURCE "${VGLOBAL}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${OPT_GLOBAL}")
endforeach()
endforeach()
target_include_directories(${TARGET} PUBLIC "${VERILATOR_ROOT}/include" target_include_directories(${TARGET} PUBLIC "${VERILATOR_ROOT}/include"
"${VERILATOR_ROOT}/include/vltstd") "${VERILATOR_ROOT}/include/vltstd")