summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/wavelet3d/gfx_pkg.sv2
-rw-r--r--platform/wavelet3d/gfx_sched.sv1
-rw-r--r--platform/wavelet3d/gfx_sim_debug.sv50
-rw-r--r--platform/wavelet3d/gfx_top.sv12
-rw-r--r--platform/wavelet3d/gfx_xbar_sched.sv27
5 files changed, 87 insertions, 5 deletions
diff --git a/platform/wavelet3d/gfx_pkg.sv b/platform/wavelet3d/gfx_pkg.sv
index 42d3f05..fe5b019 100644
--- a/platform/wavelet3d/gfx_pkg.sv
+++ b/platform/wavelet3d/gfx_pkg.sv
@@ -389,6 +389,8 @@ package gfx;
localparam int FIXED_MULADD_DEPTH = 5;
localparam int FIXED_DOTADD_DEPTH = 2 * FIXED_MULADD_DEPTH;
+ localparam word BOOTROM_BASE = 32'h0010_0000;
+
localparam int SCHED_BRAM_WORDS = 2048; // 8KiB
typedef word irq_lines;
diff --git a/platform/wavelet3d/gfx_sched.sv b/platform/wavelet3d/gfx_sched.sv
index b3cbc41..b8b6b7e 100644
--- a/platform/wavelet3d/gfx_sched.sv
+++ b/platform/wavelet3d/gfx_sched.sv
@@ -36,6 +36,7 @@ import gfx::*;
defparam core.ENABLE_IRQ = 1;
defparam core.ENABLE_IRQ_QREGS = 0;
defparam core.ENABLE_IRQ_TIMER = 0;
+ defparam core.PROGADDR_RESET = BOOTROM_BASE;
picorv32 core
(
diff --git a/platform/wavelet3d/gfx_sim_debug.sv b/platform/wavelet3d/gfx_sim_debug.sv
new file mode 100644
index 0000000..4b4622a
--- /dev/null
+++ b/platform/wavelet3d/gfx_sim_debug.sv
@@ -0,0 +1,50 @@
+module gfx_sim_debug
+import gfx::*;
+(
+ input logic clk,
+ rst_n,
+
+ gfx_axil.s axis
+);
+
+ enum int unsigned
+ {
+ INPUT,
+ STALL
+ } state;
+
+ assign axis.rvalid = 0;
+ assign axis.arready = 0;
+ assign axis.awready = 1;
+
+ always_comb
+ unique case (state)
+ INPUT: begin
+ axis.wready = 1;
+ axis.bvalid = axis.wvalid;
+ end
+
+ STALL: begin
+ axis.wready = 0;
+ axis.bvalid = 1;
+ end
+ endcase
+
+ always_ff @(posedge clk or negedge rst_n)
+ if (~rst_n)
+ state <= INPUT;
+ else
+ unique case (state)
+ INPUT:
+ if (axis.wvalid) begin
+ $display("%c", axis.wdata[7:0]);
+ if (~axis.bready)
+ state <= STALL;
+ end
+
+ STALL:
+ if (axis.bready)
+ state <= INPUT;
+ endcase
+
+endmodule
diff --git a/platform/wavelet3d/gfx_top.sv b/platform/wavelet3d/gfx_top.sv
index 8f453a0..d26e401 100644
--- a/platform/wavelet3d/gfx_top.sv
+++ b/platform/wavelet3d/gfx_top.sv
@@ -47,7 +47,7 @@ import gfx::*;
gfx_axib insn_mem();
gfx_pkts geometry(), coverage();
gfx_regfile_io fpint_io();
- gfx_axil bootrom_axi(), sched_axi(), shader_0_axi();
+ gfx_axil bootrom_axi(), debug_axi(), sched_axi(), shader_0_axi();
assign q = fpint_wb.rx.lanes;
assign out_valid = fpint_wb.rx.valid;
@@ -121,6 +121,13 @@ import gfx::*;
.axis(bootrom_axi.s)
);
+ gfx_sim_debug debug
+ (
+ .clk,
+ .rst_n,
+ .axis(debug_axi.s)
+ );
+
gfx_shader shader_0
(
.clk,
@@ -133,7 +140,10 @@ import gfx::*;
(
.clk,
.srst_n,
+
.sched(sched_axi.s),
+
+ .debug(debug_axi.m),
.bootrom(bootrom_axi.m),
.shader_0(shader_0_axi.m)
);
diff --git a/platform/wavelet3d/gfx_xbar_sched.sv b/platform/wavelet3d/gfx_xbar_sched.sv
index f2bd9f9..95e4afb 100644
--- a/platform/wavelet3d/gfx_xbar_sched.sv
+++ b/platform/wavelet3d/gfx_xbar_sched.sv
@@ -5,26 +5,31 @@ import gfx::*;
srst_n,
gfx_axil.s sched,
+
+ gfx_axil.m debug,
gfx_axil.m bootrom,
gfx_axil.m shader_0
);
- localparam word BOOTROM_BASE = 32'h0008_0000;
- localparam word BOOTROM_MASK = 32'hfff8_0000;
- localparam word SHADER_0_BASE = 32'h0010_0000;
+ localparam word BOOTROM_MASK = 32'hfff0_0000;
+ localparam word DEBUG_BASE = 32'h0020_0000;
+ localparam word DEBUG_MASK = 32'hfff0_0000;
+ localparam word SHADER_0_BASE = 32'h0100_0000;
localparam word SHADER_0_MASK = 32'hfff0_0000;
defparam xbar.NM = 1;
- defparam xbar.NS = 2;
+ defparam xbar.NS = 3;
defparam xbar.OPT_LOWPOWER = 0;
defparam xbar.SLAVE_ADDR = {
SHADER_0_BASE,
+ DEBUG_BASE,
BOOTROM_BASE
};
defparam xbar.SLAVE_MASK = {
SHADER_0_MASK,
+ DEBUG_MASK,
BOOTROM_MASK
};
@@ -59,67 +64,81 @@ import gfx::*;
.M_AXI_AWADDR({
shader_0.awaddr,
+ debug.awaddr,
bootrom.awaddr
}),
.M_AXI_AWPROT(),
.M_AXI_AWVALID({
shader_0.awvalid,
+ debug.awvalid,
bootrom.awvalid
}),
.M_AXI_AWREADY({
shader_0.awready,
+ debug.awready,
bootrom.awready
}),
.M_AXI_WDATA({
shader_0.wdata,
+ debug.wdata,
bootrom.wdata
}),
.M_AXI_WSTRB(),
.M_AXI_WVALID({
shader_0.wvalid,
+ debug.wvalid,
bootrom.wvalid
}),
.M_AXI_WREADY({
shader_0.wready,
+ debug.wready,
bootrom.wready
}),
.M_AXI_BRESP('0),
.M_AXI_BVALID({
shader_0.bvalid,
+ debug.bvalid,
bootrom.bvalid
}),
.M_AXI_BREADY({
shader_0.bready,
+ debug.bready,
bootrom.bready
}),
.M_AXI_ARADDR({
shader_0.araddr,
+ debug.araddr,
bootrom.araddr
}),
.M_AXI_ARPROT(),
.M_AXI_ARVALID({
shader_0.arvalid,
+ debug.arvalid,
bootrom.arvalid
}),
.M_AXI_ARREADY({
shader_0.arready,
+ debug.arready,
bootrom.arready
}),
.M_AXI_RDATA({
shader_0.rdata,
+ debug.rdata,
bootrom.rdata
}),
.M_AXI_RRESP('0),
.M_AXI_RVALID({
shader_0.rvalid,
+ debug.rvalid,
bootrom.rvalid
}),
.M_AXI_RREADY({
shader_0.rready,
+ debug.rready,
bootrom.rready
})
);