add jtag demo and refine Makefile
This commit is contained in:
		
							parent
							
								
									a8fc3642ad
								
							
						
					
					
						commit
						5f80832b1a
					
				| 
						 | 
					@ -2,10 +2,6 @@ export RV_ROOT = ${PWD}/../..
 | 
				
			||||||
LLVMINSTALL = /home/colin/develop/llvm-build/install
 | 
					LLVMINSTALL = /home/colin/develop/llvm-build/install
 | 
				
			||||||
GCC_PREFIX = /opt/riscv/bin/riscv64-unknown-elf
 | 
					GCC_PREFIX = /opt/riscv/bin/riscv64-unknown-elf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_CFLAGS = -g -O3 -funroll-all-loops
 | 
					 | 
				
			||||||
ABI = -mabi=ilp32 -march=rv32imc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DEMODIR = ${PWD}
 | 
					DEMODIR = ${PWD}
 | 
				
			||||||
BUILD_DIR = ${DEMODIR}/build
 | 
					BUILD_DIR = ${DEMODIR}/build
 | 
				
			||||||
RV_DESIGN = ${RV_ROOT}/design
 | 
					RV_DESIGN = ${RV_ROOT}/design
 | 
				
			||||||
| 
						 | 
					@ -20,10 +16,6 @@ endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LINK = $(DEMODIR)/link.ld
 | 
					LINK = $(DEMODIR)/link.ld
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OFILES = $(TEST).o
 | 
					 | 
				
			||||||
OUTFILES = $(TEST).out
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# CFLAGS for verilator generated Makefiles. Without -std=c++11 it complains for `auto` variables
 | 
					# CFLAGS for verilator generated Makefiles. Without -std=c++11 it complains for `auto` variables
 | 
				
			||||||
CFLAGS += "-std=c++11"
 | 
					CFLAGS += "-std=c++11"
 | 
				
			||||||
# Optimization for better performance; alternative is nothing for slower runtime (faster compiles)
 | 
					# Optimization for better performance; alternative is nothing for slower runtime (faster compiles)
 | 
				
			||||||
| 
						 | 
					@ -60,25 +52,12 @@ verilator: program.hex verilator-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##################### Test hex Build #####################################
 | 
					##################### Test hex Build #####################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# program.hex: $(OFILES) $(LINK)
 | 
					program.hex: $(TEST).out
 | 
				
			||||||
# 	@echo Building $(TEST)
 | 
					 | 
				
			||||||
# 	$(GCC_PREFIX)-gcc $(ABI) -Wl,-Map=$(BUILD_DIR)/$(TEST).map -lgcc -T$(LINK) -o $(BUILD_DIR)/$(TEST).bin $(BUILD_DIR)/$(OFILES) -nostartfiles  $(TEST_LIBS)
 | 
					 | 
				
			||||||
# 	$(GCC_PREFIX)-objcopy -O verilog $(BUILD_DIR)/$(TEST).bin $(BUILD_DIR)/program.hex
 | 
					 | 
				
			||||||
# 	$(GCC_PREFIX)-objdump -S  $(BUILD_DIR)/$(TEST).bin > $(BUILD_DIR)/$(TEST).dis
 | 
					 | 
				
			||||||
# 	@echo Completed building $(TEST)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# %.o : %.s swerv_define
 | 
					 | 
				
			||||||
# 	$(GCC_PREFIX)-cpp -I${BUILD_DIR}  $<  > $(BUILD_DIR)/$*.cpp.s
 | 
					 | 
				
			||||||
