2023-06-15 12:24:35 -04:00
|
|
|
/* Copyright 2023 (C) Peter McGoron
|
|
|
|
* This file is a part of Upsilon, a free and open source software project.
|
|
|
|
* For license terms, refer to the files in `doc/copying` in the Upsilon
|
|
|
|
* source distribution.
|
|
|
|
*/
|
2022-09-16 18:01:34 -04:00
|
|
|
#include <memory>
|
|
|
|
#include <limits>
|
|
|
|
#include <cstdint>
|
2022-10-17 00:44:30 -04:00
|
|
|
#include <cstring>
|
|
|
|
#include <cstdlib>
|
2022-09-16 18:01:34 -04:00
|
|
|
#include <iostream>
|
|
|
|
#include <random>
|
2022-10-17 00:44:30 -04:00
|
|
|
#include <unistd.h>
|
2022-09-16 18:01:34 -04:00
|
|
|
|
|
|
|
#include <verilated.h>
|
2022-11-21 21:41:50 -05:00
|
|
|
#include "control_loop_math_implementation.h"
|
|
|
|
#include "Vcontrol_loop_sim_top.h"
|
|
|
|
using ModType = Vcontrol_loop_sim_top;
|
|
|
|
|
|
|
|
uint32_t main_time = 0;
|
|
|
|
double sc_time_stamp() {
|
|
|
|
return main_time;
|
2022-10-17 00:44:30 -04:00
|
|
|
}
|
|
|
|
|
2022-11-21 21:41:50 -05:00
|
|
|
ModType *mod;
|
2022-10-17 00:44:30 -04:00
|
|
|
|
2022-11-21 21:41:50 -05:00
|
|
|
static void run_clock() {
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
|
|
mod->clk = !mod->clk;
|
|
|
|
mod->eval();
|
|
|
|
main_time++;
|
2022-10-17 00:44:30 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-21 21:41:50 -05:00
|
|
|
static void init(int argc, char **argv) {
|
|
|
|
Verilated::commandArgs(argc, argv);
|
|
|
|
Verilated::traceEverOn(true);
|
|
|
|
mod = new ModType;
|
|
|
|
mod->clk = 0;
|
2023-06-12 15:46:12 -04:00
|
|
|
mod->rst_L = 1;
|
2022-11-21 21:41:50 -05:00
|
|
|
}
|
2022-10-17 00:44:30 -04:00
|
|
|
|
2022-11-21 21:41:50 -05:00
|
|
|
int main(int argc, char **argv) {
|
2023-06-12 15:46:12 -04:00
|
|
|
printf("sim top\n");
|
2022-11-21 21:41:50 -05:00
|
|
|
init(argc, argv);
|
2023-06-12 15:46:12 -04:00
|
|
|
Transfer func = Transfer{150, 0, 2, 1.1, 10, -1};
|
|
|
|
|
|
|
|
/* Constant values must be sized to 64 bits, or else the compiler
|
|
|
|
* will think they are 32 bit and silently mess things up
|
|
|
|
*/
|
2023-06-28 17:38:41 -04:00
|
|
|
mod->P_in = 0b11010111000010100011110101110000101000111;
|
|
|
|
mod->I_in = (V)6 << CONSTS_FRAC;
|
|
|
|
mod->delay_in = 20;
|
|
|
|
mod->setpt_in = 10000;
|
|
|
|
mod->assert_change = 1;
|
|
|
|
mod->run_loop_in = 1;
|
2023-06-12 15:46:12 -04:00
|
|
|
mod->curset = 0;
|
|
|
|
|
|
|
|
for (int tick = 0; tick < 1000;) {
|
2023-06-28 17:38:41 -04:00
|
|
|
if (mod->change_made) {
|
|
|
|
mod->assert_change = 0;
|
|
|
|
}
|
|
|
|
|
2023-06-12 15:46:12 -04:00
|
|
|
run_clock();
|
|
|
|
if (mod->request && !mod->fulfilled) {
|
|
|
|
/* Verilator values are not sign-extended to the
|
|
|
|
* size of type, so we have to do that ourselves.
|
|
|
|
*/
|
|
|
|
V ext = sign_extend(mod->curset, 20);
|
|
|
|
V val = func.val(ext);
|
|
|
|
printf("setting: %ld, val: %ld\n", ext, val);
|
|
|
|
mod->measured_value = val;
|
|
|
|
mod->fulfilled = 1;
|
|
|
|
} else if (mod->fulfilled && !mod->request) {
|
|
|
|
mod->fulfilled = 0;
|
|
|
|
tick++;
|
|
|
|
}
|
|
|
|
}
|
2022-10-17 00:44:30 -04:00
|
|
|
|
2023-06-12 15:46:12 -04:00
|
|
|
mod->final();
|
|
|
|
delete mod;
|
2022-11-21 21:41:50 -05:00
|
|
|
return 0;
|
2022-09-16 18:01:34 -04:00
|
|
|
}
|