summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cache_hw.tcl43
-rw-r--r--platform.qsys28
-rw-r--r--rtl/cache/cache.sv18
-rw-r--r--rtl/cache/cache_control.sv20
-rw-r--r--rtl/cache/cache_debug.sv71
-rw-r--r--rtl/cache/defs.sv9
-rw-r--r--tb/platform.sv96
-rw-r--r--tb/top/conspiracion.cpp8
8 files changed, 274 insertions, 19 deletions
diff --git a/cache_hw.tcl b/cache_hw.tcl
index 31aa5af..cedffb4 100644
--- a/cache_hw.tcl
+++ b/cache_hw.tcl
@@ -1,11 +1,11 @@
# TCL File Generated by Component Editor 20.1
-# Tue Oct 03 10:41:50 GMT 2023
+# Wed Oct 04 09:06:39 GMT 2023
# DO NOT MODIFY
#
# cache "8KiB 1-way cache w/ controller" v1.0
-# 2023.10.03.10:41:50
+# 2023.10.04.09:06:39
#
#
@@ -46,6 +46,7 @@ add_fileset_file offsets.sv SYSTEM_VERILOG PATH rtl/cache/offsets.sv
add_fileset_file routing.sv SYSTEM_VERILOG PATH rtl/cache/routing.sv
add_fileset_file sram.sv SYSTEM_VERILOG PATH rtl/cache/sram.sv
add_fileset_file monitor.sv SYSTEM_VERILOG PATH rtl/cache/monitor.sv
+add_fileset_file cache_debug.sv SYSTEM_VERILOG PATH rtl/cache/cache_debug.sv
#
@@ -257,3 +258,41 @@ add_interface_port mem mem_readdata readdata Input 128
add_interface_port mem mem_writedata writedata Output 128
add_interface_port mem mem_waitrequest waitrequest Input 1
+
+#
+# connection point dbg
+#
+add_interface dbg avalon end
+set_interface_property dbg addressUnits WORDS
+set_interface_property dbg associatedClock clock_sink
+set_interface_property dbg associatedReset reset_sink
+set_interface_property dbg bitsPerSymbol 8
+set_interface_property dbg burstOnBurstBoundariesOnly false
+set_interface_property dbg burstcountUnits WORDS
+set_interface_property dbg explicitAddressSpan 0
+set_interface_property dbg holdTime 0
+set_interface_property dbg linewrapBursts false
+set_interface_property dbg maximumPendingReadTransactions 0
+set_interface_property dbg maximumPendingWriteTransactions 0
+set_interface_property dbg readLatency 0
+set_interface_property dbg readWaitTime 1
+set_interface_property dbg setupTime 0
+set_interface_property dbg timingUnits Cycles
+set_interface_property dbg writeWaitTime 0
+set_interface_property dbg ENABLED true
+set_interface_property dbg EXPORT_OF ""
+set_interface_property dbg PORT_NAME_MAP ""
+set_interface_property dbg CMSIS_SVD_VARIABLES ""
+set_interface_property dbg SVD_ADDRESS_GROUP ""
+
+add_interface_port dbg dbg_read read Input 1
+add_interface_port dbg dbg_write write Input 1
+add_interface_port dbg dbg_address address Input 3
+add_interface_port dbg dbg_readdata readdata Output 32
+add_interface_port dbg dbg_waitrequest waitrequest Output 1
+add_interface_port dbg dbg_writedata writedata Input 32
+set_interface_assignment dbg embeddedsw.configuration.isFlash 0
+set_interface_assignment dbg embeddedsw.configuration.isMemoryDevice 0
+set_interface_assignment dbg embeddedsw.configuration.isNonVolatileStorage 0
+set_interface_assignment dbg embeddedsw.configuration.isPrintableDevice 0
+
diff --git a/platform.qsys b/platform.qsys
index 7190777..4a9fa44 100644
--- a/platform.qsys
+++ b/platform.qsys
@@ -222,6 +222,14 @@
type = "String";
}
}
+ element platform
+ {
+ datum _originalDeviceFamily
+ {
+ value = "Cyclone V";
+ type = "String";
+ }
+ }
element pll_0
{
datum _sortIndex
@@ -1399,6 +1407,26 @@
<parameter name="baseAddress" value="0x30140000" />
<parameter name="defaultConnection" value="false" />
</connection>
+ <connection kind="avalon" version="20.1" start="mm_bridge.m0" end="cache_0.dbg">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30100000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection kind="avalon" version="20.1" start="mm_bridge.m0" end="cache_1.dbg">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30110000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection kind="avalon" version="20.1" start="mm_bridge.m0" end="cache_2.dbg">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30120000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection kind="avalon" version="20.1" start="mm_bridge.m0" end="cache_3.dbg">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30130000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
<connection kind="avalon" version="20.1" start="mm_bridge.m0" end="buttons.s1">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x30050000" />
diff --git a/rtl/cache/cache.sv b/rtl/cache/cache.sv
index 1b327b4..6d5a204 100644
--- a/rtl/cache/cache.sv
+++ b/rtl/cache/cache.sv
@@ -16,13 +16,12 @@ module cache
output logic[1:0] core_response,
output word core_readdata,
- //TODO
- /*input TODO/ dbg_address,
+ input logic[2:0] dbg_address,
input logic dbg_read,
dbg_write,
input word dbg_writedata,
output logic dbg_waitrequest,
- output word dbg_readdata,*/
+ output word dbg_readdata,
input logic mem_waitrequest,
input line mem_readdata,
@@ -47,9 +46,6 @@ module cache
output logic out_token_valid
);
- //TODO
- //assign dbg_waitrequest = 1;
-
logic write_data, write_state;
line data_wr, data_rd;
addr_tag tag_wr, tag_rd;
@@ -63,7 +59,8 @@ module cache
word cache_mem_address;
line cache_mem_writedata;
- logic cache_core_waitrequest, cache_mem_waitrequest, cache_mem_read, cache_mem_write;
+ logic cache_core_waitrequest, cache_mem_waitrequest, cache_mem_read, cache_mem_write,
+ debug_ready;
cache_control #(.TOKEN_AT_RESET(TOKEN_AT_RESET)) control
(
@@ -105,4 +102,11 @@ module cache
.*
);
+ addr_index debug_index;
+
+ cache_debug debug
+ (
+ .*
+ );
+
endmodule
diff --git a/rtl/cache/cache_control.sv b/rtl/cache/cache_control.sv
index 090fba4..46d4638 100644
--- a/rtl/cache/cache_control.sv
+++ b/rtl/cache/cache_control.sv
@@ -51,7 +51,11 @@ module cache_control
output word mem_address,
output logic mem_read,
mem_write,
- output line mem_writedata
+ output line mem_writedata,
+
+ input logic dbg_write,
+ input addr_index debug_index,
+ output logic debug_ready
);
enum int unsigned
@@ -62,8 +66,8 @@ module cache_control
REPLY
} state, next_state;
- logic accept_snoop, end_reply, in_hold_valid, last_hop, lock_line, locked,
- may_send, may_send_if_token_held, mem_begin, mem_end, mem_read_end,
+ logic accept_snoop, debug, end_reply, in_hold_valid, last_hop, lock_line,
+ locked, may_send, may_send_if_token_held, mem_begin, mem_end, mem_read_end,
mem_wait, out_stall, wait_reply, replace, retry, send, send_inval,
send_read, snoop_hit, set_reply, unlock_line, writeback;
@@ -145,6 +149,9 @@ module cache_control
if (accept_snoop)
index_rd = in_hold.index;
+
+ if (debug)
+ index_rd = debug_index;
end
CORE: begin
@@ -321,6 +328,7 @@ module cache_control
end
always_comb begin
+ debug = 0;
next_state = ACCEPT;
unique case (state)
@@ -329,6 +337,8 @@ module cache_control
next_state = SNOOP;
else if (in_hold_valid && last_hop && in_hold.read)
next_state = REPLY;
+ else if (dbg_write && !debug_ready)
+ debug = 1;
else if ((core_read || core_write) && !wait_reply && (!locked || may_send))
next_state = CORE;
@@ -356,6 +366,8 @@ module cache_control
mem_read <= 0;
mem_write <= 0;
+
+ debug_ready <= 0;
end else begin
out_token.e0.tag <= core_tag;
out_token.e0.index <= core_index;
@@ -391,6 +403,8 @@ module cache_control
mem_read <= !writeback;
mem_write <= writeback;
end
+
+ debug_ready <= debug;
end
always_ff @(posedge clk) begin
diff --git a/rtl/cache/cache_debug.sv b/rtl/cache/cache_debug.sv
new file mode 100644
index 0000000..14b73e5
--- /dev/null
+++ b/rtl/cache/cache_debug.sv
@@ -0,0 +1,71 @@
+`include "cache/defs.sv"
+
+module cache_debug
+(
+ input logic clk,
+ rst_n,
+
+ input logic[2:0] dbg_address,
+ input logic dbg_read,
+ input word dbg_writedata,
+ output logic dbg_waitrequest,
+ output word dbg_readdata,
+
+ input logic debug_ready,
+ input addr_tag tag_rd,
+ input line data_rd,
+ input line_state state_rd,
+ output addr_index debug_index
+);
+
+ struct packed
+ {
+ logic[2:0] mbz_0;
+ addr_tag tag;
+ addr_index index;
+ line_state state;
+ logic cached,
+ mbz_1;
+ } status;
+
+ 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;
+
+ 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
diff --git a/rtl/cache/defs.sv b/rtl/cache/defs.sv
index e21e587..0546c4d 100644
--- a/rtl/cache/defs.sv
+++ b/rtl/cache/defs.sv
@@ -28,6 +28,15 @@ typedef logic[15:0] addr_tag;
typedef logic[2:0] addr_io_region;
typedef logic[26:0] addr_cacheable;
+typedef struct packed
+{
+ addr_io_region io;
+ addr_tag tag;
+ addr_index index;
+ addr_offset offset;
+ addr_mbz mbz;
+} addr_bits;
+
typedef enum logic[1:0]
{
INVALID,
diff --git a/tb/platform.sv b/tb/platform.sv
index fddf6e8..bbf1088 100644
--- a/tb/platform.sv
+++ b/tb/platform.sv
@@ -65,13 +65,19 @@ module platform
logic mem_0_waitrequest, mem_1_waitrequest, mem_2_waitrequest, mem_3_waitrequest;
logic[15:0] mem_0_byteenable, mem_1_byteenable, mem_2_byteenable, mem_3_byteenable;
- logic[31:0] cpu_0_address, cpu_1_address, cpu_2_address, cpu_3_address;
- logic cpu_0_read, cpu_1_read, cpu_2_read, cpu_3_read;
- logic cpu_0_write, cpu_1_write, cpu_2_write, cpu_3_write;
- logic cpu_0_lock, cpu_1_lock, cpu_2_lock, cpu_3_lock;
- logic[31:0] cpu_0_readdata, cpu_1_readdata, cpu_2_readdata, cpu_3_readdata;
- logic[31:0] cpu_0_writedata, cpu_1_writedata, cpu_2_writedata, cpu_3_writedata;
- logic cpu_0_waitrequest, cpu_1_waitrequest, cpu_2_waitrequest, cpu_3_waitrequest;
+ logic[31:0] cpu_0_address, cpu_1_address, cpu_2_address, cpu_3_address,
+ dbg_0_address, dbg_1_address, dbg_2_address, dbg_3_address;
+ logic cpu_0_read, cpu_1_read, cpu_2_read, cpu_3_read,
+ dbg_0_read, dbg_1_read, dbg_2_read, dbg_3_read,
+ cpu_0_write, cpu_1_write, cpu_2_write, cpu_3_write,
+ dbg_0_write, dbg_1_write, dbg_2_write, dbg_3_write,
+ cpu_0_lock, cpu_1_lock, cpu_2_lock, cpu_3_lock;
+ logic[31:0] cpu_0_readdata, cpu_1_readdata, cpu_2_readdata, cpu_3_readdata,
+ dbg_0_readdata, dbg_1_readdata, dbg_2_readdata, dbg_3_readdata;
+ logic[31:0] cpu_0_writedata, cpu_1_writedata, cpu_2_writedata, cpu_3_writedata,
+ dbg_0_writedata, dbg_1_writedata, dbg_2_writedata, dbg_3_writedata;
+ logic cpu_0_waitrequest, cpu_1_waitrequest, cpu_2_waitrequest, cpu_3_waitrequest,
+ dbg_0_waitrequest, dbg_1_waitrequest, dbg_2_waitrequest, dbg_3_waitrequest;
logic[1:0] cpu_0_response, cpu_1_response, cpu_2_response, cpu_3_response;
logic[3:0] cpu_0_byteenable, cpu_1_byteenable, cpu_2_byteenable, cpu_3_byteenable;
@@ -196,6 +202,25 @@ module platform
.out_token(token_0),
.out_token_valid(token_valid_0),
+ .dbg_read(dbg_0_read),
+ .dbg_write(dbg_0_write),
+ .dbg_address(dbg_0_address[2:0]),
+ .dbg_readdata(dbg_0_readdata),
+ .dbg_writedata(dbg_0_writedata),
+ .dbg_waitrequest(dbg_0_waitrequest),
+
+ .*
+ );
+
+ sim_slave smp_dbg_0
+ (
+ .read(dbg_0_read),
+ .write(dbg_0_write),
+ .address(dbg_0_address),
+ .readdata(dbg_0_readdata),
+ .writedata(dbg_0_writedata),
+ .waitrequest(dbg_0_waitrequest),
+
.*
);
@@ -233,6 +258,25 @@ module platform
.out_token(token_1),
.out_token_valid(token_valid_1),
+ .dbg_read(dbg_1_read),
+ .dbg_write(dbg_1_write),
+ .dbg_address(dbg_1_address[2:0]),
+ .dbg_readdata(dbg_1_readdata),
+ .dbg_writedata(dbg_1_writedata),
+ .dbg_waitrequest(dbg_1_waitrequest),
+
+ .*
+ );
+
+ sim_slave smp_dbg_1
+ (
+ .read(dbg_1_read),
+ .write(dbg_1_write),
+ .address(dbg_1_address),
+ .readdata(dbg_1_readdata),
+ .writedata(dbg_1_writedata),
+ .waitrequest(dbg_1_waitrequest),
+
.*
);
@@ -270,6 +314,25 @@ module platform
.out_token(token_2),
.out_token_valid(token_valid_2),
+ .dbg_read(dbg_2_read),
+ .dbg_write(dbg_2_write),
+ .dbg_address(dbg_2_address[2:0]),
+ .dbg_readdata(dbg_2_readdata),
+ .dbg_writedata(dbg_2_writedata),
+ .dbg_waitrequest(dbg_2_waitrequest),
+
+ .*
+ );
+
+ sim_slave smp_dbg_2
+ (
+ .read(dbg_2_read),
+ .write(dbg_2_write),
+ .address(dbg_2_address),
+ .readdata(dbg_2_readdata),
+ .writedata(dbg_2_writedata),
+ .waitrequest(dbg_2_waitrequest),
+
.*
);
@@ -307,6 +370,25 @@ module platform
.out_token(token_3),
.out_token_valid(token_valid_3),
+ .dbg_read(dbg_3_read),
+ .dbg_write(dbg_3_write),
+ .dbg_address(dbg_3_address[2:0]),
+ .dbg_readdata(dbg_3_readdata),
+ .dbg_writedata(dbg_3_writedata),
+ .dbg_waitrequest(dbg_3_waitrequest),
+
+ .*
+ );
+
+ sim_slave smp_dbg_3
+ (
+ .read(dbg_3_read),
+ .write(dbg_3_write),
+ .address(dbg_3_address),
+ .readdata(dbg_3_readdata),
+ .writedata(dbg_3_writedata),
+ .waitrequest(dbg_3_waitrequest),
+
.*
);
diff --git a/tb/top/conspiracion.cpp b/tb/top/conspiracion.cpp
index 26ea1f0..0bb2f11 100644
--- a/tb/top/conspiracion.cpp
+++ b/tb/top/conspiracion.cpp
@@ -333,6 +333,10 @@ int main(int argc, char **argv)
*plat.vga, 0x3800'0000, 25'175'000, 50'000'000
);
+ sim_slave dbg_0(*plat.smp_dbg_0, 0x3010'0000, 8);
+ sim_slave dbg_1(*plat.smp_dbg_1, 0x3011'0000, 8);
+ sim_slave dbg_2(*plat.smp_dbg_2, 0x3012'0000, 8);
+ sim_slave dbg_3(*plat.smp_dbg_3, 0x3013'0000, 8);
sim_slave smp_ctrl(*plat.smp_sim, 0x3014'0000, 4);
interconnect<Vconspiracion_platform> avl(plat);
@@ -350,6 +354,10 @@ int main(int argc, char **argv)
avl.attach(hps_ddr3);
avl.attach(timer);
avl.attach(ttyJ0);
+ avl.attach(dbg_0);
+ avl.attach(dbg_1);
+ avl.attach(dbg_2);
+ avl.attach(dbg_3);
avl.attach(smp_ctrl);
avl.attach_intc(intc);