summaryrefslogtreecommitdiff
path: root/rtl/cache/cache_sram.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-01-21 06:23:46 -0600
committerAlejandro Soto <alejandro@34project.org>2024-02-20 11:11:17 -0600
commitf3b18ead59ae02f95dabbf0a1dea40873a816975 (patch)
tree8979e50f2a37f66a4cd27e937b480efe60d72cf7 /rtl/cache/cache_sram.sv
parenta8bc5a353ea997f73209b39377ee15a73e471237 (diff)
rtl: refactor filenames and directory hierarchy
Diffstat (limited to 'rtl/cache/cache_sram.sv')
-rw-r--r--rtl/cache/cache_sram.sv71
1 files changed, 71 insertions, 0 deletions
diff --git a/rtl/cache/cache_sram.sv b/rtl/cache/cache_sram.sv
new file mode 100644
index 0000000..d63cdad
--- /dev/null
+++ b/rtl/cache/cache_sram.sv
@@ -0,0 +1,71 @@
+`include "cache/defs.sv"
+
+module cache_sram
+(
+ input logic clk,
+ rst_n,
+
+ input addr_index index_rd,
+ index_wr,
+ input logic write_data,
+ write_state,
+ input addr_tag tag_wr,
+ input line data_wr,
+ input line_state state_wr,
+
+ output addr_tag tag_rd,
+ output line data_rd,
+ output line_state state_rd
+);
+
+ // Existe un mito que habla de true dual-ports con byte-enables,
+ // probablemente no sea real:
+ // https://www.intel.com/content/www/us/en/docs/programmable/683082/21-3/ram-with-byte-enable-signals.html
+
+ // Es una cache one way: cada índice mapea a cada línea de cache
+ // (directamente mapeada)
+
+ // Define la cantidad de líneas de cache
+ // Cantidad de bits en addr_index = 12, entonces se le hace left shift 12
+ // espacios a 1. Osea, 4096 líneas de cache.
+ // Tenemos 4kilo-líneas de caché. Cada línea es de 128bits, osea tenemos una
+ // caché de 64KBi.
+ localparam DEPTH = 1 << $bits(addr_index);
+
+ // Estas tres secciones constituyen al caché.
+ // data_file: Donde se guarda la información cacheada.
+ // tag_file: Se guardan los tags de las líneas de caché.
+ // state_file: Se guarda el estado de cada línea de caché. (Acá están todos
+ // los estados de MESI)
+ line data_file[DEPTH] /*verilator public*/;
+ addr_tag tag_file[DEPTH] /*verilator public*/;
+ line_state state_file[DEPTH] /*verilator public*/;
+
+ // 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;
+ data_file[index_wr] <= data_wr;
+ end
+
+ if (write_state)
+ state_file[index_wr] <= state_wr;
+
+ tag_rd <= tag_file[index_rd];
+ data_rd <= data_file[index_rd];
+ state_rd <= state_file[index_rd];
+ end
+
+ // Se inicializan todas las líneas del state file como INVALID
+ //FIXME: rst_n para state_file?
+ initial
+ for (int i = 0; i < DEPTH; ++i)
+ state_file[i] = INVALID;
+
+endmodule