diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-12 13:28:53 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-12 18:13:02 -0600 |
| commit | de49ebb80d1e2ef8283818332a0ac6bf5d70440d (patch) | |
| tree | fc437474dfe336a43dd4fca9cd31ed150a435868 /platform/wavelet3d | |
| parent | e581090bb9e7965c463be35544395406f5a5441d (diff) | |
platform/wavelet3d: implement JTAG TAP bridge in simulation
Diffstat (limited to 'platform/wavelet3d')
| -rw-r--r-- | platform/wavelet3d/main.cpp | 317 | ||||
| -rw-r--r-- | platform/wavelet3d/mod.mk | 2 | ||||
| -rw-r--r-- | platform/wavelet3d/openocd.cfg | 32 | ||||
| -rw-r--r-- | platform/wavelet3d/remote_bitbang.cpp | 300 | ||||
| -rw-r--r-- | platform/wavelet3d/remote_bitbang.h | 53 | ||||
| -rw-r--r-- | platform/wavelet3d/w3d_top.sv | 103 |
6 files changed, 410 insertions, 397 deletions
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, |
