diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-03 12:22:48 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-03 21:19:09 -0600 |
| commit | 7f95c983b2d77492ea1876b9229b3a7f29c54bbc (patch) | |
| tree | 57e7ac7784ed066fa5b1722a960541dc21557e55 | |
| parent | d6dcfc10f26056485cb260af93027047a6aa8d30 (diff) | |
platform/wavelet3d: add sched debug agent
| -rw-r--r-- | platform/wavelet3d/gfx_pkg.sv | 2 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_sched.sv | 1 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_sim_debug.sv | 50 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_top.sv | 12 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_xbar_sched.sv | 27 |
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 }) ); |
