diff options
Diffstat (limited to 'rtl')
| -rw-r--r-- | rtl/cache/cache_control.sv | 13 | ||||
| -rw-r--r-- | rtl/cache/routing.sv | 20 |
2 files changed, 28 insertions, 5 deletions
diff --git a/rtl/cache/cache_control.sv b/rtl/cache/cache_control.sv index 85378d5..fb7896a 100644 --- a/rtl/cache/cache_control.sv +++ b/rtl/cache/cache_control.sv @@ -89,9 +89,11 @@ module cache_control */ assign unlock_line = !core_waitrequest; + // Replace si no coinciden las tags y el estado no es INVALID assign replace = tag_rd != core_tag && state_rd != INVALID; - assign last_hop = in_hold.ttl == `TTL_END; - assign snoop_hit = tag_rd == in_hold.tag; + assign last_hop = in_hold.ttl == `TTL_END; //Indica si es el último salto + assign snoop_hit = tag_rd == in_hold.tag; //Snoop hit si coinciden las tags + // Aceptar snoop si no es el último nodo y se tiene un mensaje válido assign accept_snoop = in_hold_valid && !last_hop && (in_hold.inval || !in_hold.reply); assign may_send = may_send_if_token_held && in_token_valid; @@ -105,7 +107,7 @@ module cache_control assign out_data_valid = out_stall || send || (in_hold_valid && !last_hop && in_data_ready); assign send_data.tag = core_tag; - assign send_data.ttl = `TTL_MAX; + assign send_data.ttl = `TTL_MAX; // Acá se inicializa el valor máximo de TTL assign send_data.data = fwd_data.data; // Esto evita muchos muxes assign send_data.read = send_read; assign send_data.index = core_index; @@ -139,11 +141,12 @@ module cache_control unique case (state) ACCEPT: begin + // Si es el último nodo en recibir el mensaje y la request no es de lectura if (last_hop && !in_hold.read) begin - end_reply = in_hold_valid; + end_reply = in_hold_valid; // Se termina el paso de ese mensaje in_data_ready = 1; end - + // Si no es el último salto y hay reply if (!last_hop && in_hold.reply) in_data_ready = 1; diff --git a/rtl/cache/routing.sv b/rtl/cache/routing.sv index aae6f51..c745cfc 100644 --- a/rtl/cache/routing.sv +++ b/rtl/cache/routing.sv @@ -37,6 +37,12 @@ module cache_routing output line_be mem_byteenable ); + /* Módulo para enrutar las operaciones a cache o memoria + * Esto porque hay escrituras que definitivamente no pueden quedar en cache + * como el caso de periféricos, para los cuales si se guarda "su valor" en + * cache y no en memoria se harían lecturas incorrectas + */ + word core_address_line; logic cached, cache_mem, transition; addr_io_region io; @@ -58,13 +64,17 @@ module cache_routing * una dirección cached */ assign cached = io == 3'b000; + // Se afirma si cache quiere hacer un read o write de memoria 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}; + // Si está cached se asigna a lectura de cache, sino a lectura de memoria assign core_readdata_line = cached ? data_rd : mem_readdata; + // Se afirma si el core quiere leer/escribir a cache y efectivamente es una + // dirección de cache assign cache_core_read = core_read && cached; assign cache_core_write = core_write && cached; @@ -76,12 +86,18 @@ module cache_routing unique case (state) IDLE: + /* Transition se afirma si cache quiere hacer un read o write de + * memoria, o si el address no es cache y el core quiere leer + * o escribir a cache + */ transition = cache_mem || (!cached && (core_read || core_write)); CACHE: + // Cache le hace waitreq a memoria cache_mem_waitrequest = mem_waitrequest; BYPASS: + // Se le hace waitreq al core si la memoria también lo hace core_waitrequest = mem_waitrequest; endcase end @@ -94,6 +110,8 @@ module cache_routing end else unique case (state) IDLE: if (transition) begin + // Si cache quiere hacer una operación con memoria, se pasa + // a CACHE, sino hay que hacer BYPASS state <= cache_mem ? CACHE : BYPASS; mem_read <= cache_mem ? cache_mem_read : core_read; mem_write <= cache_mem ? cache_mem_write : core_write; @@ -109,6 +127,8 @@ module cache_routing always_ff @(posedge clk) if (transition) begin + // Si cache no quiere hacer una operación con memoria, se asignan + // las señales del core mem_address <= cache_mem ? cache_mem_address : core_address_line; mem_writedata <= cache_mem ? cache_mem_writedata : core_writedata_line; mem_byteenable <= cache_mem ? 16'hffff : core_byteenable_line; |
