Si se ha compilado un módulo con un nombre dado, habrá un subdirectorio en el directorio "de trabajo" de la biblioteca que tiene el mismo nombre que el módulo. Además, habrá un archivo en ese subdirectorio llamado _primary.dat
. Para compilar módulos para una simulación, uso una o más reglas de creación de GNU similares a esta, una para cada directorio fuente posible:
WORK = work
$(WORK)/%/_primary.dat: ../rtl/uwb_top/v/%.v
vlog $+
Esto me permite escribir vlib work; make
en mi directorio de simulación, y solo se recompilarán los módulos que se han actualizado.
Sin embargo, si los nombres de sus módulos de biblioteca no son únicos, no conozco ninguna forma de decirle a qué archivo fuente se usó para crear un módulo de trabajo en particular.
EDITAR
Este es un ejemplo de un Makefile
completo que muestra cómo normalmente especifico mis módulos de destino. Esto utiliza características específicas de GNU make.
# Modules for the actual device
DUT_MODULES = dut_top dut_module1 dut_module2
# Modules for the simulation testbench
TB_MODULES = tb_top tb_module1 tb_module2 tb_module3
# Convert module names into full target paths
DUT_TARGETS = $(foreach mod, $(DUT_MODULES), $(WORK)/$(mod)/_primary.dat)
TB_TARGETS = $(foreach mod, $(TESTBENCH), $(WORK)/$(mod)/_primary.dat)
WORK = work
# Default 'make' target
tb: $(DUT_TARGETS) $(TB_TARGETS)
# Rule for device modules
$(WORK)/%/_primary.dat: ../rtl/uwb_top/v/%.v
vlog $+
# Rule for testbench modules
$(WORK)/%/_primary.dat: ../testbench/v/%.v
vlog $+
ACTUALIZACIÓN (2017)
Modelsim / Questasim ya no almacena código compilado de la manera descrita anteriormente; en su lugar, se utiliza un conjunto de archivos que contienen una base de datos, y los nombres de los módulos compilados se ocultan dentro de ellos.
Sin embargo, los cambios en Makefile para adaptarse a esto son sencillos. Primero, elimine el /_primary.dat
de las expresiones de ruta de destino. En segundo lugar, agregue un comando touch
que cree un archivo vacío con el mismo nombre que el módulo de destino después de cada comando vlog
. El Makefile se convierte en:
# Modules for the actual device
DUT_MODULES = dut_top dut_module1 dut_module2
# Modules for the simulation testbench
TB_MODULES = tb_top tb_module1 tb_module2 tb_module3
# Convert module names into full target paths
DUT_TARGETS = $(foreach mod, $(DUT_MODULES), $(WORK)/$(mod))
TB_TARGETS = $(foreach mod, $(TESTBENCH), $(WORK)/$(mod))
WORK = work
# Default 'make' target
tb: $(DUT_TARGETS) $(TB_TARGETS)
# Rule for device modules
$(WORK)/%/_primary.dat: ../rtl/uwb_top/v/%.v
vlog $+
touch $@
# Rule for testbench modules
$(WORK)/%/_primary.dat: ../testbench/v/%.v
vlog $+
touch $@
Estos archivos adicionales no interfieren de ninguna manera con el simulador, y el resto del Makefile funciona de la misma manera que antes.