summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-05-12 13:28:53 -0600
committerAlejandro Soto <alejandro@34project.org>2024-05-12 18:13:02 -0600
commitde49ebb80d1e2ef8283818332a0ac6bf5d70440d (patch)
treefc437474dfe336a43dd4fca9cd31ed150a435868
parente581090bb9e7965c463be35544395406f5a5441d (diff)
platform/wavelet3d: implement JTAG TAP bridge in simulation
Diffstat (limited to '')
-rw-r--r--flake.nix1
-rw-r--r--platform/wavelet3d/main.cpp317
-rw-r--r--platform/wavelet3d/mod.mk2
-rw-r--r--platform/wavelet3d/openocd.cfg32
-rw-r--r--platform/wavelet3d/remote_bitbang.cpp300
-rw-r--r--platform/wavelet3d/remote_bitbang.h53
-rw-r--r--platform/wavelet3d/w3d_top.sv103
7 files changed, 411 insertions, 397 deletions
diff --git a/flake.nix b/flake.nix
index 2432421..dec75ab 100644
--- a/flake.nix
+++ b/flake.nix
@@ -141,6 +141,7 @@
meson
ninja
lcov
+ openocd
pkg-config
(python3.withPackages (py: with py; [
cocotb
diff --git a/platform/wavelet3d/main.cpp b/platform/wavelet3d/main.cpp
index 77cde26..1530f87 100644
--- a/platform/wavelet3d/main.cpp
+++ b/platform/wavelet3d/main.cpp
@@ -15,6 +15,8 @@
#include "Vtop.h"
+#include "remote_bitbang.h"
+
int main(int argc, char **argv)
{
Verilated::commandArgs(argc, argv);
@@ -45,311 +47,32 @@ int main(int argc, char **argv)
top.clk = 0;
};
- auto send_op = [&](auto a, const char *op, auto b)
- {
- std::printf
- (
- "[%03d] <= %s %s %s\n",
- time, std::to_string(a).c_str(), op, std::to_string(b).c_str()
- );
-
- top.a[0] = *reinterpret_cast<unsigned*>(&a);
- top.b[0] = *reinterpret_cast<unsigned*>(&b);
- top.in_valid = 1;
- cycle();
-
- top.a[0] = 0;
- top.b[0] = 0;
- top.in_valid = 0;
- };
-
- auto int_to_fp = [&](int a)
- {
- top.setup_mul_float = 0;
- top.setup_unit_b = 1;
- top.mnorm_put_hi = 0;
- top.mnorm_put_lo = 1;
- top.mnorm_put_mul = 0;
- top.mnorm_zero_flags = 1;
- top.mnorm_zero_b = 1;
- top.minmax_abs = 1;
- top.minmax_swap = 0;
- top.minmax_zero_min = 0;
- top.minmax_copy_flags = 0;
- top.shiftr_int_signed = 1;
- top.addsub_int_operand = 1;
- top.addsub_copy_flags = 1;
- top.clz_force_nop = 0;
- top.shiftl_copy_flags = 0;
- top.round_copy_flags = 0;
- top.round_enable = 1;
- top.encode_enable = 1;
-
- send_op(a, "fp->int", 0);
- };
-
- auto mul_int = [&](unsigned a, unsigned b)
- {
- top.setup_mul_float = 0;
- top.setup_unit_b = 0;
- top.mnorm_put_hi = 0;
- top.mnorm_put_lo = 1;
- top.mnorm_put_mul = 0;
- top.mnorm_zero_flags = 1;
- top.mnorm_zero_b = 1;
- top.minmax_abs = 1;
- top.minmax_swap = 0;
- top.minmax_zero_min = 0;
- top.minmax_copy_flags = 1;
- top.shiftr_int_signed = 0;
- top.addsub_int_operand = 0;
- top.addsub_copy_flags = 1;
- top.clz_force_nop = 1;
- top.shiftl_copy_flags = 1;
- top.round_copy_flags = 1;
- top.round_enable = 0;
- top.encode_enable = 0;
-
- send_op(a, "*", b);
- };
-
- // mul fp
- auto mul_fp = [&](float a, float b)
- {
- top.setup_mul_float = 1;
- top.setup_unit_b = 0;
- top.mnorm_put_hi = 0;
- top.mnorm_put_lo = 0;
- top.mnorm_put_mul = 1;
- top.mnorm_zero_flags = 0;
- top.mnorm_zero_b = 1;
- top.minmax_abs = 1;
- top.minmax_swap = 0;
- top.minmax_zero_min = 0;
- top.minmax_copy_flags = 1;
- top.shiftr_int_signed = 0;
- top.addsub_int_operand = 0;
- top.addsub_copy_flags = 1;
- top.clz_force_nop = 1;
- top.shiftl_copy_flags = 1;
- top.round_copy_flags = 1;
- top.round_enable = 1;
- top.encode_enable = 1;
-
- send_op(a, "*", b);
- };
-
- auto add_fp = [&](float a, float b)
- {
- top.setup_mul_float = 0;
- top.setup_unit_b = 1;
- top.mnorm_put_hi = 0;
- top.mnorm_put_lo = 1;
- top.mnorm_put_mul = 0;
- top.mnorm_zero_flags = 0;
- top.mnorm_zero_b = 0;
- top.minmax_abs = 1;
- top.minmax_swap = 0;
- top.minmax_zero_min = 0;
- top.minmax_copy_flags = 0;
- top.shiftr_int_signed = 0;
- top.addsub_int_operand = 0;
- top.addsub_copy_flags = 0;
- top.clz_force_nop = 0;
- top.shiftl_copy_flags = 0;
- top.round_copy_flags = 0;
- top.round_enable = 1;
- top.encode_enable = 1;
-
- send_op(a, "+", b);
- };
-
- auto min_max_fp = [&](float a, float b, bool min = false)
- {
- top.setup_mul_float = 0;
- top.setup_unit_b = 1;
- top.mnorm_put_hi = 0;
- top.mnorm_put_lo = 1;
- top.mnorm_put_mul = 0;
- top.mnorm_zero_flags = 0;
- top.mnorm_zero_b = 0;
- top.minmax_abs = 0;
- top.minmax_swap = min;
- top.minmax_zero_min = 1;
- top.minmax_copy_flags = 1;
- top.shiftr_int_signed = 0;
- top.addsub_int_operand = 0;
- top.addsub_copy_flags = 1;
- top.clz_force_nop = 1;
- top.shiftl_copy_flags = 1;
- top.round_copy_flags = 1;
- top.round_enable = 0;
- top.encode_enable = 0;
-
- send_op(a, min ? "min" : "max", b);
- };
-
top.clk = 0;
top.rst_n = 0;
- top.in_valid = 0;
- top.geom_tvalid = 0;
- top.raster_tready = 0;
+ top.jtag_tck = 0;
+ top.jtag_tms = 0;
+ top.jtag_tdi = 0;
cycle();
top.rst_n = 1;
cycle();
- int a, b;
- float a_flt, b_flt;
-
- std::cout << "a_int: ";
- std::cin >> a;
- std::cout << "b_int: ";
- std::cin >> b;
- std::cout << "a_flt: ";
- std::cin >> a_flt;
- std::cout << "b_flt: ";
- std::cin >> b_flt;
-
- int_to_fp(a);
- mul_int(a, b);
- mul_fp(a_flt, b_flt);
- add_fp(a_flt, b_flt);
- min_max_fp(a_flt, b_flt);
- min_max_fp(a_flt, b_flt, true);
-
- float a_x, a_y, b_x, b_y, c_x, c_y;
- std::cout << "a_x: ";
- std::cin >> a_x;
- std::cout << "a_y: ";
- std::cin >> a_y;
- std::cout << "b_x: ";
- std::cin >> b_x;
- std::cout << "b_y: ";
- std::cin >> b_y;
- std::cout << "c_x: ";
- std::cin >> c_x;
- std::cout << "c_y: ";
- std::cin >> c_y;
-
- unsigned cycles;
- std::cout << "cycles: ";
- std::cin >> cycles;
-
- constexpr int FIXED_FRAC = 10;
-
- int geom[] = {
- 42,
- static_cast<int>(::ldexpf(a_x, FIXED_FRAC)),
- static_cast<int>(::ldexpf(b_x, FIXED_FRAC)),
- static_cast<int>(::ldexpf(c_x, FIXED_FRAC)),
- static_cast<int>(::ldexpf(a_y, FIXED_FRAC)),
- static_cast<int>(::ldexpf(b_y, FIXED_FRAC)),
- static_cast<int>(::ldexpf(c_y, FIXED_FRAC)),
- };
-
- ::SDL_Event event;
- ::SDL_Renderer *renderer;
- ::SDL_Window *window;
-
- //FIXME: errores
- ::SDL_Init(SDL_INIT_VIDEO);
- ::SDL_CreateWindowAndRenderer(640, 480, 0, &window, &renderer);
- ::SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
- ::SDL_RenderClear(renderer);
-
- ::SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0);
+ rbs_init(1234);
- int bary_idx = 0, x_coarse, y_coarse, x_fine, y_fine;
- int geom_state = 0;
- int bit;
- float barys[3];
- unsigned mask;
- unsigned geom_idx = 0;
-
- top.raster_tready = 1;
- while (time < 2 * cycles) {
+ do {
cycle();
- if (top.out_valid) {
- unsigned q_bits = top.q[0];
- int q_int = *reinterpret_cast<int*>(&q_bits);
- float q_flt = *reinterpret_cast<float*>(&q_bits);
-
- std::printf
- (
- "[%03d] => q=0x%08x, q_flt=%g, q_int=%d, q_uint=%u\n",
- time, q_bits, q_flt, q_int, q_bits
- );
- }
-
- if (geom_idx < sizeof geom / sizeof geom[0]) {
- top.geom_tdata = geom[geom_idx];
- top.geom_tlast = geom_idx == sizeof geom / sizeof geom[0] - 1;
- top.geom_tvalid = 1;
-
- top.eval();
- if (top.geom_tready)
- geom_idx++;
- } else {
- top.geom_tlast = 0;
- top.geom_tvalid = 0;
- }
-
- if (top.raster_tvalid) {
- unsigned data = top.raster_tdata;
- auto fixed = ::ldexpf(static_cast<float>(static_cast<int>(data)), -FIXED_FRAC);
-
- //std::printf("[%03d] raster[%c] d=0x%08x, d_fix=%g\n",
- // time, top.raster_tlast ? 'l' : '-', data, fixed);
+ unsigned char tck = top.jtag_tck;
+ unsigned char tms = top.jtag_tms;
+ unsigned char tdi = top.jtag_tdi;
+ unsigned char trstn = 1;
- switch (geom_state) {
- case 0:
- geom_state = 1;
- break;
+ rbs_tick(&tck, &tms, &tdi, &trstn, top.jtag_tdo);
- case 1:
- y_coarse = (static_cast<int>(data) >> 16 << 2) + 480/2;
- x_coarse = (static_cast<short>(data & 0xffff) << 2) + 640/2;
- geom_state = 2;
- ::SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0);
- for (int dy = 0; dy < 4; ++dy)
- for (int dx = 0; dx < 4; ++dx)
- ::SDL_RenderDrawPoint(renderer, x_coarse + dx, y_coarse + dy);
- break;
-
- case 2:
- mask = data;
- geom_state = 3;
- break;
-
- case 3:
- bit = ::ffs(mask) - 1;
- barys[bary_idx] = fixed;
- switch (bary_idx) {
- case 0:
- bary_idx = 1;
- break;
- case 1:
- bary_idx = 2;
- break;
- case 2:
- bary_idx = 0;
- mask = mask & ~(1 << bit);
- y_fine = y_coarse + (bit >> 2);
- x_fine = x_coarse + (bit & 0b11);
-
- ::SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0);
- ::SDL_RenderDrawPoint(renderer, x_fine, y_fine);
-
- break;
- }
- if (top.raster_tlast)
- geom_state = 0;
- break;
- }
- }
- }
+ top.jtag_tck = tck;
+ top.jtag_tms = tms;
+ top.jtag_tdi = tdi;
+ } while (!(client_fd < 0));
#if VM_TRACE
trace.close();
@@ -357,13 +80,5 @@ int main(int argc, char **argv)
top.final();
- ::SDL_RenderPresent(renderer);
- while (!::SDL_PollEvent(&event) || event.type != SDL_QUIT)
- continue;
-
- ::SDL_DestroyRenderer(renderer);
- ::SDL_DestroyWindow(window);
- ::SDL_Quit();
-
return EXIT_SUCCESS;
}
diff --git a/platform/wavelet3d/mod.mk b/platform/wavelet3d/mod.mk
index c30766e..05e435e 100644
--- a/platform/wavelet3d/mod.mk
+++ b/platform/wavelet3d/mod.mk
@@ -5,6 +5,6 @@ define core
$(this)/rtl_dirs := .
$(this)/rtl_files := w3d_top.sv
- $(this)/vl_main := main.cpp
+ $(this)/vl_main := main.cpp remote_bitbang.cpp
$(this)/vl_pkgconfig := sdl2
endef
diff --git a/platform/wavelet3d/openocd.cfg b/platform/wavelet3d/openocd.cfg
new file mode 100644
index 0000000..f801f6a
--- /dev/null
+++ b/platform/wavelet3d/openocd.cfg
@@ -0,0 +1,32 @@
+debug_level 0
+adapter speed 10000
+
+adapter driver remote_bitbang
+remote_bitbang host localhost
+
+remote_bitbang port 1234
+
+# we don't have srst
+reset_config trst_only
+
+set _CHIPNAME riscv
+set _TARGETNAME $_CHIPNAME.cpu
+
+jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10002FFF
+target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME
+
+foreach t [jtag names] {
+ puts [format "TAP: %s\n" $t]
+}
+
+target create $_TARGETNAME riscv -chain-position $_TARGETNAME
+
+riscv set_reset_timeout_sec 2000
+riscv set_command_timeout_sec 2000
+riscv set_prefer_sba on
+
+scan_chain
+init
+reset halt
+
+echo "Ready for Remote Connections on port 3333."
diff --git a/platform/wavelet3d/remote_bitbang.cpp b/platform/wavelet3d/remote_bitbang.cpp
new file mode 100644
index 0000000..5e87233
--- /dev/null
+++ b/platform/wavelet3d/remote_bitbang.cpp
@@ -0,0 +1,300 @@
+// https://github.com/pulp-platform/riscv-dbg/blob/master/tb/remote_bitbang/remote_bitbang.c
+// See LICENSE.Berkeley for license details.
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "remote_bitbang.h"
+
+//Public globals, declared in remote_bitbang.h
+
+int rbs_err;
+
+unsigned char tck;
+unsigned char tms;
+unsigned char tdi;
+unsigned char trstn;
+unsigned char tdo;
+unsigned char quit;
+
+int socket_fd;
+int client_fd;
+
+//static const ssize_t buf_size = 64 * 1024;
+char recv_buf[64 * 1024];
+ssize_t recv_start, recv_end;
+
+int rbs_init(uint16_t port)
+{
+ socket_fd = 0;
+ client_fd = 0;
+ recv_start = 0;
+ recv_end = 0;
+ rbs_err = 0;
+
+ socket_fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (socket_fd == -1) {
+ fprintf(stderr, "remote_bitbang failed to make socket: %s (%d)\n",
+ strerror(errno), errno);
+ abort();
+ }
+
+ fcntl(socket_fd, F_SETFL, O_NONBLOCK);
+ int reuseaddr = 1;
+ if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
+ sizeof(int)) == -1) {
+ fprintf(stderr, "remote_bitbang failed setsockopt: %s (%d)\n",
+ strerror(errno), errno);
+ abort();
+ }
+
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = INADDR_ANY;
+ addr.sin_port = htons(port);
+
+ if (bind(socket_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ fprintf(stderr, "remote_bitbang failed to bind socket: %s (%d)\n",
+ strerror(errno), errno);
+ abort();
+ }
+
+ if (listen(socket_fd, 1) == -1) {
+ fprintf(stderr, "remote_bitbang failed to listen on socket: %s (%d)\n",
+ strerror(errno), errno);
+ abort();
+ }
+
+ socklen_t addrlen = sizeof(addr);
+ if (getsockname(socket_fd, (struct sockaddr *)&addr, &addrlen) == -1) {
+ fprintf(stderr, "remote_bitbang getsockname failed: %s (%d)\n",
+ strerror(errno), errno);
+ abort();
+ }
+
+ tck = 1;
+ tms = 1;
+ tdi = 1;
+ trstn = 1;
+ quit = 0;
+
+ fprintf(stderr, "JTAG remote bitbang server is ready\n");
+ fprintf(stderr, "Listening on port %d\n", ntohs(addr.sin_port));
+ return 1;
+}
+
+void rbs_accept()
+{
+ fprintf(stderr, "Attempting to accept client socket\n");
+ int again = 1;
+ while (again != 0) {
+ client_fd = accept(socket_fd, NULL, NULL);
+ if (client_fd == -1) {
+ if (errno == EAGAIN) {
+ // No client waiting to connect right now.
+ } else {
+ fprintf(stderr, "failed to accept on socket: %s (%d)\n",
+ strerror(errno), errno);
+ again = 0;
+ abort();
+ }
+ } else {
+ fcntl(client_fd, F_SETFL, O_NONBLOCK);
+ fprintf(stderr, "Accepted successfully.\n");
+ again = 0;
+ }
+ }
+}
+
+void rbs_tick(unsigned char *jtag_tck, unsigned char *jtag_tms,
+ unsigned char *jtag_tdi, unsigned char *jtag_trstn,
+ unsigned char jtag_tdo)
+{
+ if (client_fd > 0) {
+ tdo = jtag_tdo;
+ rbs_execute_command();
+ } else {
+ rbs_accept();
+ }
+
+ *jtag_tck = tck;
+ *jtag_tms = tms;
+ *jtag_tdi = tdi;
+ *jtag_trstn = trstn;
+}
+
+void rbs_reset()
+{
+ trstn = 0;
+}
+
+void rbs_set()
+{
+ trstn = 1;
+}
+
+void rbs_set_pins(char _tck, char _tms, char _tdi)
+{
+ tck = _tck;
+ tms = _tms;
+ tdi = _tdi;
+}
+
+void rbs_execute_command()
+{
+ char command;
+ int again = 1;
+ while (again) {
+ ssize_t num_read = read(client_fd, &command, sizeof(command));
+ if (num_read == -1) {
+ if (errno == EAGAIN) {
+ // We'll try again the next call.
+ if (VERBOSE)
+ fprintf(
+ stderr,
+ "Received no command. Will try again on the next call\n");
+ } else {
+ fprintf(stderr,
+ "remote_bitbang failed to read on socket: %s (%d)\n",
+ strerror(errno), errno);
+ again = 0;
+ abort();
+ }
+ } else if (num_read == 0) {
+ fprintf(stderr, "No command received. Stopping further reads.\n");
+ close(client_fd);
+ client_fd = -1;
+ // again = 1;
+ return;
+ } else {
+ again = 0;
+ }
+ }
+
+ int dosend = 0;
+
+ char tosend = '?';
+
+ switch (command) {
+ case 'B':
+ if (VERBOSE)
+ fprintf(stderr, "*BLINK*\n");
+ break;
+ case 'b':
+ if (VERBOSE)
+ fprintf(stderr, "blink off\n");
+ break;
+ case 'r':
+ if (VERBOSE)
+ fprintf(stderr, "r-reset\n");
+ rbs_set(); //r-reset command deasserts TRST. See: openocd/blob/master/doc/manual/jtag/drivers/remote_bitbang.txt
+ break;
+ case 's':
+ if (VERBOSE)
+ fprintf(stderr, "s-reset\n");
+ rbs_set(); //s-reset command deasserts TRST. See: openocd/blob/master/doc/manual/jtag/drivers/remote_bitbang.txt
+ break;
+ case 't':
+ if (VERBOSE)
+ fprintf(stderr, "t-reset\n");
+ rbs_reset(); //t-reset command asserts TRST. See: openocd/blob/master/doc/manual/jtag/drivers/remote_bitbang.txt
+ break;
+ case 'u':
+ if (VERBOSE)
+ fprintf(stderr, "u-reset\n");
+ rbs_reset(); //u-reset command asserts TRST. See: openocd/blob/master/doc/manual/jtag/drivers/remote_bitbang.txt
+ break;
+ case '0':
+ if (VERBOSE)
+ fprintf(stderr, "Write 0 0 0\n");
+ rbs_set_pins(0, 0, 0);
+ break;
+ case '1':
+ if (VERBOSE)
+ fprintf(stderr, "Write 0 0 1\n");
+ rbs_set_pins(0, 0, 1);
+ break;
+ case '2':
+ if (VERBOSE)
+ fprintf(stderr, "Write 0 1 0\n");
+ rbs_set_pins(0, 1, 0);
+ break;
+ case '3':
+ if (VERBOSE)
+ fprintf(stderr, "Write 0 1 1\n");
+ rbs_set_pins(0, 1, 1);
+ break;
+ case '4':
+ if (VERBOSE)
+ fprintf(stderr, "Write 1 0 0\n");
+ rbs_set_pins(1, 0, 0);
+ break;
+ case '5':
+ if (VERBOSE)
+ fprintf(stderr, "Write 1 0 1\n");
+ rbs_set_pins(1, 0, 1);
+ break;
+ case '6':
+ if (VERBOSE)
+ fprintf(stderr, "Write 1 1 0\n");
+ rbs_set_pins(1, 1, 0);
+ break;
+ case '7':
+ if (VERBOSE)
+ fprintf(stderr, "Write 1 1 1\n");
+ rbs_set_pins(1, 1, 1);
+ break;
+ case 'R':
+ if (VERBOSE)
+ fprintf(stderr, "Read req\n");
+ dosend = 1;
+ tosend = tdo ? '1' : '0';
+ break;
+ case 'Q':
+ if (VERBOSE)
+ fprintf(stderr, "Quit req\n");
+ quit = 1;
+ break;
+ default:
+ fprintf(stderr, "remote_bitbang got unsupported command '%c'\n",
+ command);
+ }
+ if (dosend) {
+ while (1) {
+ ssize_t bytes = write(client_fd, &tosend, sizeof(tosend));
+ if (bytes == -1) {
+ fprintf(stderr, "failed to write to socket: %s (%d)\n",
+ strerror(errno), errno);
+ abort();
+ }
+ if (bytes > 0) {
+ break;
+ }
+ }
+ }
+
+ if (quit) {
+ fprintf(stderr, "Remote end disconnected\n");
+ close(client_fd);
+ client_fd = 0;
+ }
+}
+
+unsigned char rbs_done()
+{
+ return quit;
+}
+
+int rbs_exit_code()
+{
+ return rbs_err;
+}
diff --git a/platform/wavelet3d/remote_bitbang.h b/platform/wavelet3d/remote_bitbang.h
new file mode 100644
index 0000000..0e294e8
--- /dev/null
+++ b/platform/wavelet3d/remote_bitbang.h
@@ -0,0 +1,53 @@
+// https://github.com/pulp-platform/riscv-dbg/blob/master/tb/remote_bitbang/remote_bitbang.h
+// See LICENSE.Berkeley for license details.
+
+#ifndef REMOTE_BITBANG_H
+#define REMOTE_BITBANG_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#define VERBOSE 0
+
+extern int rbs_err;
+
+extern unsigned char tck;
+extern unsigned char tms;
+extern unsigned char tdi;
+extern unsigned char trstn;
+extern unsigned char tdo;
+extern unsigned char quit;
+
+extern int socket_fd;
+extern int client_fd;
+
+//static const ssize_t buf_size = 64 * 1024;
+extern char recv_buf[64 * 1024];
+extern ssize_t recv_start, recv_end;
+
+// Create a new server, listening for connections from localhost on the given
+// port.
+int rbs_init(uint16_t port);
+
+// Do a bit of work.
+void rbs_tick(unsigned char *jtag_tck, unsigned char *jtag_tms,
+ unsigned char *jtag_tdi, unsigned char *jtag_trstn,
+ unsigned char jtag_tdo);
+
+unsigned char rbs_done();
+
+int rbs_exit_code();
+
+// Check for a client connecting, and accept if there is one.
+void rbs_accept();
+// Execute any commands the client has for us.
+// But we only execute 1 because we need time for the
+// simulation to run.
+void rbs_execute_command();
+
+void rbs_reset(); //Assert TRST
+void rbs_set(); //Deassert TRST
+
+void rbs_set_pins(char _tck, char _tms, char _tdi);
+
+#endif
diff --git a/platform/wavelet3d/w3d_top.sv b/platform/wavelet3d/w3d_top.sv
index 0875ba2..2b24ec4 100644
--- a/platform/wavelet3d/w3d_top.sv
+++ b/platform/wavelet3d/w3d_top.sv
@@ -1,92 +1,25 @@
module w3d_top
-import gfx::*;
(
input logic clk,
rst_n,
- input word a[SHADER_LANES],
- b[SHADER_LANES],
- input logic in_valid,
- setup_mul_float,
- setup_unit_b,
- mnorm_put_hi,
- mnorm_put_lo,
- mnorm_put_mul,
- mnorm_zero_b,
- mnorm_zero_flags,
- minmax_abs,
- minmax_swap,
- minmax_zero_min,
- minmax_copy_flags,
- shiftr_int_signed,
- addsub_copy_flags,
- addsub_int_operand,
- clz_force_nop,
- shiftl_copy_flags,
- round_copy_flags,
- round_enable,
- encode_enable,
+ input logic jtag_tck,
+ jtag_tms,
+ jtag_tdi,
- output logic out_valid,
- output word q[SHADER_LANES],
-
- input word geom_tdata,
- input logic geom_tlast,
- geom_tvalid,
- output logic geom_tready,
-
- input logic raster_tready,
- output logic raster_tlast,
- raster_tvalid,
- output word raster_tdata
+ output logic jtag_tdo
);
- gfx_wb fpint_wb();
if_tap host_jtag();
if_axib dram(), host_dbus(), host_ibus();
if_axil external_io(), gfx_ctrl();
- if_pkts coverage(), geometry();
- gfx_regfile_io fpint_io();
logic srst_n;
- assign q = fpint_wb.rx.lanes;
- assign out_valid = fpint_wb.rx.valid;
-
- assign geometry.tx.tdata = geom_tdata;
- assign geometry.tx.tlast = geom_tlast;
- assign geometry.tx.tvalid = geom_tvalid;
- assign geom_tready = geometry.tx.tready;
-
- assign raster_tdata = coverage.rx.tdata;
- assign raster_tlast = coverage.rx.tlast;
- assign raster_tvalid = coverage.rx.tvalid;
- assign coverage.rx.tready = raster_tready;
-
- fpint_op op;
- assign op.writeback = 1;
- assign op.setup_mul_float = setup_mul_float;
- assign op.setup_unit_b = setup_unit_b;
- assign op.mnorm_put_hi = mnorm_put_hi;
- assign op.mnorm_put_lo = mnorm_put_lo;
- assign op.mnorm_put_mul = mnorm_put_mul;
- assign op.mnorm_zero_b = mnorm_zero_b;
- assign op.mnorm_zero_flags = mnorm_zero_flags;
- assign op.minmax_abs = minmax_abs;
- assign op.minmax_swap = minmax_swap;
- assign op.minmax_zero_min = minmax_zero_min;
- assign op.minmax_copy_flags = minmax_copy_flags;
- assign op.shiftr_int_signed = shiftr_int_signed;
- assign op.addsub_copy_flags = addsub_copy_flags;
- assign op.addsub_int_operand = addsub_int_operand;
- assign op.clz_force_nop = clz_force_nop;
- assign op.shiftl_copy_flags = shiftl_copy_flags;
- assign op.round_copy_flags = round_copy_flags;
- assign op.round_enable = round_enable;
- assign op.encode_enable = encode_enable;
-
- assign fpint_io.regs.a = a;
- assign fpint_io.regs.b = b;
+ assign jtag_tdo = host_jtag.m.tdo;
+ assign host_jtag.m.tck = jtag_tck;
+ assign host_jtag.m.tms = jtag_tms;
+ assign host_jtag.m.tdi = jtag_tdi;
if_rst_sync rst_sync
(
@@ -95,26 +28,6 @@ import gfx::*;
.srst_n
);
- gfx_shader_fpint fpint
- (
- .clk,
- .rst_n,
- .op,
- .wb(fpint_wb.tx),
- .wave(),
- .abort(0),
- .in_valid,
- .read_data(fpint_io.ab)
- );
-
- gfx_raster raster
- (
- .clk,
- .rst_n,
- .geometry(geometry.rx),
- .coverage(coverage.tx)
- );
-
gfx_top gfx
(
.clk,