diff --git a/hw/rtl/fpu/VX_fpu_unit.sv b/hw/rtl/fpu/VX_fpu_unit.sv index 3c30f93c34..16a9c97edc 100644 --- a/hw/rtl/fpu/VX_fpu_unit.sv +++ b/hw/rtl/fpu/VX_fpu_unit.sv @@ -259,7 +259,9 @@ module VX_fpu_unit import VX_gpu_pkg::*, VX_fpu_pkg::*; #( .valid_out (per_block_result_if[block_idx].valid), .ready_out (per_block_result_if[block_idx].ready) ); - assign per_block_result_if[block_idx].data.wb = 1'b1; + // Avoid writeback to x0, which scoreboard does not reserve. + assign per_block_result_if[block_idx].data.wb = + fpu_rsp_rd != make_reg_num(REG_TYPE_I, RV_REGS_BITS'(0)); end VX_gather_unit #( diff --git a/tests/kernel/conform/main.cpp b/tests/kernel/conform/main.cpp index 0efa00cab5..11e3774c79 100644 --- a/tests/kernel/conform/main.cpp +++ b/tests/kernel/conform/main.cpp @@ -28,6 +28,8 @@ int main() { errors += test_shfl(); + errors += test_feq_x0_scoreboard(); + if (0 == errors) { PRINTF("Passed!\n"); } else { @@ -35,4 +37,4 @@ int main() { } return errors; -} \ No newline at end of file +} diff --git a/tests/kernel/conform/tests.cpp b/tests/kernel/conform/tests.cpp index c1b19575de..21fd8e84b1 100644 --- a/tests/kernel/conform/tests.cpp +++ b/tests/kernel/conform/tests.cpp @@ -31,6 +31,28 @@ int __attribute__((noinline)) make_full_tmask(int num_threads) { /////////////////////////////////////////////////////////////////////////////// +void __attribute__((noinline)) do_feq_x0_scoreboard() { + asm volatile( + "fsgnj.s f24, f0, f0\n" + "fsgnj.s f1, f0, f0\n" + "feq.s x0, f24, f1\n" + : + : + : "memory"); +} + +int test_feq_x0_scoreboard() { + PRINTF("FEQ x0 Scoreboard Test\n"); + int num_threads = std::min(vx_num_threads(), 4); + int tmask = make_full_tmask(num_threads); + vx_tmc(tmask); + do_feq_x0_scoreboard(); + vx_tmc_one(); + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// + #define GLOBAL_MEM_SZ 8 int global_buffer[GLOBAL_MEM_SZ]; @@ -401,4 +423,4 @@ int test_shfl() { do_shfl(); vx_tmc_one(); // back to thread0 return check_error(shfl_buffer, 0, num_threads); -} \ No newline at end of file +} diff --git a/tests/kernel/conform/tests.h b/tests/kernel/conform/tests.h index 52e7df68b3..1053b421df 100644 --- a/tests/kernel/conform/tests.h +++ b/tests/kernel/conform/tests.h @@ -3,6 +3,8 @@ #define PRINTF vx_printf +int test_feq_x0_scoreboard(); + int test_global_memory(); int test_local_memory();