summaryrefslogtreecommitdiff
path: root/rtl/cache/cache_debug.sv
blob: 7bc3e02d6fa14ec148ed2c1d8b8b35205fbaa596 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
`include "cache/defs.sv"

module cache_debug
(
	input  logic      clk,
	                  rst_n,

	input  logic[2:0] dbg_address,		// Dirección del slave
	input  logic      dbg_read,
	input  word       dbg_writedata,	// Dirección que se quiere leer
	output logic      dbg_waitrequest,
	output word       dbg_readdata,		// Es cada word de la salida de la 
										// lectura de la line
	input  logic      debug_ready,
	input  addr_tag   tag_rd,
	input  line       data_rd,
	input  line_state state_rd,
	output addr_index debug_index
);

	// Módulo que a partir de un address de cache, "retorna" los datos (cada 
	// una de las words) de la línea consultad, así como metadata de la línea
	// (estado, si es cached, index, tad, etc)

	// Este struct es lo que lee cache.c a través de las direcciones de memoria 
	// para desplegarlo en la CLI
	struct packed
	{
		logic[2:0] mbz_0;
		addr_tag   tag;
		addr_index index;
		line_state state;
		logic      cached,
		           mbz_1;
	} status;	// Esto representa una línea de cache

	line line_dump;
	word word_dump, word_3, word_2, word_1, word_0;
	addr_bits debug_addr_bits;

	logic cached;
	addr_tag tag;
	addr_index index;
	line_state state;

	assign debug_index = debug_addr_bits.index;
	assign dbg_readdata = dbg_address[2] ? word_dump : status;
	assign dbg_waitrequest = !debug_ready && !dbg_read;

	assign status.tag = tag;
	assign status.index = index;
	assign status.state = state;
	assign status.mbz_0 = 3'b000;
	assign status.mbz_1 = 0;
	assign status.cached = cached;
	assign debug_addr_bits = dbg_writedata;

	assign {word_3, word_2, word_1, word_0} = line_dump;

	// Acá se define cuál es la word actual de la línea que se va a leer
	always_comb
		unique case (dbg_address[1:0])
			2'b00: word_dump = word_0;
			2'b01: word_dump = word_1;
			2'b10: word_dump = word_2;
			2'b11: word_dump = word_3;
		endcase

	always @(posedge clk)
		if (debug_ready) begin
			tag <= tag_rd;
			index <= debug_addr_bits.index;
			state <= state_rd;
			cached <= !(|debug_addr_bits.io);
			line_dump <= data_rd;
		end

endmodule