initial commit
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
/Makefrag.pkgs
|
||||
target
|
||||
*.jar
|
||||
*.stamp
|
||||
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
[submodule "rocket-chip"]
|
||||
path = rocket-chip
|
||||
url = git@github.com:ucb-bar/rocket-chip.git
|
||||
[submodule "testchipip"]
|
||||
path = testchipip
|
||||
url = git@github.com:ucb-bar/testchipip.git
|
||||
40
Makefrag
Normal file
40
Makefrag
Normal file
@@ -0,0 +1,40 @@
|
||||
lib_dir=$(base_dir)/lib
|
||||
|
||||
ROCKETCHIP_DIR=$(base_dir)/rocket-chip
|
||||
EXTRA_PACKAGES=testchipip
|
||||
|
||||
rocketchip_stamp=$(base_dir)/lib/rocketchip.stamp
|
||||
SBT ?= java -Xmx2G -Xss8M -XX:MaxPermSize=256M -jar $(ROCKETCHIP_DIR)/sbt-launch.jar
|
||||
extra_stamps = $(addprefix $(lib_dir)/,$(addsuffix .stamp,$(EXTRA_PACKAGES)))
|
||||
|
||||
lookup_scala_srcs = $(shell find $(1)/ -iname "*.scala" 2> /dev/null)
|
||||
|
||||
libs: $(rocketchip_stamp) $(extra_stamps)
|
||||
|
||||
$(rocketchip_stamp): $(call lookup_scala_srcs, $(ROCKETCHIP_DIR))
|
||||
cd $(ROCKETCHIP_DIR) && $(SBT) pack
|
||||
mkdir -p $(lib_dir)
|
||||
cp $(ROCKETCHIP_DIR)/target/pack/lib/*.jar $(lib_dir)
|
||||
touch $(rocketchip_stamp)
|
||||
|
||||
-include $(base_dir)/Makefrag.pkgs
|
||||
|
||||
$(base_dir)/Makefrag.pkgs: $(base_dir)/generate-pkg-mk.sh
|
||||
bash $(base_dir)/generate-pkg-mk.sh $(EXTRA_PACKAGES) > $@
|
||||
|
||||
FIRRTL_JAR ?= $(ROCKETCHIP_DIR)/firrtl/utils/bin/firrtl.jar
|
||||
FIRRTL ?= java -Xmx2G -Xss8M -XX:MaxPermSize=256M -cp $(FIRRTL_JAR) firrtl.Driver
|
||||
|
||||
$(FIRRTL_JAR): $(call lookup_scala_srcs, $(ROCKETCHIP_DIR)/firrtl/src/main/scala)
|
||||
$(MAKE) -C $(ROCKETCHIP_DIR)/firrtl SBT="$(SBT)" root_dir=$(ROCKETCHIP_DIR)/firrtl build-scala
|
||||
|
||||
build_dir=$(sim_dir)/generated-src
|
||||
|
||||
CHISEL_ARGS ?=
|
||||
|
||||
$(build_dir)/$(PROJECT).$(MODEL).$(CONFIG).fir: $(rocketchip_stamp) $(extra_stamps) $(call lookup_scala_srcs,$(base_dir)/src/main/scala)
|
||||
mkdir -p $(build_dir)
|
||||
cd $(base_dir) && $(SBT) "run-main $(PROJECT).Generator $(CHISEL_ARGS) $(build_dir) $(PROJECT) $(MODEL) $(CFG_PROJECT) $(CONFIG)"
|
||||
|
||||
$(build_dir)/$(PROJECT).$(MODEL).$(CONFIG).v: $(build_dir)/$(PROJECT).$(MODEL).$(CONFIG).fir $(FIRRTL_JAR)
|
||||
$(FIRRTL) -i $< -o $@ -X verilog
|
||||
2
bootrom/.gitignore
vendored
Normal file
2
bootrom/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*.elf
|
||||
*.dump
|
||||
16
bootrom/Makefile
Normal file
16
bootrom/Makefile
Normal file
@@ -0,0 +1,16 @@
|
||||
bootrom_img = bootrom.img
|
||||
|
||||
GCC=riscv64-unknown-elf-gcc
|
||||
OBJCOPY=riscv64-unknown-elf-objcopy
|
||||
OBJDUMP=riscv64-unknown-elf-objdump
|
||||
|
||||
all: $(bootrom_img)
|
||||
|
||||
%.img: %.elf
|
||||
$(OBJCOPY) -O binary --change-addresses=-0x1000 --only-section .text $< $@
|
||||
|
||||
%.elf: %.S linker.ld
|
||||
$(GCC) -Tlinker.ld $< -nostdlib -static -o $@
|
||||
|
||||
%.dump: %.elf
|
||||
$(OBJDUMP) -d $< > $@
|
||||
35
bootrom/bootrom.S
Normal file
35
bootrom/bootrom.S
Normal file
@@ -0,0 +1,35 @@
|
||||
.text
|
||||
.global _start
|
||||
_start:
|
||||
// This boot ROM doesn't know about any boot devices, so it just spins,
|
||||
// waiting for the serial interface to load the program and interrupt it
|
||||
j setup_wfi_loop // reset vector
|
||||
.word 0 // reserved
|
||||
.word 0 // reserved
|
||||
.word 0 // pointer to config string
|
||||
default_trap_vec:
|
||||
j boot_trap // default trap vector
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
|
||||
setup_wfi_loop:
|
||||
la a0, default_trap_vec
|
||||
csrw mtvec, a0
|
||||
li a0, 8 // MIE or MSIP bit
|
||||
csrw mie, a0 // set only MSIP in mie CSR
|
||||
csrw mideleg, zero // no delegation
|
||||
csrs mstatus, a0 // set MIE in mstatus CSR
|
||||
wfi_loop:
|
||||
wfi
|
||||
j wfi_loop
|
||||
|
||||
boot_trap:
|
||||
csrr a0, mhartid
|
||||
sll a0, a0, 2 // offset for hart msip
|
||||
li a1, 0x2000000 // base address of clint
|
||||
add a0, a0, a1
|
||||
sw zero, 0(a0) // clear the interrupt
|
||||
li a0, 0x80000000 // program reset vector
|
||||
csrw mepc, a0 // return from interrupt to start of user program
|
||||
mret
|
||||
BIN
bootrom/bootrom.img
Executable file
BIN
bootrom/bootrom.img
Executable file
Binary file not shown.
5
bootrom/linker.ld
Normal file
5
bootrom/linker.ld
Normal file
@@ -0,0 +1,5 @@
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x1000;
|
||||
.text : { *(.text) }
|
||||
}
|
||||
7
build.sbt
Normal file
7
build.sbt
Normal file
@@ -0,0 +1,7 @@
|
||||
organization := "edu.berkeley.cs"
|
||||
|
||||
version := "1.0"
|
||||
|
||||
name := "testchip-example"
|
||||
|
||||
scalaVersion := "2.11.7"
|
||||
16
generate-pkg-mk.sh
Executable file
16
generate-pkg-mk.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
base_dir=$(dirname $0)
|
||||
|
||||
for pkg in $@
|
||||
do
|
||||
pkg_dir="${base_dir}/${pkg}"
|
||||
cat <<MAKE
|
||||
${base_dir}/lib/${pkg}.stamp: \$(call lookup_scala_srcs, ${pkg_dir}) \$(rocketchip_stamp)
|
||||
rm -f ${pkg_dir}/lib
|
||||
ln -s ${base_dir}/lib ${pkg_dir}/lib
|
||||
cd ${pkg_dir} && \$(SBT) package
|
||||
cp ${pkg_dir}/target/scala-2.11/*.jar ${base_dir}/lib
|
||||
touch \$@
|
||||
MAKE
|
||||
done
|
||||
1
rocket-chip
Submodule
1
rocket-chip
Submodule
Submodule rocket-chip added at f069052969
18
src/main/scala/Configs.scala
Normal file
18
src/main/scala/Configs.scala
Normal file
@@ -0,0 +1,18 @@
|
||||
package example
|
||||
|
||||
import cde.{Parameters, Config, CDEMatchError}
|
||||
import testchipip.WithSerialAdapter
|
||||
import chisel3._
|
||||
import diplomacy.LazyModule
|
||||
|
||||
class WithExampleTop extends Config(
|
||||
(pname, site, here) => pname match {
|
||||
case BuildExampleTop => (p: Parameters) => LazyModule(new ExampleTop(p))
|
||||
case _ => throw new CDEMatchError
|
||||
})
|
||||
|
||||
class SerialAdapterConfig extends Config(
|
||||
new WithSerialAdapter ++ new rocketchip.BaseConfig)
|
||||
|
||||
class DefaultExampleConfig extends Config(
|
||||
new WithExampleTop ++ new SerialAdapterConfig)
|
||||
37
src/main/scala/TestHarness.scala
Normal file
37
src/main/scala/TestHarness.scala
Normal file
@@ -0,0 +1,37 @@
|
||||
package example
|
||||
|
||||
import util.GeneratorApp
|
||||
import diplomacy.LazyModule
|
||||
import rocketchip._
|
||||
import testchipip._
|
||||
import chisel3._
|
||||
import cde.{Parameters, Field}
|
||||
|
||||
case object BuildExampleTop extends Field[Parameters => ExampleTop]
|
||||
|
||||
class TestHarness(implicit val p: Parameters) extends Module {
|
||||
val io = new Bundle {
|
||||
val success = Bool(OUTPUT)
|
||||
}
|
||||
|
||||
def buildTop(p: Parameters): ExampleTop = LazyModule(new ExampleTop(p))
|
||||
|
||||
val dut = p(BuildExampleTop)(p).module
|
||||
val ser = Module(new SimSerialWrapper(p(SerialInterfaceWidth)))
|
||||
|
||||
val nMemChannels = dut.io.mem_axi.size
|
||||
for (axi <- dut.io.mem_axi) {
|
||||
val mem = Module(new SimAXIMem(BigInt(p(ExtMemSize) / nMemChannels)))
|
||||
mem.io.axi <> axi
|
||||
}
|
||||
|
||||
ser.io.serial <> dut.io.serial
|
||||
io.success := ser.io.exit
|
||||
}
|
||||
|
||||
object Generator extends GeneratorApp {
|
||||
val longName = names.topModuleProject + "." +
|
||||
names.topModuleClass + "." +
|
||||
names.configs
|
||||
generateFirrtl
|
||||
}
|
||||
24
src/main/scala/Top.scala
Normal file
24
src/main/scala/Top.scala
Normal file
@@ -0,0 +1,24 @@
|
||||
package example
|
||||
|
||||
import chisel3._
|
||||
import cde.Parameters
|
||||
import diplomacy.LazyModule
|
||||
import testchipip._
|
||||
import rocketchip._
|
||||
|
||||
class ExampleTop(q: Parameters) extends BaseTop(q)
|
||||
with PeripheryBootROM with PeripheryCoreplexLocalInterrupter
|
||||
with PeripherySerial with PeripheryMasterMem {
|
||||
override lazy val module = Module(
|
||||
new ExampleTopModule(p, this, new ExampleTopBundle(p)))
|
||||
}
|
||||
|
||||
class ExampleTopBundle(p: Parameters) extends BaseTopBundle(p)
|
||||
with PeripheryBootROMBundle with PeripheryCoreplexLocalInterrupterBundle
|
||||
with PeripheryMasterMemBundle with PeripherySerialBundle
|
||||
|
||||
class ExampleTopModule(p: Parameters, l: ExampleTop, b: => ExampleTopBundle)
|
||||
extends BaseTopModule(p, l, b)
|
||||
with PeripheryBootROMModule with PeripheryCoreplexLocalInterrupterModule
|
||||
with PeripheryMasterMemModule with PeripherySerialModule
|
||||
with HardwiredResetVector with DirectConnection with NoDebug
|
||||
1
testchipip
Submodule
1
testchipip
Submodule
Submodule testchipip added at a326110250
7
vsim/.gitignore
vendored
Normal file
7
vsim/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
/DVEfiles
|
||||
/csrc
|
||||
/simv-*
|
||||
/output
|
||||
/generated-src
|
||||
/ucli.key
|
||||
/vc_hdrs.h
|
||||
55
vsim/Makefile
Normal file
55
vsim/Makefile
Normal file
@@ -0,0 +1,55 @@
|
||||
base_dir=$(abspath ..)
|
||||
sim_dir=$(abspath .)
|
||||
|
||||
PROJECT ?= example
|
||||
MODEL ?= TestHarness
|
||||
CONFIG ?= DefaultExampleConfig
|
||||
CFG_PROJECT ?= $(PROJECT)
|
||||
TB ?= TestDriver
|
||||
|
||||
simv = simv-$(PROJECT)-$(CONFIG)
|
||||
simv_debug = simv-$(PROJECT)-$(CONFIG)-debug
|
||||
|
||||
default: $(simv)
|
||||
|
||||
debug: $(simv_debug)
|
||||
|
||||
include $(base_dir)/Makefrag
|
||||
|
||||
sim_vsrcs = \
|
||||
$(build_dir)/$(PROJECT).$(MODEL).$(CONFIG).v \
|
||||
$(base_dir)/testchipip/vsrc/TestDriver.v \
|
||||
$(base_dir)/testchipip/vsrc/SimSerial.v
|
||||
|
||||
sim_csrcs = \
|
||||
$(base_dir)/testchipip/csrc/SimSerial.cc
|
||||
|
||||
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 "-std=c++11" \
|
||||
-CC "-Wl,-rpath,$(RISCV)/lib" \
|
||||
$(RISCV)/lib/libfesvr.so \
|
||||
-sverilog \
|
||||
+incdir+$(generated_dir) \
|
||||
+define+CLOCK_PERIOD=1.0 $(sim_vsrcs) $(sim_csrcs) \
|
||||
+define+PRINTF_COND=$(TB).printf_cond \
|
||||
+define+STOP_COND=!$(TB).reset \
|
||||
+define+RANDOMIZE_MEM_INIT \
|
||||
+define+RANDOMIZE_REG_INIT \
|
||||
+define+RANDOMIZE_GARBAGE_ASSIGN \
|
||||
+define+RANDOMIZE_INVALID_ASSIGN \
|
||||
+libext+.v \
|
||||
|
||||
verilog: $(sim_vsrcs)
|
||||
|
||||
$(simv): $(sim_vsrcs) $(sim_csrcs)
|
||||
rm -rf csrc && $(VCS) $(VCS_OPTS) -o $@ \
|
||||
-debug_pp
|
||||
|
||||
$(simv_debug) : $(sim_vsrcs) $(sim_csrcs)
|
||||
rm -rf csrc && $(VCS) $(VCS_OPTS) -o $@ \
|
||||
+define+DEBUG -debug_pp
|
||||
Reference in New Issue
Block a user