system verilog - How to write a makefile where the compiled object files are in a different directory with a different name? -


so i'm trying write makefile use questasim , systemverilog files. if don't know (and people won't) don't worry, it's not relevant problem.

i have project director containing: src/ work/ makefile

the src/ directory contains several directories each contain source files.

the work/ directory doesn't exist, , created makefile.

when call "compiler" called vlog, on .sv file directory gets created in work folder same name .sv file without suffix. in directory 3 files 1 i'll use "object' file _primary.dat.

so example, calling "vlog src/interface/my_interface.sv" creates (if succeeds) work/my_interface/_primary.dat

my .sv files need compiled in specific order, , want compile them if source file or 1 of dependencies has changed.

i can turn path .sv file path relevant _primary.dat file using "$(addsuffix /_primary.dat, $(addprefix $(vlib_dir)/, $(basename $(notdir $(src)))))" reverse impossible, loose directory structure.

so think want sort of map object -> src. in $(obj): target, can "vlog $(getsrc $@)".

after have deal compile order , dependencies, can work out.

any suggestions?

i found solution works. i'm not sure it's neatest, i'll post here else has problem.

basically create macro takes 2 arguments: .sv source file path , name, , list of dependencies. turns source file path object file path , creates target. dependency on source file , passed in dependencies. create variable containing list of sources. do: $(foreach src,$(srcs),$(eval $(call create_target_for, $(src)))) creates targets.

additionally have each subdirectory phony target, relevant dependencies, allowing me correct compile order on directories.

the thing missing if need ensure files in single directory have correct compile order.

my makefile:

# makefile use in building uvm components # ---------------------------------------------------------------------------------- # requirements: #   questasim - use vlog compiler packaged questasim. #     modelsim comes vlog, doesn't support uvm. #   uvm_include_dir environment var - should point uvm src directory. #     me is: c:\questasim_10.0b\verilog_src\uvm-1.0p1\src # ---------------------------------------------------------------------------------- # notes: #   vlog compiler creates output folder in vlib_dir directors #   per package/module/interface same name entity #   capitals replace @ followed lower case letter #   ie. foobar -> @foo@bar #   makefile requires that: #     interfaces end in _if #     packages end in _pkg #     each file can contain single interface, package or module #     no capitals in package/module/interface naems #     package/module/interface has same name file  # variabls use later vlib_dir    = ./work vlog_flags  = +incdir+$(uvm_include_dir)  # src files - per directory use compile orders #             ie. transactions have compiled before drivers interface_srcs      = $(wildcard src/interfaces/*.sv) config_srcs         = $(wildcard src/configs/*.sv) transaction_srcs    = $(wildcard src/transactions/*.sv) sequence_srcs       = $(wildcard src/sequences/*.sv) driver_srcs         = $(wildcard src/drivers/*.sv) monitor_srcs        = $(wildcard src/monitors/*.sv) agent_srcs          = $(wildcard src/agents/*.sv) scoreboard_srcs     = $(wildcard src/scoreboards/*.sv)  # source files - use creating makefile targets srcs                = $(interface_srcs) \                       $(config_srcs) \                       $(transaction_srcs) \                       $(sequence_srcs) \                       $(driver_srcs) \                       $(monitor_srcs) \                       $(agent_srcs) \                       $(scoreboard_srcs)  # list of components components  = interfaces \               configs \               transactions \               sequences \               drivers \               monitors \               agents \               scoreboards  # colours use in echo commands highlighting colour_none     = \x1b[0m colour_red      = \x1b[31;01m colour_blue     = \x1b[34;01m colour_green    = \x1b[32;01m  # macros turn .sv file compiled file in relevant vlib_dir subdirectory # src/abc/def.sv -> $(vlib_dir)/def/_primary.dat src2obj     = $(addsuffix /_primary.dat, $(addprefix $(vlib_dir)/, $(basename $(notdir $(1)))))  # macro create target given source file # takes 2 arguments: # 1) path , name of source file # 2) dependencies # creates traget on relevant _primary.dat (questasim created object) # dependency on source file, , other passed in dependencies define create_target_for  $$(info $colour_green create_target_for called on $(1)) $$(info creating target $(call src2obj, $(1))) $$(info dependencies $(vlib_dir) $(1) $(2)) $$(info ) $(call src2obj, $(1)): $(1) $(2)     @echo -e "$(colour_blue)compiling $(1) because of changes in: $$? $(colour_none)\n"     vlog $(vlog_flags) $(1)  endef  # default rule create library, compile uvm pkg , components all: $(vlib_dir) uvm $(components)  # create questasim library if it's not there $(vlib_dir):     vlib $(vlib_dir)     @echo -e "$(colour_green)created $(vlib_dir) library$(colour_none)\n"  # compile uvm library $(vlib_dir)/uvm_pkg/_primary.dat:     vlog +incdir+$(uvm_include_dir) $(uvm_include_dir)/uvm.sv     @echo -e "$(colour_green)compiled uvm package$(colour_none)\n"  # simple alias uvm: $(vlib_dir) $(vlib_dir)/uvm_pkg/_primary.dat  # create targets our sources # note method can't set dependencies within single directory $(foreach src,$(srcs),$(eval $(call create_target_for, $(src))))  # define phony target per directory can specify compile order interfaces: $(vlib_dir) uvm \             $(call src2obj, $(interface_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  configs: $(vlib_dir) uvm \          $(call src2obj, $(config_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  transactions: $(vlib_dir) uvm \               $(call src2obj, $(transaction_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  sequences: $(vlib_dir) uvm \            transactions \            $(call src2obj, $(sequence_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  drivers: $(vlib_dir) uvm \          transactions interfaces \          $(call src2obj, $(driver_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  monitors: $(vlib_dir) uvm \           transactions interfaces \           $(call src2obj, $(monitor_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  agents: $(vlib_dir) uvm \         drivers monitors transactions configs interfaces \         $(call src2obj, $(agent_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  scoreboards: $(call src2obj, $(scoreboard_srcs))     @echo -e "$(colour_green)compiled $@$(colour_none)\n"  # delete library , compiled files clean:     if [ -d $(vlib_dir) ]; vdel -lib $(vlib_dir) -all; fi;  .phony: clean uvm $(components) 

Comments