# 	$(GCC_PREFIX)-as $(ABI) $(BUILD_DIR)/$*.cpp.s -o $(BUILD_DIR)/$@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
program.hex: $(OUTFILES)
 | 
					 | 
				
			||||||
	@echo Building $(TEST)
 | 
						@echo Building $(TEST)
 | 
				
			||||||
	$(GCC_PREFIX)-objcopy -O verilog $(BUILD_DIR)/$(TEST).out $(BUILD_DIR)/program.hex
 | 
						$(GCC_PREFIX)-objcopy -O verilog $(BUILD_DIR)/$(TEST).out $(BUILD_DIR)/program.hex
 | 
				
			||||||
	$(GCC_PREFIX)-objdump -S  $(BUILD_DIR)/$(TEST).out > $(BUILD_DIR)/$(TEST).dis
 | 
						$(GCC_PREFIX)-objdump -S  $(BUILD_DIR)/$(TEST).out > $(BUILD_DIR)/$(TEST).dis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##################### llvm hex Build #####################################
 | 
					build: $(TEST).out
 | 
				
			||||||
 | 
					 | 
				
			||||||
build: $(OUTFILES)
 | 
					 | 
				
			||||||
	@echo Completed building $(TEST)
 | 
						@echo Completed building $(TEST)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%.out : %.c swerv_define
 | 
					%.out : %.c swerv_define
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,75 @@
 | 
				
			||||||
 | 
					export RV_ROOT = ${PWD}/../..
 | 
				
			||||||
 | 
					LLVMINSTALL = /home/colin/develop/llvm-build/install
 | 
				
			||||||
 | 
					GCC_PREFIX = /opt/riscv/bin/riscv64-unknown-elf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_CFLAGS = -g -O3 -funroll-all-loops
 | 
				
			||||||
 | 
					ABI = -mabi=ilp32 -march=rv32imc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEMODIR = ${PWD}
 | 
				
			||||||
 | 
					BUILD_DIR = ${DEMODIR}/build
 | 
				
			||||||
 | 
					RV_DESIGN = ${RV_ROOT}/design
 | 
				
			||||||
 | 
					RV_SOC = ${RV_ROOT}/soc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST = jtag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifdef debug
 | 
				
			||||||
 | 
					 DEBUG_PLUS = +dumpon
 | 
				
			||||||
 | 
					 VERILATOR_DEBUG = --trace
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LINK = $(DEMODIR)/link.ld
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# CFLAGS for verilator generated Makefiles. Without -std=c++11 it complains for `auto` variables
 | 
				
			||||||
 | 
					CFLAGS += "-std=c++11"
 | 
				
			||||||
 | 
					# Optimization for better performance; alternative is nothing for slower runtime (faster compiles)
 | 
				
			||||||
 | 
					# -O2 for faster runtime (slower compiles), or -O for balance.
 | 
				
			||||||
 | 
					VERILATOR_MAKE_FLAGS = OPT_FAST="-Os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Targets
 | 
				
			||||||
 | 
					all: clean verilator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
						rm -rf build obj_dir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					swerv_define :
 | 
				
			||||||
 | 
						BUILD_PATH=${BUILD_DIR} PERLLIB=${RV_SOC} ${RV_SOC}/swerv.config -target=default -set iccm_enable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################### Verilog Builds #####################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					verilator-build: swerv_define
 | 
				
			||||||
 | 
						echo '`undef ASSERT_ON' >> ${BUILD_DIR}/common_defines.vh
 | 
				
			||||||
 | 
						verilator --cc -CFLAGS ${CFLAGS} \
 | 
				
			||||||
 | 
						              $(BUILD_DIR)/common_defines.vh \
 | 
				
			||||||
 | 
						              -I${BUILD_DIR} \
 | 
				
			||||||
 | 
						              -Wno-UNOPTFLAT \
 | 
				
			||||||
 | 
						              -F ${RV_SOC}/soc.mk \
 | 
				
			||||||
 | 
						              $(RV_SOC)/soc_top.sv \
 | 
				
			||||||
 | 
						              --top-module soc_top -exe test_soc_top.cpp --autoflush $(VERILATOR_DEBUG)
 | 
				
			||||||
 | 
						cp ${DEMODIR}/test_soc_top.cpp obj_dir
 | 
				
			||||||
 | 
						$(MAKE) -j -C obj_dir/ -f Vsoc_top.mk $(VERILATOR_MAKE_FLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################### Simulation Runs #####################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					verilator: program.hex verilator-build
 | 
				
			||||||
 | 
						cd build && ../obj_dir/Vsoc_top ${DEBUG_PLUS}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################### Test hex Build #####################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					program.hex: $(TEST).o $(LINK)
 | 
				
			||||||
 | 
						@echo Building $(TEST)
 | 
				
			||||||
 | 
						$(GCC_PREFIX)-gcc $(ABI) -Wl,-Map=$(BUILD_DIR)/$(TEST).map -lgcc -T$(LINK) -o $(BUILD_DIR)/$(TEST).bin $(BUILD_DIR)/$(TEST).o -nostartfiles  $(TEST_LIBS)
 | 
				
			||||||
 | 
						$(GCC_PREFIX)-objcopy -O verilog $(BUILD_DIR)/$(TEST).bin $(BUILD_DIR)/program.hex
 | 
				
			||||||
 | 
						$(GCC_PREFIX)-objdump -S  $(BUILD_DIR)/$(TEST).bin > $(BUILD_DIR)/$(TEST).dis
 | 
				
			||||||
 | 
						@echo Completed building $(TEST)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%.o : %.s swerv_define
 | 
				
			||||||
 | 
						$(GCC_PREFIX)-cpp -I${BUILD_DIR}  $<  > $(BUILD_DIR)/$*.cpp.s
 | 
				
			||||||
 | 
						$(GCC_PREFIX)-as $(ABI) $(BUILD_DIR)/$*.cpp.s -o $(BUILD_DIR)/$@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################### llvm hex Build #####################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					help:
 | 
				
			||||||
 | 
						@echo Possible targets: verilator help clean all verilator-build program.hex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: help clean verilator
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,81 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					// Copyright 2019 Western Digital Corporation or its affiliates.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Assembly code for Hello World
 | 
				
			||||||
 | 
					// Not using only ALU ops for creating the string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define STDOUT 0xd0580000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Code to execute
 | 
				
			||||||
 | 
					.section .text
 | 
				
			||||||
 | 
					.global _start
 | 
				
			||||||
 | 
					_start:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Clear minstret
 | 
				
			||||||
 | 
					    csrw minstret, zero
 | 
				
			||||||
 | 
					    csrw minstreth, zero
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Set up MTVEC - not expecting to use it though
 | 
				
			||||||
 | 
					    li x1, RV_ICCM_SADR
 | 
				
			||||||
 | 
					    csrw mtvec, x1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Enable Caches in MRAC
 | 
				
			||||||
 | 
					    li x1, 0x5f555555
 | 
				
			||||||
 | 
					    csrw 0x7c0, x1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Load string from hw_data
 | 
				
			||||||
 | 
					    // and write to stdout address
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    li x3, STDOUT
 | 
				
			||||||
 | 
					    la x4, hw_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop:
 | 
				
			||||||
 | 
					   lb x5, 0(x4)
 | 
				
			||||||
 | 
					   sb x5, 0(x3)
 | 
				
			||||||
 | 
					   addi x4, x4, 1
 | 
				
			||||||
 | 
					   bnez x5, loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   li x3, STDOUT
 | 
				
			||||||
 | 
					   la x4, hw_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop2:
 | 
				
			||||||
 | 
					   lb x5, 0(x4)
 | 
				
			||||||
 | 
					   sb x5, 0(x3)
 | 
				
			||||||
 | 
					   addi x4, x4, 1
 | 
				
			||||||
 | 
					   bnez x5, loop2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Write 0xff to STDOUT for TB to terminate test.
 | 
				
			||||||
 | 
					_finish:
 | 
				
			||||||
 | 
					    li x3, STDOUT
 | 
				
			||||||
 | 
					    addi x5, x0, 0xff
 | 
				
			||||||
 | 
					    sb x5, 0(x3)
 | 
				
			||||||
 | 
					    beq x0, x0, _finish
 | 
				
			||||||
 | 
					.rept 100
 | 
				
			||||||
 | 
					    nop
 | 
				
			||||||
 | 
					.endr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.global hw_data
 | 
				
			||||||
 | 
					.data
 | 
				
			||||||
 | 
					hw_data:
 | 
				
			||||||
 | 
					.ascii "----------------------------------\n"
 | 
				
			||||||
 | 
					.ascii "Hello World Colin.liang EH1@WDC !!\n"
 | 
				
			||||||
 | 
					.ascii "----------------------------------\n"
 | 
				
			||||||
 | 
					.byte 0
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OUTPUT_ARCH( "riscv" )
 | 
				
			||||||
 | 
					ENTRY(_start)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SECTIONS
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  . = 0;
 | 
				
			||||||
 | 
					  .text_init   : { *(.text_init*) }
 | 
				
			||||||
 | 
					  .text   : { *(.text*) }
 | 
				
			||||||
 | 
					  _end = .;
 | 
				
			||||||
 | 
					  . = 0x10000;
 | 
				
			||||||
 | 
					  .data  :  ALIGN(0x800) { *(.*data) *(.rodata*) STACK = ALIGN(16) + 0x8000; }
 | 
				
			||||||
 | 
					  .bss : { *(.bss) }
 | 
				
			||||||
 | 
					  . = 0xd0580000;
 | 
				
			||||||
 | 
					  .data.io   : { *(.data.io) }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,65 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					// Copyright 2019 Western Digital Corporation or its affiliates.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <utility>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include "Vsoc_top.h"
 | 
				
			||||||
 | 
					#include "verilated.h"
 | 
				
			||||||
 | 
					#include "verilated_vcd_c.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vluint64_t main_time = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					double sc_time_stamp () {
 | 
				
			||||||
 | 
					 return main_time;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char** argv) {
 | 
				
			||||||
 | 
					  std::cout << "\nVerilatorTB: Start of sim\n" << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verilated::commandArgs(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Vsoc_top* soc = new Vsoc_top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // init trace dump
 | 
				
			||||||
 | 
					  VerilatedVcdC* tfp = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if VM_TRACE
 | 
				
			||||||
 | 
					  Verilated::traceEverOn(true);
 | 
				
			||||||
 | 
					  tfp = new VerilatedVcdC;
 | 
				
			||||||
 | 
					  soc->trace (tfp, 24);
 | 
				
			||||||
 | 
					  tfp->open ("sim.vcd");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // Simulate
 | 
				
			||||||
 | 
					  while(!Verilated::gotFinish()){
 | 
				
			||||||
 | 
					#if VM_TRACE
 | 
				
			||||||
 | 
					      tfp->dump (main_time);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      main_time += 5;
 | 
				
			||||||
 | 
					      soc->core_clk = !soc->core_clk;
 | 
				
			||||||
 | 
					      soc->eval();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if VM_TRACE
 | 
				
			||||||
 | 
					  tfp->close();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout << "\nVerilatorTB: End of sim" << std::endl;
 | 
				
			||||||
 | 
					  exit(EXIT_SUCCESS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -447,6 +447,19 @@ module soc_top;
 | 
				
			||||||
   //=========================================================================-
 | 
					   //=========================================================================-
 | 
				
			||||||
   // RTL instance
 | 
					   // RTL instance
 | 
				
			||||||
   //=========================================================================-
 | 
					   //=========================================================================-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jtagdpi jtagdpi(
 | 
				
			||||||
 | 
					    .clk_i(core_clk),
 | 
				
			||||||
 | 
					    .rst_ni(rst_l),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .jtag_tck(jtag_tck),
 | 
				
			||||||
 | 
					    .jtag_tms(jtag_tms),
 | 
				
			||||||
 | 
					    .jtag_tdi(jtag_tdi),
 | 
				
			||||||
 | 
					    .jtag_tdo(jtag_tdo),
 | 
				
			||||||
 | 
					    .jtag_trst_n(jtag_trst_n),
 | 
				
			||||||
 | 
					    .jtag_srst_n()
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
swerv_wrapper rvtop (
 | 
					swerv_wrapper rvtop (
 | 
				
			||||||
    .rst_l                  ( rst_l         ),
 | 
					    .rst_l                  ( rst_l         ),
 | 
				
			||||||
    .dbg_rst_l              ( porst_l       ),
 | 
					    .dbg_rst_l              ( porst_l       ),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue