diff --git a/examples/spartan6/project.cfg b/examples/spartan6/project.cfg index 0b3e34b..079aba8 100644 --- a/examples/spartan6/project.cfg +++ b/examples/spartan6/project.cfg @@ -10,6 +10,8 @@ port = 2020 privkey = /home/joppe/.ssh/id_rsa pubkey = /home/joppe/.ssh/id_rsa.pub +# ###################################### +# Basic synthesis [target.synth] toolchain = ISE @@ -29,5 +31,43 @@ toplevel = toplevel # Fileset files_vhdl = RTL/toplevel.vhd -#files_verilog = -files_con = CON/toplevel.ucf \ No newline at end of file +#files_verilog = +files_con = CON/toplevel.ucf +# ###################################### + +# ###################################### +# Behavioural simulation +[target.sim] +toolchain = isim + +# Toolchain settings +toplevel = tb_toplevel +vcdlevels = 20 +runtime = all +#fuse_opts = +#isim_opts = + +# Fileset +files_vhdl = RTL/toplevel.vhd + SIM/tb_toplevel.vhd +#files_verilog = +# ###################################### + +# ###################################### +# Post synthesis simulation (synth must have ran first) +[target.psim] +toolchain = isim + +# Toolchain settings +toplevel = tb_toplevel +vcdlevels = 20 +runtime = all +fuse_opts = --maxdelay work.glbl +isim_opts = -sdfmax /tb_toplevel/c_toplevel=%%D%%/OUT/synth/synth.sdf +# %%D%% is replaced with the top directory of the project + +# Fileset +files_vhdl = SIM/tb_toplevel.vhd +files_verilog = OUT/synth/synth.v +files_other = OUT/synth/synth.sdf +# ###################################### \ No newline at end of file diff --git a/remotesyn/toolchains/isim.py b/remotesyn/toolchains/isim.py new file mode 100644 index 0000000..b9b5420 --- /dev/null +++ b/remotesyn/toolchains/isim.py @@ -0,0 +1,83 @@ +import shutil +import os +import time +import subprocess + +def do(config, target, log, subprocesses, prefix='.'): + log(" - parsing options") + toplevel = config.get(f'target.{target}', 'toplevel', fallback='toplevel') + vcdlevels = config.get(f'target.{target}', 'vcdlevels', fallback='1') + runtime = config.get(f'target.{target}', 'runtime', fallback='100 ns') + fuse_opts = config.get(f'target.{target}', 'fuse_opts', fallback='') + isim_opts = config.get(f'target.{target}', 'isim_opts', fallback='') + files_vhdl = config.get(f'target.{target}', 'files_vhdl', fallback='').split() + files_verilog = config.get(f'target.{target}', 'files_verilog', fallback='').split() + build_dir = config.get(f'project', 'build_dir', fallback='build') + out_dir = config.get(f'project', 'out_dir', fallback='out') + + prefix = f'{os.getcwd()}/{prefix}' + build_dir = f'{prefix}/{build_dir}' + out_dir = f'{prefix}/{out_dir}/{target}' + + fuse_opts = fuse_opts.replace("%D%", prefix) + isim_opts = isim_opts.replace("%D%", prefix) + + log(" - creating output directories") + os.makedirs(build_dir, exist_ok=True) + os.makedirs(out_dir, exist_ok=True) + + log(" - writing project file") + with open(f'{build_dir}/sim.prj', 'w') as f: + for s in files_vhdl: + if s=='': + continue + f.write(f"vhdl work {prefix}/{s}\n") + for s in files_verilog: + if s=='': + continue + f.write(f"verilog work {prefix}/{s}\n") + + log(" - run fuse") + p = subprocess.Popen(f"fuse -v 2 {fuse_opts} {toplevel} -prj sim.prj -o sim -incremental > ffuse.log", + shell=True, cwd=build_dir, + stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + subprocesses.append(p) + while p.poll() is None: + time.sleep(1) + res = p.returncode + + log(" - copy logs") + shutil.copy(f'{build_dir}/ffuse.log', f'{out_dir}/fuse.log') + + if res!=0: + log("ERROR: fuse returned with:", res) + return res + + log(" - writing simulation file") + with open(f'{build_dir}/sim.tcl', 'w') as f: + f.write("onerror {resume}\n") + f.write("vcd dumpfile sim.vcd\n") + f.write(f"vcd dumpvars -m {toplevel} -l {vcdlevels}\n") + f.write("vcd dumpon\n") + f.write(f"run {runtime}\n") + f.write("vcd dumpflush\nquit\n") + + log(" - run sim") + p = subprocess.Popen(f"./sim {isim_opts} -tclbatch sim.tcl > sim.log", + shell=True, cwd=build_dir, + stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + subprocesses.append(p) + while p.poll() is None: + time.sleep(1) + res = p.returncode + + log(" - copy logs") + shutil.copy(f'{build_dir}/sim.log', f'{out_dir}/sim.log') + + if res==0: + log(" - copy output files") + shutil.copy(f'{build_dir}/sim.vcd', f'{out_dir}/{target}.vcd') + else: + log("ERROR: sim returned with:", res) + + return res \ No newline at end of file diff --git a/remotesyn/toolchains/util_ISE/ngdbuild.py b/remotesyn/toolchains/util_ISE/ngdbuild.py index 24be64e..3574d02 100644 --- a/remotesyn/toolchains/util_ISE/ngdbuild.py +++ b/remotesyn/toolchains/util_ISE/ngdbuild.py @@ -9,7 +9,7 @@ def ngdbuild(config, target, log, subprocesses, prefix='.') -> int: package = config.get(f'target.{target}', 'package', fallback='') speedgrade = config.get(f'target.{target}', 'speedgrade', fallback='') ngdbuild_opts = config.get(f'target.{target}', 'ngdbuild_opts', fallback='') - files_con = config.get(f'target.{target}', 'files_con', fallback='').split(' ') + files_con = config.get(f'target.{target}', 'files_con', fallback='').split() build_dir = config.get(f'project', 'build_dir', fallback='build') out_dir = config.get(f'project', 'out_dir', fallback='out') diff --git a/remotesyn/toolchains/util_ISE/xst.py b/remotesyn/toolchains/util_ISE/xst.py index 45342b8..25bce49 100644 --- a/remotesyn/toolchains/util_ISE/xst.py +++ b/remotesyn/toolchains/util_ISE/xst.py @@ -10,8 +10,8 @@ def xst(config, target, log, subprocesses, prefix='.') -> int: speedgrade = config.get(f'target.{target}', 'speedgrade', fallback='') toplevel = config.get(f'target.{target}', 'toplevel', fallback='toplevel') xst_opts = config.get(f'target.{target}', 'xst_opts', fallback='') - files_vhdl = config.get(f'target.{target}', 'files_vhdl', fallback='').split(' ') - files_verilog = config.get(f'target.{target}', 'files_verilog', fallback='').split(' ') + files_vhdl = config.get(f'target.{target}', 'files_vhdl', fallback='').split() + files_verilog = config.get(f'target.{target}', 'files_verilog', fallback='').split() build_dir = config.get(f'project', 'build_dir', fallback='build') out_dir = config.get(f'project', 'out_dir', fallback='out')