summaryrefslogtreecommitdiff
path: root/rtl/core/control/ldst/sizes.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-11-15 20:02:17 -0600
committerAlejandro Soto <alejandro@34project.org>2022-11-15 20:56:48 -0600
commit2b457b34b842e0e2fa6236b304860ad3ba474b16 (patch)
tree6068a578722ae89a453e504db6b6c3688dea1d30 /rtl/core/control/ldst/sizes.sv
parenta055bc85bc50897644e7ed62699abff46d818d5f (diff)
Implement sub-word memory accesses
Diffstat (limited to 'rtl/core/control/ldst/sizes.sv')
-rw-r--r--rtl/core/control/ldst/sizes.sv46
1 files changed, 46 insertions, 0 deletions
diff --git a/rtl/core/control/ldst/sizes.sv b/rtl/core/control/ldst/sizes.sv
new file mode 100644
index 0000000..dff4662
--- /dev/null
+++ b/rtl/core/control/ldst/sizes.sv
@@ -0,0 +1,46 @@
+`include "core/uarch.sv"
+
+module core_control_ldst_sizes
+(
+ input word base,
+ q_shifter,
+ input ldst_size size,
+ input logic sign_extend,
+
+ output ptr addr,
+ output word read,
+ output logic[1:0] shift,
+ output logic[3:0] byteenable,
+ output logic fault
+);
+
+ assign {addr, shift} = base;
+
+ always_comb
+ unique case(size)
+ LDST_BYTE: begin
+ read = {{24{q_shifter[7] && sign_extend}}, q_shifter[7:0]};
+ fault = 0;
+
+ unique case(shift)
+ 2'b00: byteenable = 4'b0001;
+ 2'b01: byteenable = 4'b0010;
+ 2'b10: byteenable = 4'b0100;
+ 2'b11: byteenable = 4'b1000;
+ endcase
+ end
+
+ LDST_HALF: begin
+ read = {{16{q_shifter[15] && sign_extend}}, q_shifter[15:0]};
+ fault = shift[0];
+ byteenable = shift[1] ? 4'b1100 : 4'b0011;
+ end
+
+ LDST_WORD: begin
+ read = q_shifter;
+ fault = shift[1] || shift[0];
+ byteenable = 4'b1111;
+ end
+ endcase
+
+endmodule