summaryrefslogtreecommitdiff
path: root/rtl/cache
diff options
context:
space:
mode:
authorJulianCamacho <jjulian.341@gmail.com>2023-10-03 16:55:27 -0600
committerJulianCamacho <jjulian.341@gmail.com>2023-10-03 16:55:27 -0600
commitbc466f0511d8b3029c0822f415ebc9ae152b9d09 (patch)
treeed7f32765005481d891bd7f31af43b2787dfc98c /rtl/cache
parent8c5a91578ca929f3a94b54628f6431c136dc417d (diff)
sram, offset and routing comments
Diffstat (limited to '')
-rw-r--r--rtl/cache/offsets.sv12
-rw-r--r--rtl/cache/routing.sv9
-rw-r--r--rtl/cache/sram.sv11
3 files changed, 23 insertions, 9 deletions
diff --git a/rtl/cache/offsets.sv b/rtl/cache/offsets.sv
index f9ad2ff..205d847 100644
--- a/rtl/cache/offsets.sv
+++ b/rtl/cache/offsets.sv
@@ -2,7 +2,7 @@
module cache_offsets
(
- input addr_offset core_offset,
+ input addr_offset core_offset, // El offset es un input pero no un output porque se mapea
input word_be core_byteenable,
input word core_writedata,
input line core_readdata_line,
@@ -10,21 +10,24 @@ module cache_offsets
output line core_data_wr,
core_writedata_line,
- output word core_readdata,
+ output word core_readdata, // Readdata pasa de ser una line en el input a una word por el offset
output line_be core_byteenable_line
);
- //Simplificar offsets
+ // Simplificar offset, para que sea transparente para la cache
line line_mask;
+
+ // El byteenable se utiliza para leer o escribir en cache algo diferente a una word
word be_extend, mask3, mask2, mask1, mask0;
word_be be3, be2, be1, be0;
assign core_writedata_line = {4{core_writedata}};
assign core_byteenable_line = {be3, be2, be1, be0};
+ // Concatenar para extender a una word ([31:0]) según el valor de byteenable que es [3:0]
assign be_extend = {{8{core_byteenable[3]}}, {8{core_byteenable[2]}},
{8{core_byteenable[1]}}, {8{core_byteenable[0]}}};
- assign line_mask = {mask3, mask2, mask1, mask0};
+ assign line_mask = {mask3, mask2, mask1, mask0}; // Máscara para toda la línea
assign core_data_wr = (core_writedata_line & line_mask) | (data_rd & ~line_mask);
always_comb begin
@@ -38,6 +41,7 @@ module cache_offsets
be1 = 0;
be0 = 0;
+ // Elegir la word que se va a retornar según el valor de offset
unique case (core_offset)
2'b00: begin
be0 = core_byteenable;
diff --git a/rtl/cache/routing.sv b/rtl/cache/routing.sv
index 8f744dd..aae6f51 100644
--- a/rtl/cache/routing.sv
+++ b/rtl/cache/routing.sv
@@ -49,9 +49,18 @@ module cache_routing
} state;
//Arbitrar el bus del lado de la cache
+
+ /* Se sabe si el address es cache o no evaluando los bits de IO.
+ * Esto es posible porque se cumple lo siguiente:
+ * - La memoria tiene un tamaño que es una potencia de 2
+ * - Sus direcciones inician en 0
+ * Entonces si los bits de IO son distintos de 0, se sabe que no es
+ * una dirección cached
+ */
assign cached = io == 3'b000;
assign cache_mem = cache_mem_read || cache_mem_write;
+ // Acá se divide el core_address para analizarse por separado
assign {io, core_tag, core_index, core_offset} = core_address;
assign core_address_line = {io, core_tag, core_index, 4'b0000};
assign core_readdata_line = cached ? data_rd : mem_readdata;
diff --git a/rtl/cache/sram.sv b/rtl/cache/sram.sv
index 8d68b7e..74f9e65 100644
--- a/rtl/cache/sram.sv
+++ b/rtl/cache/sram.sv
@@ -26,11 +26,12 @@ module cache_sram
line data_file[DEPTH] /*verilator public*/;
addr_tag tag_file[DEPTH] /*verilator public*/;
line_state state_file[DEPTH] /*verilator public*/;
-
- // Hace 3 cosas:
- // 1. Si se necesita escribir un dato: escribe en los tag y data files en la posición del index de escritura
- // 2. Si se necesita escribir un estado: escribe en el state file en la posición del index de escritura
- // 3. Cada ciclo retorna siempre lo que esté en todos los files en la posición de index de lectura
+
+ /* 3 funciones principales:
+ * 1. Si se necesita escribir un dato: escribe en los tag y data files en la posición del index de escritura
+ * 2. Si se necesita escribir un estado: escribe en el state file en la posición del index de escritura
+ * 3. Cada ciclo retorna siempre lo que esté en todos los files en la posición de index de lectura
+ */
always_ff @(posedge clk) begin
if (write_data) begin
tag_file[index_wr] <= tag_wr;