diff --git a/.travis.yml b/.travis.yml index eb419490..307bd668 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,6 @@ before_install: script: - make vsim-verilog -C regression SUITE=$SUITE TORTURE_CONFIG=default CHISEL_VERSION=$CHISEL_VERSION - - make fsim-verilog -C regression SUITE=$SUITE TORTURE_CONFIG=default CHISEL_VERSION=$CHISEL_VERSION - make emulator-ndebug -C regression SUITE=$SUITE TORTURE_CONFIG=default CHISEL_VERSION=$CHISEL_VERSION - make emulator-regression-tests -C regression SUITE=$SUITE TORTURE_CONFIG=default CHISEL_VERSION=$CHISEL_VERSION diff --git a/README.md b/README.md index 9aef8c6a..56048c4f 100644 --- a/README.md +++ b/README.md @@ -72,12 +72,7 @@ And to run the assembly tests on the C simulator and generate waveforms: $ make -jN run-asm-tests-debug $ make -jN run-bmark-tests-debug -To generate FPGA-synthesizable verilog (output will be in `fsim/generated-src`): - - $ cd fsim - $ make verilog - -Similarly, to generate VLSI-synthesizable verilog (output will be in `vsim/generated-src`): +To generate FPGA- or VLSI-synthesizable verilog (output will be in `vsim/generated-src`): $ cd vsim $ make verilog @@ -384,7 +379,7 @@ writeback stage. At cycle 485, there isn't a valid instruction in the writeback stage, perhaps, because of a instruction cache miss at PC 0x2140. -### 2) Mapping a Rocket core down to an FPGA +### 2) Mapping a Rocket core to an FPGA We use Synopsys VCS for Verilog simulation. We acknowledge that using a proprietary Verilog simulation tool for an open-source project is not @@ -395,14 +390,13 @@ Verilog simulator. In the meantime, you can use the C++ emulator to generate vcd waveforms, which you can view with an open-source waveform viewer such as GTKWave. -So assuming you have a working Rocket chip, you can generate Verilog for -the FPGA tools with the following commands: +You can generate synthesizable Verilog with the following commands: - $ cd $ROCKETCHIP/fsim - $ make verilog + $ cd $ROCKETCHIP/vsim + $ make verilog CONFIG=DefaultFPGAConfig The Verilog used for the FPGA tools will be generated in -fsim/generated-src. Please proceed further with the directions shown in +vsim/generated-src. Please proceed further with the directions shown in the [README](https://github.com/ucb-bar/fpga-zynq/blob/master/README.md) of the fpga-zynq repository. @@ -410,11 +404,11 @@ However, if you have access to VCS, you will be able to run assembly tests and benchmarks with the following commands (again assuming you have N cores on your host machine): - $ cd $ROCKETCHIP/fsim - $ make -jN run + $ cd $ROCKETCHIP/vsim + $ make -jN run CONFIG=DefaultFPGAConfig The generated output looks similar to those generated from the emulator. -Look into fsim/output/\*.out for the output of the executed assembly +Look into vsim/output/\*.out for the output of the executed assembly tests and benchmarks. ### 3) Pushing a Rocket core through the VLSI tools @@ -485,9 +479,8 @@ Towards the end, you can also find that ExampleSmallConfig inherits all parameters from BaseConfig but overrides the same parameters of SmallConfig. -Now take a look at fsim/Makefile and vsim/Makefile. Search for the -CONFIG variable. DefaultFPGAConfig is used for the FPGA build, while -DefaultConfig is used for the VLSI build. You can also change the +Now take a look at vsim/Makefile. Search for the CONFIG variable. +By default, it is set to DefaultConfig. You can also change the CONFIG variable on the make command line: $ cd $ROCKETCHIP/vsim diff --git a/fsim/.gitignore b/fsim/.gitignore deleted file mode 100644 index 571b6166..00000000 --- a/fsim/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -simv* -csrc -*.vpd -*.key -DVE* -.vcs* -timestamp -*.out -*.h -*.log -*.cmd -*.daidir -*.ucli -*.a -*.vcd -dramsim2_ini -generated-src -output diff --git a/fsim/Makefile b/fsim/Makefile deleted file mode 100644 index 90407690..00000000 --- a/fsim/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -#======================================================================= -# Makefile for Verilog simulation w/ VCS -#----------------------------------------------------------------------- -# Yunsup Lee (yunsup@cs.berkeley.edu) -# -# This makefile will build a rtl simulator and run various tests to -# verify proper functionality. -# - -default: all - -base_dir = $(abspath ..) -generated_dir = $(abspath ./generated-src) -mem_gen = $(base_dir)/fsim/fpga_mem_gen -sim_dir = . -output_dir = $(sim_dir)/output - -BACKEND ?= v -CONFIG ?= DefaultFPGAConfig -TB ?= rocketTestHarness - -include $(base_dir)/Makefrag -include $(sim_dir)/Makefrag -ifneq ($(MAKECMDGOALS),clean) --include $(generated_dir)/$(MODEL).$(CONFIG).d -endif -include $(base_dir)/vsim/Makefrag-verilog - -all: $(simv) -debug: $(simv_debug) - -clean: - rm -rf $(junk) simv* csrc *.key DVE* *.h *.a *.daidir $(generated_dir) - -.PHONY: default all debug clean diff --git a/fsim/Makefrag b/fsim/Makefrag deleted file mode 100644 index d075b8a5..00000000 --- a/fsim/Makefrag +++ /dev/null @@ -1,75 +0,0 @@ - -#-------------------------------------------------------------------- -# Sources -#-------------------------------------------------------------------- - -# Verilog sources - -sim_vsrcs = \ - $(generated_dir)/$(MODEL).$(CONFIG).v \ - $(generated_dir)/consts.$(CONFIG).vh \ - $(base_dir)/vsrc/$(TB).v \ - -# C sources - -sim_csrcs = \ - $(base_dir)/csrc/vcs_main.$(TB).cc \ - $(base_dir)/csrc/mm.cc \ - $(base_dir)/csrc/mm_dramsim2.cc \ - -#-------------------------------------------------------------------- -# Build Verilog -#-------------------------------------------------------------------- - -verilog: $(sim_vsrcs) - -.PHONY: verilog - -#-------------------------------------------------------------------- -# Build rules -#-------------------------------------------------------------------- - -VCS = vcs -full64 - -VCS_OPTS = -notice -line +lint=all,noVCDE,noONGS,noUI -error=PCWM-L -timescale=1ns/10ps -quiet \ - +rad +v2k +vcs+lic+wait \ - +vc+list -CC "-I$(VCS_HOME)/include" \ - -CC "-I$(RISCV)/include" \ - -CC "-I$(realpath $(base_dir))/dramsim2" \ - -CC "-std=c++11" \ - -CC "-Wl,-rpath,$(RISCV)/lib" \ - -CC "-include $(consts_header)" \ - -e vcs_main \ - $(RISCV)/lib/libfesvr.so \ - $(sim_dir)/libdramsim.a \ - +incdir+$(generated_dir) \ - +define+FPGA \ - +define+CLOCK_PERIOD=0.5 $(sim_vsrcs) $(sim_csrcs) \ - +define+PRINTF_COND=$(TB).verbose \ - +libext+.v \ - -#-------------------------------------------------------------------- -# Build the simulator -#-------------------------------------------------------------------- - -simv = $(sim_dir)/simv-$(MODEL)-$(CONFIG) -$(simv) : $(sim_vsrcs) $(sim_csrcs) $(sim_dir)/libdramsim.a $(consts_header) - cd $(sim_dir) && \ - rm -rf csrc && \ - $(VCS) $(VCS_OPTS) -o $(simv) \ - -debug_pp \ - -simv_debug = $(sim_dir)/simv-$(MODEL)-$(CONFIG)-debug -$(simv_debug) : $(sim_vsrcs) $(sim_csrcs) $(sim_dir)/libdramsim.a $(consts_header) - cd $(sim_dir) && \ - rm -rf csrc && \ - $(VCS) $(VCS_OPTS) -o $(simv_debug) \ - +define+DEBUG -debug_pp \ - -#-------------------------------------------------------------------- -# Run -#-------------------------------------------------------------------- - -seed = $(shell date +%s) -exec_simv = $(simv) -q +ntb_random_seed_automatic -exec_simv_debug = $(simv_debug) -q +ntb_random_seed_automatic diff --git a/fsim/fpga_mem_gen b/fsim/fpga_mem_gen deleted file mode 100755 index 2c9e2490..00000000 --- a/fsim/fpga_mem_gen +++ /dev/null @@ -1,195 +0,0 @@ -#! /usr/bin/env python - -# See LICENSE for license details. -# This is based off of reference-chip/vlsi/src/vlsi_mem_gen - -import sys -import math - -use_latches = False - - -module_template = '''module %s( - %s -); -%s -%s -always @(posedge CLK) begin - %s -end -%s - -endmodule - -''' - - -mask_assert_template = ''' -`ifndef SYNTHESIS -integer i; -integer j; -always @(posedge CLK) begin%s -end -`endif -''' - - -assert_template = ''' - for (i=0; i<%d; i=i+%d) begin - for (j=1; j<%d; j=j+1) begin - if (%sM[i] != %sM[i+j]) begin - $fwrite(32'h80000002, "ASSERTION FAILED: write mask granularity\\n"); - $finish; - end - end - end''' - - -def parse_line(line): - name = '' - width = 0 - depth = 0 - ports = '' - mask_gran = 1 - tokens = line.split() - i = 0 - for i in range(0,len(tokens),2): - s = tokens[i] - if s == 'name': - name = tokens[i+1] - elif s == 'width': - width = int(tokens[i+1]) - elif s == 'depth': - depth = int(tokens[i+1]) - elif s == 'ports': - ports = tokens[i+1].split(',') - elif s == 'mask_gran': - mask_gran = int(tokens[i+1]) - else: - sys.exit('%s: unknown argument %s' % (sys.argv[0], a)) - return (name, width, depth, ports, mask_gran) - - - -def gen_range(mask_index, mask_gran, max_width): - return '%d:%d' % (min(mask_gran*(mask_index+1),max_width)-1, - min(mask_gran*(mask_index),max_width)) - - - -def gen_mem(name, width, depth, ports, mask_gran): - addr_width = max(math.ceil(math.log(depth)/math.log(2)),1) - mask_width = int(math.ceil(float(width) / mask_gran)) - port_spec = ['input CLK', 'input RST', 'input init'] - readports = [] - writeports = [] - latchports = [] - rwports = [] - decl = [] - combinational = [] - sequential = [] - maskedports = {} - mask_asserts = '' - for pid in range(len(ports)): - ptype = ports[pid] - if ptype[0:1] == 'm': - ptype = ptype[1:] - maskedports[pid] = pid - - if ptype == 'read': - port_spec += ['input [%d:0] R%dA' % (addr_width-1, pid)] - port_spec += ['input R%dE' % pid] - port_spec += ['output [%d:0] R%dO' % (width-1, pid)] - readports += [pid] - elif ptype == 'write': - port_spec += ['input [%d:0] W%dA' % (addr_width-1, pid)] - port_spec += ['input W%dE' % pid] - port_spec += ['input [%d:0] W%dI' % (width-1, pid)] - if pid in maskedports: - port_spec += ['input [%d:0] W%dM' % (width-1, pid)] - if not use_latches or pid in maskedports: - writeports += [pid] - else: - latchports += [pid] - elif ptype == 'rw': - port_spec += ['input [%d:0] RW%dA' % (addr_width-1, pid)] - port_spec += ['input RW%dE' % pid] - port_spec += ['input RW%dW' % pid] - if pid in maskedports: - port_spec += ['input [%d:0] RW%dM' % (width-1, pid)] - port_spec += ['input [%d:0] RW%dI' % (width-1, pid)] - port_spec += ['output [%d:0] RW%dO' % (width-1, pid)] - rwports += [pid] - else: - sys.exit('%s: unknown port type %s' % (sys.argv[0], ptype)) - - decl += ['reg [%d:0] ram [%d:0];' % (width-1, depth-1)] - decl += ['`ifndef SYNTHESIS'] - decl += [' integer initvar;'] - decl += [' initial begin'] - decl += [' #0.002;'] - decl += [' for (initvar = 0; initvar < %d; initvar = initvar+1)' % depth] - decl += [' ram[initvar] = {%d {$random}};' % ((width-1)/32+1)] - decl += [' end'] - decl += ['`endif'] - - for pid in readports: - decl += ['reg [%d:0] reg_R%dA;' % (addr_width-1, pid)] - sequential += ['if (R%dE) reg_R%dA <= R%dA;' % (pid, pid, pid)] - combinational += ['assign R%dO = ram[reg_R%dA];' % (pid, pid)] - - for pid in rwports: - decl += ['reg [%d:0] reg_RW%dA;' % (addr_width-1, pid)] - sequential += ['if (RW%dE && !RW%dW) reg_RW%dA <= RW%dA;' % (pid, pid, pid, pid)] - combinational += ['assign RW%dO = ram[reg_RW%dA];' % (pid, pid)] - - for pid in latchports: - decl += ['reg [%d:0] latch_W%dA;' % (addr_width-1, pid)] - decl += ['reg [%d:0] latch_W%dI;' % (width-1, pid)] - decl += ['reg latch_W%dE;' % (pid)] - combinational += ['always @(*) begin'] - combinational += [' if (!CLK && W%dE) latch_W%dA <= W%dA;' % (pid, pid, pid)] - combinational += [' if (!CLK && W%dE) latch_W%dI <= W%dI;' % (pid, pid, pid)] - combinational += [' if (!CLK) latch_W%dE <= W%dE;' % (pid, pid)] - combinational += ['end'] - combinational += ['always @(*)'] - combinational += [' if (CLK && latch_W%dE)' % (pid)] - combinational += [' ram[latch_W%dA] <= latch_W%dI;' % (pid, pid)] - - for pid in writeports: - if pid not in maskedports: - sequential += ['if (W%dE) ram[W%dA] <= W%dI;' % (pid, pid, pid)] - else: - for mask_index in range(mask_width): - rs = gen_range(mask_index, mask_gran, width) - sequential += ['if (W%dE && W%dM[%d]) ram[W%dA][%s] <= W%dI[%s];' % - (pid, pid, mask_index*mask_gran, pid, rs, pid, rs)] - mask_asserts += assert_template % (mask_width, mask_gran, mask_gran, 'W'+str(pid), 'W'+str(pid)) - for pid in rwports: - if pid not in maskedports: - sequential += ['if (RW%dE && RW%dW) ram[RW%dA] <= RW%dI;' % (pid, pid, pid, pid)] - else: - for mask_index in range(mask_width): - rs = gen_range(mask_index, mask_gran, width) - sequential += ['if (RW%dE && RW%dW && RW%dM[%d]) ram[RW%dA][%s] <= RW%dI[%s];' % - (pid, pid, pid, mask_index*mask_gran, pid, rs, pid, rs)] - mask_asserts += assert_template % (mask_width, mask_gran, mask_gran, 'RW'+str(pid), 'RW'+str(pid)) - check_masks = '' if len(maskedports) == 0 else mask_assert_template % mask_asserts - return module_template % (name, - ',\n '.join(port_spec), - check_masks, - '\n '.join(decl), - '\n '.join(sequential), - '\n '.join(combinational)) - - - -def main(): - if len(sys.argv) < 2: - sys.exit('Please give a .conf file as input') - for line in open(sys.argv[1]): - print(gen_mem(*parse_line(line))) - - -if __name__ == '__main__': - main() diff --git a/regression/Makefile b/regression/Makefile index f9d7f8e2..a0c55ce4 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -1,5 +1,5 @@ # The default target, which runs all regression targets. -regression: vsim-regression fsim-regression emulator-regression +regression: vsim-regression emulator-regression # Regression targets for the various simulators. %-regression: %-asm-tests %-bmark-tests @@ -36,7 +36,6 @@ include $(TOP)/Makefrag clean: rm -rf stamps $(abspath $(RISCV)) $(MAKE) RISCV=$(RISCV) -C $(abspath $(TOP)/vsim) clean - $(MAKE) RISCV=$(RISCV) -C $(abspath $(TOP)/fsim) clean $(MAKE) RISCV=$(RISCV) -C $(abspath $(TOP)/emulator) clean ifeq ($(SUITE),) @@ -91,22 +90,6 @@ vsim-bmark-tests: $(VSIM_BMARK_TEST_STAMPS) vsim-regression-tests: $(VSIM_REGRESSION_TEST_STAMPS) vsim-torture: $(VSIM_TORTURE_STAMPS) -FSIM_VERILOG_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-verilog.stamp) -FSIM_DEBUG_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-debug.stamp) -FSIM_NDEBUG_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-ndebug.stamp) -FSIM_ASM_TEST_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-asm-tests.stamp) -FSIM_BMARK_TEST_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-bmark-tests.stamp) -FSIM_REGRESSION_TEST_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-regression-tests.stamp) -FSIM_TORTURE_STAMPS=$(foreach config,$(CONFIGS),stamps/$(config)/fsim-torture-$(TORTURE_CONFIG).stamp) - -fsim-verilog: $(FSIM_VERILOG_STAMPS) -fsim-debug: $(FSIM_DEBUG_STAMPS) -fsim-ndebug: $(FSIM_NDEBUG_STAMPS) -fsim-asm-tests: $(FSIM_ASM_TEST_STAMPS) -fsim-bmark-tests: $(FSIM_BMARK_TEST_STAMPS) -fsim-regression-tests: $(FSIM_REGRESSION_TEST_STAMPS) -fsim-torture: $(FSIM_TORTURE_STAMPS) - submodule_names = chisel2 chisel3 context-dependent-environments dramsim2 firrtl groundtest hardfloat junctions rocket torture uncore $(ROCKETCHIP_ADDONS) # Checks out all the rocket-chip submodules @@ -159,21 +142,6 @@ stamps/%/vsim-debug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp +flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/vsim CONFIG=$* RISCV=$(abspath $(RISCV)) CHISEL_VERSION=$(CHISEL_VERSION) debug date > $@ -stamps/%/fsim-verilog.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp - mkdir -p $(dir $@) - +flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/fsim CONFIG=$* RISCV=$(abspath $(RISCV)) CHISEL_VERSION=$(CHISEL_VERSION) verilog - date > $@ - -stamps/%/fsim-ndebug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp - mkdir -p $(dir $@) - +flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/fsim CONFIG=$* RISCV=$(abspath $(RISCV)) CHISEL_VERSION=$(CHISEL_VERSION) - date > $@ - -stamps/%/fsim-debug.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp - mkdir -p $(dir $@) - +flock -x $(dir $@)/chisel-lock $(MAKE) -C $(abspath $(TOP))/fsim CONFIG=$* RISCV=$(abspath $(RISCV)) CHISEL_VERSION=$(CHISEL_VERSION) debug - date > $@ - # Runs tests on one of the simulators stamps/%/emulator-asm-tests.stamp: stamps/other-submodules.stamp $(RISCV)/install.stamp mkdir -p $(dir $@)