OpenCores
URL https://opencores.org/ocsvn/fwrisc/fwrisc/trunk

Subversion Repositories fwrisc

[/] [fwrisc/] [trunk/] [ve/] [fwrisc_fpga/] [tests/] [fwrisc_fpga_tests.cpp] - Rev 2

Compare with Previous | Blame | View Log

/*
 * fwrisc_fpga_tests.cpp
 *
 *  Created on: Nov 21, 2018
 *      Author: ballance
 */
 
#include "fwrisc_fpga_tests.h"
#include "GoogletestVlCmdlineProcessor.h"
 
fwrisc_fpga_tests::fwrisc_fpga_tests() {
 
	m_led = [&](uint8_t led0, uint8_t led1) { };
 
}
 
fwrisc_fpga_tests::~fwrisc_fpga_tests() {
	// TODO Auto-generated destructor stub
}
 
void fwrisc_fpga_tests::SetUp() {
	const GoogletestVlCmdlineProcessor &clp = GoogletestVlCmdlineProcessor::instance();
	std::string elf_file, v;
 
	BaseT::SetUp();
	addClock(top()->clock, 20);
 
	m_trace_funcs = clp.has_plusarg("+TRACE_FUNCS");
	m_trace_instr = clp.has_plusarg("+TRACE_INSTR");
 
 
	clp.get_plusarg_value("+SW_IMAGE", elf_file);
 
	if (!m_symtab.read(elf_file)) {
		fprintf(stdout, "Error: failed to read elf file\n");
	}
 
	test = this;
}
 
void fwrisc_fpga_tests::regwrite(uint32_t raddr, uint32_t rdata) {
 
}
 
void fwrisc_fpga_tests::exec(uint32_t addr, uint32_t instr) {
	if (m_trace_funcs) {
	if (m_call_stack.size() == 0) {
		// Look for an entry symbol
		int32_t sym_idx;
 
		if ((sym_idx = m_symtab.find_sym(addr)) != -1) {
			if (sym_idx+1 >= m_symtab.n_syms()) {
				fprintf(stdout, "Error: entering the last symbol in the file\n");
				fflush(stdout);
			}
			const Elf32_Sym &next = m_symtab.get_sym(sym_idx+1);
			const std::string &func = m_symtab.get_sym_name(sym_idx);
			if (m_filter_funcs.find(func) == m_filter_funcs.end()) {
				fprintf(stdout, "%s==> %s\n", m_indent.c_str(), func.c_str());
				fflush(stdout);
			}
			m_call_stack.push(std::pair<Elf32_Addr,Elf32_Addr>(addr,next.st_value-4));
			m_indent.append("  ");
		}
	} else {
		// We should be in a function
		const std::pair<Elf32_Addr,Elf32_Addr> &func = m_call_stack.top();
 
		if (addr < func.first || addr > func.second) {
			// We're outside the current function
			int32_t sym_idx;
 
			if ((sym_idx = m_symtab.find_sym(addr)) != -1) {
				// We jumped to the beginning of a new function
				// Consider this entering a new function
				if (sym_idx+1 >= m_symtab.n_syms()) {
					fprintf(stdout, "Error: entering the last symbol in the file\n");
					fflush(stdout);
				}
				const Elf32_Sym &next = m_symtab.get_sym(sym_idx+1);
				const std::string &func = m_symtab.get_sym_name(sym_idx);
				if (m_filter_funcs.find(func) == m_filter_funcs.end()) {
					fprintf(stdout, "%s==> %s\n", m_indent.c_str(), func.c_str());
					fflush(stdout);
				}
				m_call_stack.push(std::pair<Elf32_Addr,Elf32_Addr>(addr,next.st_value-4));
				m_indent.append("  ");
			} else {
				sym_idx = m_symtab.find_sym(func.first);
				// Consider this exiting the current scope
				m_call_stack.pop();
 
				const std::pair<Elf32_Addr,Elf32_Addr> &new_func = m_call_stack.top();
 
				m_indent = m_indent.substr(0, m_indent.size()-2);
				if (addr >= new_func.first && addr <= new_func.second) {
					const std::string &func = m_symtab.get_sym_name(sym_idx);
					if (m_filter_funcs.find(func) == m_filter_funcs.end()) {
						fprintf(stdout, "%s<== %s\n", m_indent.c_str(), func.c_str());
						fflush(stdout);
					}
				} else {
//					fprintf(stdout, "Error: left function for unknown scope 0x%08x..0x%08x (0x%08x)\n",
//							new_func.first, new_func.second, addr);
//					fflush(stdout);
				}
			}
		}
	}
	}
	if (m_trace_instr) {
		fprintf(stdout, "EXEC: 0x%08x\n", addr);
	}
}
 
void fwrisc_fpga_tests::memwrite(uint32_t addr, uint8_t mask, uint32_t data) {
 
}
 
void fwrisc_fpga_tests::led(uint8_t led0, uint8_t led1) {
	m_led(led0, led1);
}
 
TEST_F(fwrisc_fpga_tests, led_flash) {
	uint32_t cnt = 0;
 
	raiseObjection(this);
	m_led = [&](uint8_t led0, uint8_t led1) {
		uint32_t exp = (led0 | (led1 << 1));
		cnt++;
 
		EXPECT_EQ((cnt&3), exp);
 
		if (cnt > 16) {
			dropObjection(this);
		}
		fprintf(stdout, "led0=%d led1=%d\n", led0, led1);
	};
	run(100000);
}
 
TEST_F(fwrisc_fpga_tests, zephyr_hello_world) {
	raiseObjection(this);
	run(100000000);
}
 
fwrisc_fpga_tests *fwrisc_fpga_tests::test = 0;
 
extern "C" int unsigned fwrisc_tracer_bfm_register(const char *path) {
	fprintf(stdout, "register: %s\n", path);
	return 0;
}
 
extern "C" void fwrisc_tracer_bfm_regwrite(unsigned int id, unsigned int raddr, unsigned int rdata) {
	fwrisc_fpga_tests::test->regwrite(raddr, rdata);
}
 
extern "C" void fwrisc_tracer_bfm_memwrite(unsigned int id, unsigned int addr, unsigned char mask, unsigned int data) {
	fwrisc_fpga_tests::test->memwrite(addr, mask, data);
}
 
extern "C" void fwrisc_tracer_bfm_exec(unsigned int id, unsigned int addr, unsigned int instr) {
	fwrisc_fpga_tests::test->exec(addr, instr);
}
 
extern "C" void fwrisc_fpga_tb_led(uint8_t led0, uint8_t led1) {
	fwrisc_fpga_tests::test->led(led0, led1);
}
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.