From 9d219935f2877488b4e8acd7b6dc5a1d436baf87 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 12 Apr 2010 02:10:24 +0200 Subject: [PATCH] makefile: verbessert kleines Howto: o beh-sim wird so aufgerufen: beh_$(FILE) - Fuehrt beh-sim fuer $(FILE) aus. Dafuer muss beh_$(FILE)_tb.vhd und beh_$(FILE)_tb.do existieren. - Instanzname der tb_entity muss immer "sim" sein. - Instanzname der instanzierten Komponente muss immer "inst" sein. - Files die kompiliert werden sollen, muessen in $(BEH_IFILES) angegeben werden (Achtung: keine Testbenches angeben!) o post-sim wird aehnlich aufgerufen: post_$(FILE) - hier ist zu beachten, dass das entsprechende VHO bzw. SDO File von Quartus schon generiert wurde (per ~hwmod/quartus/windows.cmd projekt erstellen, mit Quartus dann die Projektdatei oeffnen und alles builden) - Instanzname der tb_entity muss immer "sim" sein. - Instanzname der instanzierten Komponente muss immer "inst" sein. - koennte noch sein dass hier noch etwas angepasst werden muss - Files die kompiliert werden sollen, muessen in $(POST_IFILES) angegeben werden. Im Allgemeinen werden das globale Definitionen sein (z.b. fuer Typen, Konstanten, etc. die fuer die Testbenches benoetigt werden), da die sich zu simulierenden Instanzen im VHO-File befinden. (Achtung: keine Testbenches angeben!) Beispiele: $ make beh_alu $ make post_alu $ make clean #loescht alle simulationsdateien --- src/Makefile | 70 ++++++++++++++++++++---- src/{alu.do => beh_alu_tb.do} | 0 src/{alu_tb.vhd => beh_alu_tb.vhd} | 8 +-- src/post_alu_tb.do | 27 +++++++++ src/{alu_tb_post.vhd => post_alu_tb.vhd} | 8 +-- 5 files changed, 94 insertions(+), 19 deletions(-) rename src/{alu.do => beh_alu_tb.do} (100%) rename src/{alu_tb.vhd => beh_alu_tb.vhd} (96%) create mode 100644 src/post_alu_tb.do rename src/{alu_tb_post.vhd => post_alu_tb.vhd} (97%) diff --git a/src/Makefile b/src/Makefile index da86f57..4d3dc4e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,18 +2,36 @@ SHELL := bash MPWD := $(shell pwd) D_BEHSIM := $(MPWD)/../sim/beh +D_POSTSIM := $(MPWD)/../sim/post +POST_VHO := $(MPWD)/../quartus/calc/simulation/modelsim/calc.vho +POST_SDO := $(MPWD)/../quartus/calc/simulation/modelsim/calc_vhd.sdo +POST_SDO_INST := inst WORK := work -#reihenfolge ist hier wichtig! -IFILES = gen_pkg alu alu_tb -IFILES := $(strip $(IFILES)) -#virtuelle targets: weil wir sowas wie ein objectfile von vcom nicht bekommen. bessere ideen sind willkommen -VTARGETS := $(foreach n, $(IFILES), $(D_BEHSIM)/$(WORK)/$(n)/_primary.dat) +# o reihenfolge ist wichtig +# o keine testbechnes hier angeben +BEH_IFILES = gen_pkg alu +BEH_IFILES := $(strip $(BEH_IFILES)) + +# o keine testbenches hier angeben +# o beachte, dass sich viele files schon in dem VHO file befinden -- es muessen eigentlich nur +# abhaengigkeiten fuer die testbenches angegeben werden +POST_IFILES = gen_pkg +POST_IFILES := $(strip $(POST_IFILES)) + +#virtuelle targets fuer behsim: weil wir sowas wie ein objectfile von vcom nicht bekommen. bessere ideen sind willkommen +BEH_VTARGETS := $(foreach n, $(BEH_IFILES), $(D_BEHSIM)/$(WORK)/$(n)/_primary.dat) + +#virtuelle targets fuer postsim +POST_VTARGETS := $(foreach n, $(shell grep ENTITY $(POST_VHO) | awk '{ print $$2 }'), $(D_POSTSIM)/$(WORK)/$(n)/_primary.dbs) +POST_VTARGETS += $(foreach n, $(POST_IFILES), $(D_POSTSIM)/$(WORK)/$(n)/_primary.dat) + all: behsim -behsim: $(D_BEHSIM)/modelsim.ini $(VTARGETS) +#behsim +behsim: $(D_BEHSIM)/modelsim.ini $(BEH_VTARGETS) $(D_BEHSIM)/modelsim.ini: @echo " INIT for behavioural simulation" @@ -23,14 +41,44 @@ $(D_BEHSIM)/modelsim.ini: vlib work > /dev/null ; \ vmap work work > /dev/null ; -$(D_BEHSIM)/$(WORK)/%/_primary.dat: %.vhd +$(D_BEHSIM)/$(WORK)/%/_primary.dat: %.vhd $(D_BEHSIM)/modelsim.ini @echo " CC $<" @cd $(D_BEHSIM); \ vcom -work $(WORK) $(MPWD)/$< -modelsim: behsim - @cd $(D_BEHSIM); \ - vsim "work.alu_tb(sim)" -f /dev/null -do $(MPWD)/alu.do +beh_%: $(D_BEHSIM)/$(WORK)/beh_%_tb/_primary.dat beh_%_tb.do behsim + cd $(D_BEHSIM); \ + vsim "work.$@_tb(sim)" -f /dev/null -do $(MPWD)/$@_tb.do + +#postsim +postsim: $(POST_VHO) $(D_POSTSIM)/modelsim.ini $(POST_VTARGETS) + +$(D_POSTSIM)/modelsim.ini: + @echo " INIT for post-layout simulation" + @mkdir -p $(D_POSTSIM) + @cd $(D_POSTSIM); \ + vlib work > /dev/null ; \ + vmap work work > /dev/null ; + +$(D_POSTSIM)/$(WORK)/%/_primary.dbs: $(POST_VHO) $(D_POSTSIM)/modelsim.ini + @echo " CC $<" + @cd $(D_POSTSIM); \ + vcom -work $(WORK) $(POST_VHO) + +$(D_POSTSIM)/$(WORK)/%/_primary.dat: %.vhd $(D_POSTSIM)/modelsim.ini + @echo " CC $<" + @cd $(D_POSTSIM); \ + vcom -work $(WORK) $(MPWD)/$< + +post_%: $(D_POSTSIM)/$(WORK)/post_%_tb/_primary.dat post_%_tb.do postsim $(POST_SDO) + cd $(D_POSTSIM); \ + vsim "work.$@_tb(sim)" -sdftyp /$(POST_SDO_INST)=$(POST_SDO) -f /dev/null -do $(MPWD)/$@_tb.do + +$(POST_VHO) $(POST_SDO): + @if [ -f $@ ]; \ + then echo "vho/sdo: passt"; true ; \ + else echo "Fehler: $@ muss mit quartus erstellt werden"; false; \ + fi quartus: @echo "Die angebotene (free) Quartus II Version funktioniert leider nicht. (Build endet mit einem Error, auch mit dem debouncing-bsp der LVA)." @@ -41,5 +89,5 @@ quartus: .PHONY: clean clean: - rm -Rf $(D_BEHSIM) + rm -Rf $(D_BEHSIM) $(D_POSTSIM) diff --git a/src/alu.do b/src/beh_alu_tb.do similarity index 100% rename from src/alu.do rename to src/beh_alu_tb.do diff --git a/src/alu_tb.vhd b/src/beh_alu_tb.vhd similarity index 96% rename from src/alu_tb.vhd rename to src/beh_alu_tb.vhd index 1b0d2f4..766d46b 100644 --- a/src/alu_tb.vhd +++ b/src/beh_alu_tb.vhd @@ -3,10 +3,10 @@ use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.gen_pkg.all; -entity alu_tb is -end entity alu_tb; +entity beh_alu_tb is +end entity beh_alu_tb; -architecture sim of alu_tb is +architecture sim of beh_alu_tb is component alu is port ( @@ -26,7 +26,7 @@ architecture sim of alu_tb is signal op1, op2, op3 : csigned; signal stop : boolean := false; begin - bla : alu + inst : alu port map ( sys_clk => sys_clk, diff --git a/src/post_alu_tb.do b/src/post_alu_tb.do new file mode 100644 index 0000000..7c3c160 --- /dev/null +++ b/src/post_alu_tb.do @@ -0,0 +1,27 @@ +#alias fuer simulation neustarten +alias rr "restart -f" + +#signale hinzufuegen +add wave sys_clk +add wave sys_res_n +add wave op1 +add wave opcode +add wave op2 +add wave op3 +add wave do_calc +add wave calc_done +add wave \\opcode.NOP\\ +add wave \\opcode.SUB\\ +add wave \\opcode.ADD\\ +add wave \\opcode.MUL\\ +add wave \\opcode.DIV\\ +add wave \\opcode.DONE\\ + +#rauszoomen +wave zoomout 500.0 + +#simulation starten und 100ms lang laufen lassen (wird durch assert abgebrochen) +run -all + +#ganz nach links scrollen +wave seetime 0 diff --git a/src/alu_tb_post.vhd b/src/post_alu_tb.vhd similarity index 97% rename from src/alu_tb_post.vhd rename to src/post_alu_tb.vhd index 795eaa3..39b3b02 100644 --- a/src/alu_tb_post.vhd +++ b/src/post_alu_tb.vhd @@ -3,10 +3,10 @@ use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.gen_pkg.all; -entity alu_tb is -end entity alu_tb; +entity post_alu_tb is +end entity post_alu_tb; -architecture sim of alu_tb is +architecture sim of post_alu_tb is component alu is port ( @@ -37,7 +37,7 @@ architecture sim of alu_tb is signal op1, op2, op3 : std_logic_vector(31 downto 0); signal stop : boolean := false; begin - bla : alu + inst : alu port map ( sys_clk => sys_clk, -- 2.25.1