more refactoring

This commit is contained in:
Peter McGoron 2023-01-30 13:07:34 +00:00
parent 195a9c5042
commit 4afc655104
2 changed files with 39 additions and 34 deletions

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <cstdint>
#include <verilated.h> #include <verilated.h>
#include "util.hpp"
/* https://zipcpu.com/blog/2017/06/21/looking-at-verilator.html */ /* https://zipcpu.com/blog/2017/06/21/looking-at-verilator.html */
template <class TOP> class TB { template <class TOP> class TB {
@ -14,6 +14,7 @@ template <class TOP> class TB {
TB(int argc, char *argv[], int _bailout = 0) : mod(), bailout(_bailout), vc() { TB(int argc, char *argv[], int _bailout = 0) : mod(), bailout(_bailout), vc() {
vc.commandArgs(argc, argv); vc.commandArgs(argc, argv);
vc.traceEverOn(true); vc.traceEverOn(true);
mod.clk = 0; mod.clk = 0;
tick_count = 0; tick_count = 0;
} }
@ -22,10 +23,11 @@ template <class TOP> class TB {
mod.final(); mod.final();
} }
virtual void run_clock() { void run_clock() {
mod.clk = !mod.clk; mod.clk = !mod.clk;
mod.eval(); mod.eval();
vc.timeInc(1); vc.timeInc(1);
mod.clk = !mod.clk; mod.clk = !mod.clk;
mod.eval(); mod.eval();
vc.timeInc(1); vc.timeInc(1);
@ -35,35 +37,3 @@ template <class TOP> class TB {
exit(1); exit(1);
} }
}; };
static inline void _assert(const char *file, int line, const char *exp, bool ev, const char *fmt, ...) {
if (!ev) {
va_list va;
va_start(va, fmt);
fprintf(stderr, "%s:%d: assertion failed: %s\n", file, line, exp);
vfprintf(stderr, fmt, va);
fprintf(stderr, "\n");
va_end(va);
exit(1);
}
}
#define STRINGIFY(s) #s
/* ,##__VA_ARGS__ is a GNU C extension */
#define my_assert(e, fmt, ...) _assert(__FILE__, __LINE__, STRINGIFY(e), (e), fmt ,##__VA_ARGS__)
template<typename V>
static inline V sign_extend(V x, unsigned len) {
/* if high bit is 1 */
if (x >> (len - 1) & 1) {
V mask = (1 << len) - 1;
return ~mask | x;
} else {
return x;
}
}
#define MASK(x,v) ((x) & ((1 << (v)) - 1))
template<typename V>
static inline V mask_extend(V x, unsigned len) {
return sign_extend<V>(MASK(x,len), len);
}

35
firmware/rtl/util.hpp Normal file
View File

@ -0,0 +1,35 @@
#pragma once
#include <cstdio>
static inline void _assert(const char *file, int line, const char *exp, bool ev, const char *fmt, ...) {
if (!ev) {
va_list va;
va_start(va, fmt);
fprintf(stderr, "%s:%d: assertion failed: %s\n", file, line, exp);
vfprintf(stderr, fmt, va);
fprintf(stderr, "\n");
va_end(va);
exit(1);
}
}
#define STRINGIFY(s) #s
/* ,##__VA_ARGS__ is a GNU C extension */
#define my_assert(e, fmt, ...) _assert(__FILE__, __LINE__, STRINGIFY(e), (e), fmt ,##__VA_ARGS__)
template<typename V>
static inline V sign_extend(V x, unsigned len) {
/* if high bit is 1 */
if (x >> (len - 1) & 1) {
V mask = (1 << len) - 1;
return ~mask | x;
} else {
return x;
}
}
#define MASK(x,v) ((x) & ((1 << (v)) - 1))
template<typename V>
static inline V mask_extend(V x, unsigned len) {
return sign_extend<V>(MASK(x,len), len);
}