diff --git a/Makefrag b/Makefrag
index dcf52542..5139bdde 100644
--- a/Makefrag
+++ b/Makefrag
@@ -64,7 +64,6 @@ $(sim_dir)/libdramsim.a: $(DRAMSIM_OBJS)
params_file = $(generated_dir)/$(MODEL).$(CONFIG).prm
consts_header = $(generated_dir)/consts.$(CONFIG).h
-scr_header = $(generated_dir)/$(MODEL).$(CONFIG).scr_map.h
$(consts_header): $(params_file)
echo "#ifndef __CONST_H__" > $@
echo "#define __CONST_H__" >> $@
@@ -80,4 +79,3 @@ $(consts_header_debug): $(params_file_debug)
sed -r 's/\(([A-Za-z0-9_]+),([A-Za-z0-9_]+)\)/#define \1 \2/' $< >> $@
echo "#define TBFRAG \"$(MODEL).$(CONFIG).tb.cpp\"" >> $@
echo "#endif // __CONST_H__" >> $@
-scr_header_debug = $(generated_dir_debug)/$(MODEL).$(CONFIG).scr_map.h
diff --git a/README.md b/README.md
index 8756aca1..0ddac104 100644
--- a/README.md
+++ b/README.md
@@ -81,13 +81,27 @@ Similarly, to generate VLSI-synthesizable verilog (output will be in `vsim/gener
$ cd vsim
$ make verilog
-### Updating To A Newer Version Of Chisel
-To grab a newer version of chisel:
+### Keeping Your Repo Up-to-Date
- $ git submodule update --init
- $ cd chisel
+If you are trying to keep your repo up to date with this github repo,
+you also need to keep the submodules and tools up to date.
+
+ $ # Get the newest versions of the files in this repo
$ git pull origin master
+ $ # Make sure the submodules have the correct versions
+ $ git submodule update --init --recursive
+
+If riscv-tools version changes, you should recompile and install riscv-tools according to the directions in the [riscv-tools/README](https://github.com/riscv/riscv-tools/blob/master/README.md).
+
+ $ cd riscv-tools
+ $ ./build.sh
+
+If firrtl version changes and you are using Chisel3, you may need to clean and recompile:
+
+ $ cd firrtl
+ $ sbt clean
+ $ sbt assembly
## What's in the Rocket chip generator repository?
@@ -101,11 +115,12 @@ at Berkeley, the ability to compose a subset of private and public
sub-repositories on a per-chip basis is a killer feature of git
submodule.
-So, which submodules are actually included in this chip's repository?
+### The Submodules
+
Here's a look at all the git submodules that are currently tracked in
the rocket-chip repository:
-* **chisel**
+* **chisel2**
([https://github.com/ucb-bar/chisel](https://github.com/ucb-bar/chisel)):
At Berkeley, we write RTL in Chisel. For those who are not familiar
with Chisel, please go take a look at
@@ -117,6 +132,17 @@ and hence it was easiest to use submodule to track bleeding edge commits
to Chisel, which contained a bunch of new features and bug fixes. As
Chisel gets more stable, we will likely replace this submodule with an
external dependency.
+* **chisel3**
+([https://github.com/ucb-bar/chisel3](https://github.com/ucb-bar/chisel3)):
+Chisel3 is a newer version of Chisel, which is based on FIRRTL. The Chisel
+code in this repository is generally compatible with both Chisel2 and Chisel3.
+The [chisel3/README](https://github.com/ucb-bar/chisel3/blob/master/README.md).gives
+instructions on how to build your design with Chisel3 instead of Chisel2.
+* **firrtl**
+([https://github.com/ucb-bar/firrtl](https://github.com/ucb-bar/firrtl)):
+FIRRTL (Flexible Internal Representation for RTL) is the intermediate format
+which Chisel3 is based upon. The Chisel3 compiler generates a FIRRTL representation,
+from which the final product (Verilog code, C code, etc) is generated.
* **rocket**
([https://github.com/ucb-bar/rocket](https://github.com/ucb-bar/rocket)):
The rocket repository holds the actual source code of the Rocket core.
@@ -129,8 +155,12 @@ core within a memory system and connects it to the outside world.
([https://github.com/ucb-bar/uncore](https://github.com/ucb-bar/uncore)):
This repository implements the uncore logic, such as the coherence hub
(the agent that keeps multiple L1 D$ coherent). The definition of the
-coherent interfaces between tiles ("tilelink") and the interface to the
-host machine ("htif") also live in this repository.
+coherent interfaces between tiles ("tilelink") and the debug interface
+also live in this repository.
+* **junctions**
+([https://github.com/ucb-bar/junctions](https://github.com/ucb-bar/junctions)):
+This repository contains code and
+converters for various bus protocols and interfaces.
* **hardfloat**
([https://github.com/ucb-bar/berkeley-hardfloat](https://github.com/ucb-bar/berkeley-hardfloat)):
This repository holds the parameterized IEEE 754-2008 compliant
@@ -142,6 +172,12 @@ has an additional bit) to handle subnormal numbers more efficiently in
the processor. Please take a look at the
[README](https://github.com/ucb-bar/berkeley-hardfloat/blob/master/README.md)
in the repository for more information.
+* **context-dependent-environments**
+([https://github.com/ucb-bar/context-dependent-environments](https://github.com/ucb-bar/context-dependent-environments)):
+The rocket-chip Chisel code is highly parameterizable, and utilizes the classes in
+this subrepo to set and pass parameters to different levels of the design. Note that in
+Chisel2, this was handled by Chisel itself, but has been moved into a seperate
+library for use with Chisel3.
* **dramsim2**
([https://github.com/dramninjasUMD/DRAMSim2](https://github.com/dramninjasUMD/DRAMSim2)):
Currently, the DRAM memory system is implemented in the testbench. We
@@ -155,9 +191,22 @@ committed in the rocket-chip repository.
We tag a version of riscv-tools that works with the RTL committed in the
rocket-chip repository. Once the software toolchain stabilizes, we
might turn this submodule into an external dependency.
+* **groundtest**
+([https://github.com/ucb-bar/groundtest](https://github.com/ucb-bar/groundtest)):
+This repository contains code which can test the uncore by generating randomized
+instruction streams. It replaces the rocket processor with an instruction
+stream generator to stress-test the uncore portions of the design.
+* **torture**
+([https://github.com/ucb-bar/torture](https://github.com/ucb-bar/torture)):
+The torture test code is used to generate randomized instruction streams which
+are then run as code on the rocket core(s). These are constrained random tests
+to stress-test both the core and uncore portions of the design.
-Next, take a look at rocket-chip's src/main/scala directory. There are a
-couple Chisel source files including RocketChip.scala, which
+### The Submodules
+
+Next, take a look at rocket-chip's src/main/scala directory.
+This directory has the Chisel source files including the top level
+RocketChip.scala, which
instantiates both a Rocket core and the uncore logic, and then glues
them together. Here's a brief overview of source files found in the
rocket-chip repository:
@@ -184,37 +233,46 @@ down to Verilog. Pretty neat huh?
implements logic to interface with an arbitrary number of slow
single-ended digital I/Os when implementing a test chip.
-Now you should take a look at the top-level I/O pins. Open up
+Take a look at the top-level I/O pins. Open up
src/main/scala/RocketChip.scala, and search for TopIO. You will read the
-following (note, HostIO is defined in uncore/src/main/scala/htif.scala,
-and MemIO is defined in uncore/src/main/scala/memserdes.scala):
+following:
- class TopIO extends Bundle {
- val host = new HostIO
- val mem = new MemIO
- val mem_backup_en = Bool(INPUT)
- val in_mem_ready = Bool(OUTPUT)
- val in_mem_valid = Bool(INPUT)
- val out_mem_ready = Bool(INPUT)
- val out_mem_valid = Bool(OUTPUT)
+ /** Top-level io for the chip */
+ class BasicTopIO(implicit val p: Parameters) extends ParameterizedBundle()(p)
+ with HasTopLevelParameters
+
+ class TopIO(implicit p: Parameters) extends BasicTopIO()(p) {
+
+ val mem_axi = Vec(nMemAXIChannels, new NastiIO)
+ val mem_ahb = Vec(nMemAHBChannels, new HastiMasterIO)
+ val interrupts = Vec(p(NExtInterrupts), Bool()).asInput
+ val mmio_axi = Vec(p(NExtMMIOAXIChannels), new NastiIO)
+ val mmio_ahb = Vec(p(NExtMMIOAHBChannels), new HastiMasterIO)
+ val debug = new DebugBusIO()(p).flip
}
-There are 3 major I/O ports coming out of the top-level module:
+
+There are 5 major I/O ports coming out of the top-level module:
-* **Host-target interface (HostIO)**: The host system talks to the
+* **Host-target interface (host)**: The host system talks to the
target machine via this host-target interface. We serialize a simple
-protocol over this parameterized interface. More details will come.
-* **High-performance memory interface (MemIO, mem\_backup\_en=false)**:
-When mem\_backup\_en is tied low, all memory requests from the processor
-comes out the MemIO port. The MemIO port uses the same uncore clock, and
+protocol over this parameterized interface. This interface is slated
+for removal in the near future.
+* **Debug interface (debug)**:
+The debug interface can be used to both debug the processor as
+it is executing, and to read and write memory. It is slated to repalce the
+host interface in the near future.
+* **High-performance memory interface (mem_*) **:
+Memory requests from the processor comes out the mem_* ports.
+Depending on the configuration of the design, these may be visible as
+AXI or AHB protocol. The mem_* port(s) uses the same uncore clock, and
is intended to be connected to something on the same chip.
-* **Low-performance memory interface (parts of HostIO, in\_mem\_\*,
-out\_mem\_\*, mem\_backup\_en=true)**: When mem\_backup\_en is tied
-high, all memory requests from the processor comes out the
-low-performance memory interface. To save actual pins on a test chip, we
-multiplex the data pins of the host-target interface with the serialized
-low-performance memory port. That's the reason why you only see the
-control pins (in\_mem\_* and out\_mem\_*).
+* ** Memory mapped I/O interface (mmio_*) **:
+The optional mmio_* interfaces can be used to communicate with devices
+on the chip but outside of the rocket-chip boundary. Depending on the
+configuration of the design, these may be visible as AXI or AHB.
+* ** Interrupts interface (interrupts) **: This interface is used to
+deliver external interrupts to the processor core.
Of course, there's a lot more in the actual submodules, but hopefully
this would be enough to get you started with using the Rocket chip
@@ -227,7 +285,7 @@ list.
Chisel can generate code for three targets: a high-performance
cycle-accurate C++ emulator, Verilog optimized for FPGAs, and Verilog
-for VLSI. The Rocket chip generator can target all three backends. You
+for VLSI. The rocket-chip generator can target all three backends. You
will need a Java runtime installed on your machine, since Chisel is
overlaid on top of [Scala](http://www.scala-lang.org/). Chisel RTL (i.e.
rocket-chip source code) is a Scala program executing on top of your
@@ -314,7 +372,7 @@ emulator/output/rv64ui-p-add.out:
C0: 484 [1] pc=[0000000213c] W[r29=000000007fff8000][1] R[r31=ffffffff80007ffe] R[r31=0000000000000005] inst=[7fff8eb7] lui t3, 0x7fff8
C0: 485 [0] pc=[00000002140] W[r 0=0000000000000000][0] R[r 0=0000000000000000] R[r 0=0000000000000000] inst=[00000000] unknown
-This means at cycle 483, core 0, the first [1] shows that there's a
+The first [1] at cycle 483, core 0, shows that there's a
valid instruction at PC 0x2138 in the writeback stage, which is
0x002081b3 (add s1, ra, s0). The second [1] tells us that the register
file is writing r3 with the corresponding value 0x7fff7fff. When the add
@@ -443,6 +501,18 @@ This parameterization is one of the many strengths of processor
generators written in Chisel, and will be more detailed in a future blog
post, so please stay tuned.
+To override specific configuration items, such as the number of external interrupts,
+you can create your own Configuration(s) and compose them with Config's ++ operator
+
+ class WithNExtInterrupts extends Config (nExt: Int) {
+ (pname, site, here) => pname match {
+ case (NExtInterrupts => nExt)
+ }
+ }
+ class MyConfig extends Config (new WithNExtInterrupts(16) ++ new DefaultSmallConfig)
+
+Then you can build as usual with CONFIG=MyConfig.
+
## Contributors
- Scott Beamer
diff --git a/csrc/htif_emulator.h b/csrc/htif_emulator.h
deleted file mode 100644
index cb55efac..00000000
--- a/csrc/htif_emulator.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// See LICENSE for license details.
-
-#ifndef _HTIF_EMULATOR_H
-#define _HTIF_EMULATOR_H
-
-#include
-
-class htif_emulator_t : public htif_pthread_t
-{
- int memory_channel_mux_select;
-
- public:
- htif_emulator_t(const std::vector& args)
- : htif_pthread_t(args),
- memory_channel_mux_select(0)
- {
- for (const auto& arg: args) {
- if (!strncmp(arg.c_str(), "+memory_channel_mux_select=", 27))
- memory_channel_mux_select = atoi(arg.c_str()+27);
- }
- }
-
- void set_clock_divisor(int divisor, int hold_cycles)
- {
-#ifdef UNCORE_SCR__HTIF_IO_CLOCK_DIVISOR__OFFSET
- /* We only want to write the HTIF clock divisor SCR on targets where it
- * actually exists (there isn't one on the FPGA, for example). */
- write_cr(-1, UNCORE_SCR__HTIF_IO_CLOCK_DIVISOR__OFFSET, divisor | hold_cycles << 16);
-#endif
- }
-
- void start()
- {
- set_clock_divisor(5, 2);
- htif_pthread_t::start();
- }
-};
-
-#endif
diff --git a/emulator/Makefrag-emulator b/emulator/Makefrag-emulator
index 642b58c6..78903c17 100644
--- a/emulator/Makefrag-emulator
+++ b/emulator/Makefrag-emulator
@@ -22,10 +22,10 @@ $(generated_dir_debug)/%.o: $(generated_dir_debug)/%.cpp $(generated_dir_debug)/
$(CXX) $(CXXFLAGS) -I$(generated_dir_debug) -c -o $@ $<
$(addsuffix .o,$(CXXSRCS)): %.o: $(base_dir)/csrc/%.cc $(base_dir)/csrc/*.h $(model_header) $(consts_header)
- $(CXX) $(CXXFLAGS) -include $(scr_header) -include $(model_header) -include $(consts_header) -I$(generated_dir) -c -o $@ $<
+ $(CXX) $(CXXFLAGS) -include $(model_header) -include $(consts_header) -I$(generated_dir) -c -o $@ $<
$(addsuffix .debug.o,$(CXXSRCS)): %.debug.o: $(base_dir)/csrc/%.cc $(base_dir)/csrc/*.h $(model_header_debug) $(consts_header_debug)
- $(CXX) $(CXXFLAGS) -include $(scr_header_debug) -include $(model_header_debug) -include $(consts_header_debug) -I$(generated_dir_debug) -c -o $@ $<
+ $(CXX) $(CXXFLAGS) -include $(model_header_debug) -include $(consts_header_debug) -I$(generated_dir_debug) -c -o $@ $<
$(generated_dir)/%.$(CONFIG).d $(generated_dir)/%.$(CONFIG).h $(generated_dir)/%.$(CONFIG).prm: $(chisel_srcs)
cd $(base_dir) && $(SBT) "project $(PROJECT)" "run $(CHISEL_ARGS) --noIoDebug"
diff --git a/emulator/Makefrag-verilator b/emulator/Makefrag-verilator
index efa78f9e..ec6ea36a 100644
--- a/emulator/Makefrag-verilator
+++ b/emulator/Makefrag-verilator
@@ -69,12 +69,12 @@ $(emu): $(verilog) $(cppfiles) libdramsim.a $(consts_header) $(INSTALLED_VERILAT
mkdir -p $(generated_dir)/$(MODEL).$(CONFIG)
$(VERILATOR) $(VERILATOR_FLAGS) -Mdir $(generated_dir)/$(MODEL).$(CONFIG) \
-o $(abspath $(sim_dir))/$@ $< $(cppfiles) -LDFLAGS "$(LDFLAGS)" \
- -CFLAGS "-I$(generated_dir) -include $(model_header) -include $(consts_header) -include $(scr_header)"
+ -CFLAGS "-I$(generated_dir) -include $(model_header) -include $(consts_header)"
$(MAKE) -C $(generated_dir)/$(MODEL).$(CONFIG) -f V$(MODEL).mk
$(emu_debug): $(verilog_debug) $(cppfiles) libdramsim.a $(consts_header_debug) $(generated_dir)/$(MODEL).$(CONFIG).d $(INSTALLED_VERILATOR)
mkdir -p $(generated_dir_debug)/$(MODEL).$(CONFIG)
$(VERILATOR) $(VERILATOR_FLAGS) -Mdir $(generated_dir_debug)/$(MODEL).$(CONFIG) --trace \
-o $(abspath $(sim_dir))/$@ $< $(cppfiles) -LDFLAGS "$(LDFLAGS)" \
- -CFLAGS "-I$(generated_dir_debug) -include $(model_header_debug) -include $(consts_header_debug) -include $(scr_header_debug)"
+ -CFLAGS "-I$(generated_dir_debug) -include $(model_header_debug) -include $(consts_header_debug)"
$(MAKE) -C $(generated_dir_debug)/$(MODEL).$(CONFIG) -f V$(MODEL).mk
diff --git a/fsim/Makefrag b/fsim/Makefrag
index 77997cb2..d075b8a5 100644
--- a/fsim/Makefrag
+++ b/fsim/Makefrag
@@ -39,7 +39,6 @@ VCS_OPTS = -notice -line +lint=all,noVCDE,noONGS,noUI -error=PCWM-L -timescale=1
-CC "-std=c++11" \
-CC "-Wl,-rpath,$(RISCV)/lib" \
-CC "-include $(consts_header)" \
- -CC "-include $(scr_header)" \
-e vcs_main \
$(RISCV)/lib/libfesvr.so \
$(sim_dir)/libdramsim.a \
diff --git a/groundtest b/groundtest
index e636d7a4..146200e4 160000
--- a/groundtest
+++ b/groundtest
@@ -1 +1 @@
-Subproject commit e636d7a4ff1a6fe11f6fd4ee8ad2588becae68ae
+Subproject commit 146200e473bd969a4c1d5b9bf349f9b3b72adee8
diff --git a/rocket b/rocket
index 781b814e..36e02ac9 160000
--- a/rocket
+++ b/rocket
@@ -1 +1 @@
-Subproject commit 781b814e1b333262eb78c5b62c6aabf4b6afc9d3
+Subproject commit 36e02ac94a8b2fbaa057bee37b2f7ed2a72dd227
diff --git a/src/main/scala/Configs.scala b/src/main/scala/Configs.scala
index 9f64a747..ffbea713 100644
--- a/src/main/scala/Configs.scala
+++ b/src/main/scala/Configs.scala
@@ -108,12 +108,6 @@ class BaseConfig extends Config (
lazy val innerDataBits = site(MIFDataBits)
lazy val innerDataBeats = (8 * site(CacheBlockBytes)) / innerDataBits
pname match {
- case HtifKey => HtifParameters(
- width = Dump("HTIF_WIDTH", 16),
- nSCR = 64,
- csrDataBits = site(XLen),
- offsetBits = site(CacheBlockOffsetBits),
- nCores = site(NTiles))
//Memory Parameters
case PAddrBits => 32
case PgIdxBits => 12
@@ -312,7 +306,6 @@ class BaseConfig extends Config (
case BankIdLSB => 0
case CacheBlockBytes => Dump("CACHE_BLOCK_BYTES", 64)
case CacheBlockOffsetBits => log2Up(here(CacheBlockBytes))
- case UseHtifClockDiv => true
case ConfigString => makeConfigString()
case GlobalAddrMap => globalAddrMap
case _ => throw new CDEMatchError
@@ -413,7 +406,6 @@ class WithRV32 extends Config(
class FPGAConfig extends Config (
(pname,site,here) => pname match {
case NAcquireTransactors => 4
- case UseHtifClockDiv => false
case _ => throw new CDEMatchError
}
)
diff --git a/src/main/scala/RocketChip.scala b/src/main/scala/RocketChip.scala
index ea945283..80297587 100644
--- a/src/main/scala/RocketChip.scala
+++ b/src/main/scala/RocketChip.scala
@@ -31,8 +31,6 @@ case object NOutstandingMemReqsPerChannel extends Field[Int]
/** Number of exteral MMIO ports */
case object NExtMMIOAXIChannels extends Field[Int]
case object NExtMMIOAHBChannels extends Field[Int]
-/** Whether to divide HTIF clock */
-case object UseHtifClockDiv extends Field[Boolean]
/** Function for building some kind of coherence manager agent */
case object BuildL2CoherenceManager extends Field[(Int, Parameters) => CoherenceAgent]
/** Function for building some kind of tile connected to a reset signal */
@@ -66,11 +64,6 @@ trait HasTopLevelParameters {
lazy val mifAddrBits = p(MIFAddrBits)
lazy val mifDataBeats = p(MIFDataBeats)
lazy val xLen = p(XLen)
- lazy val nSCR = p(HtifKey).nSCR
- lazy val scrAddrBits = log2Up(nSCR)
- lazy val scrDataBits = 64
- lazy val scrDataBytes = scrDataBits / 8
- //require(lsb + log2Up(nBanks) < mifAddrBits)
}
class MemBackupCtrlIO extends Bundle {
@@ -176,7 +169,6 @@ class Top(topParams: Parameters) extends Module with HasTopLevelParameters {
/** Wrapper around everything that isn't a Tile.
*
* Usually this is clocked and/or place-and-routed separately from the Tiles.
- * Contains the Host-Target InterFace module (HTIF).
*/
class Uncore(implicit val p: Parameters) extends Module
with HasTopLevelParameters {
diff --git a/src/main/scala/Testing.scala b/src/main/scala/Testing.scala
index c76e625e..f4cf72ad 100644
--- a/src/main/scala/Testing.scala
+++ b/src/main/scala/Testing.scala
@@ -5,7 +5,6 @@ package rocketchip
import Chisel._
import scala.collection.mutable.{LinkedHashSet,LinkedHashMap}
import cde.{Parameters, ParameterDump, Config}
-import uncore.AllSCRFiles
abstract class RocketTestSuite {
val dir: String
@@ -201,7 +200,4 @@ object TestGenerator extends App with FileSystemUtilities {
val w = createOutputFile(configClassName + ".cst")
w.write(world.getConstraints)
w.close
- val scr_map_hdr = createOutputFile(topModuleName + "." + configClassName + ".scr_map.h")
- AllSCRFiles.foreach{ map => scr_map_hdr.write(map.as_c_header) }
- scr_map_hdr.close
}
diff --git a/uncore b/uncore
index b92487d5..85ba64a9 160000
--- a/uncore
+++ b/uncore
@@ -1 +1 @@
-Subproject commit b92487d5934d9efba0e960466455c32c36874c81
+Subproject commit 85ba64a92cc8d6efefb3dcedaf1319355e3f3db1
diff --git a/vsim/Makefrag b/vsim/Makefrag
index 9910425d..f0240edf 100644
--- a/vsim/Makefrag
+++ b/vsim/Makefrag
@@ -38,7 +38,6 @@ VCS_OPTS = -notice -line +lint=all,noVCDE,noONGS,noUI -error=PCWM-L -timescale=1
-CC "-std=c++11" \
-CC "-Wl,-rpath,$(RISCV)/lib" \
-CC "-include $(consts_header)" \
- -CC "-include $(scr_header)" \
-e vcs_main \
$(RISCV)/lib/libfesvr.so \
$(sim_dir)/libdramsim.a \