diff options
| author | JulianCamacho <jjulian.341@gmail.com> | 2023-10-03 16:55:27 -0600 |
|---|---|---|
| committer | JulianCamacho <jjulian.341@gmail.com> | 2023-10-03 16:55:27 -0600 |
| commit | bc466f0511d8b3029c0822f415ebc9ae152b9d09 (patch) | |
| tree | ed7f32765005481d891bd7f31af43b2787dfc98c /rtl | |
| parent | 8c5a91578ca929f3a94b54628f6431c136dc417d (diff) | |
sram, offset and routing comments
Diffstat (limited to '')
| -rw-r--r-- | rtl/cache/offsets.sv | 12 | ||||
| -rw-r--r-- | rtl/cache/routing.sv | 9 | ||||
| -rw-r--r-- | rtl/cache/sram.sv | 11 |
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; |
