From 231ce84101fbaf1b3bb3b0f6db0d5fde6e6e80a2 Mon Sep 17 00:00:00 2001 From: Dustin Richmond Date: Thu, 6 Jan 2022 10:48:42 -0800 Subject: [PATCH 1/2] WIP: Added amomin, amomax, amominu, amomaxu to Core & Caches I thought I needed these for nbody, and did not. Work in progress because these are not tested or validated. Perhaps someone can build off of my work --- testbenches/common/v/vcache_profiler.v | 4 ++++ v/bsg_manycore_link_to_cache.v | 2 +- v/bsg_manycore_tile_vcache.v | 4 ++++ v/vanilla_bean/bsg_vanilla_defines.vh | 5 +++++ v/vanilla_bean/bsg_vanilla_pkg.v | 6 +++++- v/vanilla_bean/cl_decode.v | 22 +++++++++++++++++++++- 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/testbenches/common/v/vcache_profiler.v b/testbenches/common/v/vcache_profiler.v index 0ff49b19b..7a06998b0 100644 --- a/testbenches/common/v/vcache_profiler.v +++ b/testbenches/common/v/vcache_profiler.v @@ -100,6 +100,10 @@ module vcache_profiler wire inc_amoswap = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_swap); // atomic swap wire inc_amoor = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_or); // atomic or wire inc_amoadd = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_add); // atomic add + wire inc_amomin = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_min); // atomic min + wire inc_amomax = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_max); // atomic max + wire inc_amominu = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_minu); // atomic minu + wire inc_amomaxu = inc_atomic & (decode_v_r.amo_subop == e_cache_amo_maxu); // atomic maxu wire inc_miss_ld = v_o & yumi_i & decode_v_r.ld_op & miss_v; // miss on load wire inc_miss_st = v_o & yumi_i & decode_v_r.st_op & miss_v; // miss on store diff --git a/v/bsg_manycore_link_to_cache.v b/v/bsg_manycore_link_to_cache.v index e81cb07bd..b0a1f371b 100644 --- a/v/bsg_manycore_link_to_cache.v +++ b/v/bsg_manycore_link_to_cache.v @@ -157,7 +157,7 @@ module bsg_manycore_link_to_cache e_cache_op: begin return_pkt_type = e_return_credit; end - e_remote_amoswap, e_remote_amoor, e_remote_amoadd: begin + e_remote_amoswap, e_remote_amoor, e_remote_amoadd, e_remote_amomin, e_remote_amomax, e_remote_amominu, e_remote_amomaxu: begin return_pkt_type = e_return_int_wb; end // should never happen diff --git a/v/bsg_manycore_tile_vcache.v b/v/bsg_manycore_tile_vcache.v index b3d3eef92..8ccb3b96d 100644 --- a/v/bsg_manycore_tile_vcache.v +++ b/v/bsg_manycore_tile_vcache.v @@ -51,6 +51,10 @@ module bsg_manycore_tile_vcache , parameter vcache_amo_support_p = (1 << e_cache_amo_swap) | (1 << e_cache_amo_or) | (1 << e_cache_amo_add) + | (1 << e_cache_amo_min) + | (1 << e_cache_amo_minu) + | (1 << e_cache_amo_max) + | (1 << e_cache_amo_maxu) ) ( input clk_i diff --git a/v/vanilla_bean/bsg_vanilla_defines.vh b/v/vanilla_bean/bsg_vanilla_defines.vh index 949693f74..d4f8349a7 100644 --- a/v/vanilla_bean/bsg_vanilla_defines.vh +++ b/v/vanilla_bean/bsg_vanilla_defines.vh @@ -194,6 +194,11 @@ `define RV32_AMOOR_W {5'b01000,2'b??,5'b?????,5'b?????,3'b010,5'b?????,`RV32_AMO_OP} `define RV32_AMOADD_W {5'b00000,2'b??,5'b?????,5'b?????,3'b010,5'b?????,`RV32_AMO_OP} +`define RV32_AMOMIN_W {5'b10000,2'b??,5'b?????,5'b?????,3'b010,5'b?????,`RV32_AMO_OP} +`define RV32_AMOMAX_W {5'b10100,2'b??,5'b?????,5'b?????,3'b010,5'b?????,`RV32_AMO_OP} +`define RV32_AMOMINU_W {5'b11000,2'b??,5'b?????,5'b?????,3'b010,5'b?????,`RV32_AMO_OP} +`define RV32_AMOMAXU_W {5'b11100,2'b??,5'b?????,5'b?????,3'b010,5'b?????,`RV32_AMO_OP} + // RV32F Instruction Encodings `define RV32_OP_FP 7'b1010011 `define RV32_LOAD_FP 7'b0000111 diff --git a/v/vanilla_bean/bsg_vanilla_pkg.v b/v/vanilla_bean/bsg_vanilla_pkg.v index b0170947e..4b7fe858d 100644 --- a/v/vanilla_bean/bsg_vanilla_pkg.v +++ b/v/vanilla_bean/bsg_vanilla_pkg.v @@ -47,10 +47,14 @@ typedef struct packed { // remote request from vanilla core // -typedef enum logic [1:0] { +typedef enum logic [2:0] { e_vanilla_amoswap , e_vanilla_amoor , e_vanilla_amoadd + , e_vanilla_amomin + , e_vanilla_amomax + , e_vanilla_amominu + , e_vanilla_amomaxu } bsg_vanilla_amo_type_e; typedef struct packed diff --git a/v/vanilla_bean/cl_decode.v b/v/vanilla_bean/cl_decode.v index 5188edd18..1c0dd8ee9 100644 --- a/v/vanilla_bean/cl_decode.v +++ b/v/vanilla_bean/cl_decode.v @@ -95,7 +95,11 @@ always_comb begin // According the ISA, LR instruction don't read rs2 decode_o.read_rs2 = (instruction_i.funct7 ==? 7'b00001??) // amoswap | (instruction_i.funct7 ==? 7'b01000??) // amoor - | (instruction_i.funct7 ==? 7'b00000??); // amoadd + | (instruction_i.funct7 ==? 7'b00000??) // amoadd + | (instruction_i.funct7 ==? 7'b10000??) // amomin + | (instruction_i.funct7 ==? 7'b10100??) // amomax + | (instruction_i.funct7 ==? 7'b11000??) // amominu + | (instruction_i.funct7 ==? 7'b11100??); // amomaxu end default: begin decode_o.read_rs2 = 1'b0; @@ -228,6 +232,22 @@ always_comb begin decode_o.is_amo_op = 1'b1; decode_o.amo_type = e_vanilla_amoadd; end + `RV32_AMOMIN_W: begin + decode_o.is_amo_op = 1'b1; + decode_o.amo_type = e_vanilla_amomin; + end + `RV32_AMOMAX_W: begin + decode_o.is_amo_op = 1'b1; + decode_o.amo_type = e_vanilla_amomax; + end + `RV32_AMOMINU_W: begin + decode_o.is_amo_op = 1'b1; + decode_o.amo_type = e_vanilla_amominu; + end + `RV32_AMOMAXU_W: begin + decode_o.is_amo_op = 1'b1; + decode_o.amo_type = e_vanilla_amomaxu; + end default: begin decode_o.is_amo_op = 1'b0; decode_o.amo_type = e_vanilla_amoswap; From 469bf0982a745dfa8eb7a1075cff0ff053848eec Mon Sep 17 00:00:00 2001 From: Dustin Richmond Date: Mon, 17 Jan 2022 15:11:45 -0800 Subject: [PATCH 2/2] Added missing unique case statements --- v/bsg_manycore_link_to_cache.v | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/v/bsg_manycore_link_to_cache.v b/v/bsg_manycore_link_to_cache.v index b0a1f371b..9892a62d6 100644 --- a/v/bsg_manycore_link_to_cache.v +++ b/v/bsg_manycore_link_to_cache.v @@ -299,6 +299,22 @@ module bsg_manycore_link_to_cache cache_pkt.opcode = AMOADD_W; end + e_remote_amomin: begin + cache_pkt.opcode = AMOMIN_W; + end + + e_remote_amominu: begin + cache_pkt.opcode = AMOMINU_W; + end + + e_remote_amomax: begin + cache_pkt.opcode = AMOMAX_W; + end + + e_remote_amomaxu: begin + cache_pkt.opcode = AMOMAXU_W; + end + e_cache_op: begin case (packet_lo.reg_id.cache_op) e_afl: cache_pkt.opcode = AFL;