diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-03-09 04:41:29 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-03-09 04:41:29 -0600 |
| commit | 0a9d2b7209ffeac4aaa55ed8bc5d333d2519db6e (patch) | |
| tree | 795f19deaead190dfade10c45c7211586cebef12 /platform/wavelet3d | |
| parent | e11fd369080e7d9b54f1a640c78fb4a1484cb2d6 (diff) | |
platform/wavelet3d: add picorv32 scheduler core
Diffstat (limited to '')
| -rw-r--r-- | platform/wavelet3d/gfx_axil.sv | 62 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_pkg.sv | 9 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_sched.sv | 146 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_top.sv | 45 | ||||
| -rw-r--r-- | platform/wavelet3d/mod.mk | 6 |
5 files changed, 264 insertions, 4 deletions
diff --git a/platform/wavelet3d/gfx_axil.sv b/platform/wavelet3d/gfx_axil.sv new file mode 100644 index 0000000..f86dfbf --- /dev/null +++ b/platform/wavelet3d/gfx_axil.sv @@ -0,0 +1,62 @@ +// AXI4-Lite, sin wstrb ni axprot +interface gfx_axil; + import gfx::*; + + logic awvalid; + logic awready; + word awaddr; + + logic wvalid; + logic wready; + word wdata; + + logic bvalid; + logic bready; + + logic arvalid; + logic arready; + word araddr; + + logic rvalid; + logic rready; + word rdata; + + modport m + ( + input awready, + wready, + bvalid, + arready, + rvalid, + rdata, + + output awvalid, + awaddr, + wvalid, + wdata, + bready, + arvalid, + araddr, + rready + ); + + modport s + ( + input awvalid, + awaddr, + wvalid, + wdata, + bready, + arvalid, + araddr, + rready, + + output awready, + wready, + bvalid, + arready, + rvalid, + rdata + + ); +endinterface diff --git a/platform/wavelet3d/gfx_pkg.sv b/platform/wavelet3d/gfx_pkg.sv index 75a564a..bd71eff 100644 --- a/platform/wavelet3d/gfx_pkg.sv +++ b/platform/wavelet3d/gfx_pkg.sv @@ -4,8 +4,11 @@ package gfx; typedef logic[31:0] word; typedef logic[63:0] dword; - typedef logic[7:0] float_exp; + localparam int SUBWORD_BITS = $clog2($bits(word)) - $clog2($bits(byte)); + localparam int BYTES_PER_WORD = 1 << SUBWORD_BITS; + + typedef logic[7:0] float_exp; typedef logic[$bits(word) - $bits(float_exp) - 2:0] float_mant; typedef logic[$bits(float_mant):0] float_mant_full; // Incluye '1.' explĂcito typedef logic[$bits(float_mant_full) + 1:0] float_mant_ext; // Considera overflow @@ -218,4 +221,8 @@ package gfx; overflow; } fpint_rnorm_encode; + localparam int SCHED_BRAM_WORDS = 2048; // 8KiB + + typedef word irq_lines; + endpackage diff --git a/platform/wavelet3d/gfx_sched.sv b/platform/wavelet3d/gfx_sched.sv new file mode 100644 index 0000000..ebffd1a --- /dev/null +++ b/platform/wavelet3d/gfx_sched.sv @@ -0,0 +1,146 @@ +module gfx_sched +( + input logic clk, + rst_n, + + gfx_axil.m axim, + input gfx::irq_lines irq +); + + import gfx::*; + + logic axi_ready, axi_valid, bram_ready, bram_read, bram_write, bram_write_next, + mem_instr, mem_la_read, mem_la_write, mem_ready, mem_valid, + sync_rst_n, rst_done, select_bram; + + word bram[SCHED_BRAM_WORDS]; + word axi_rdata, bram_rdata, mem_addr, mem_la_addr, mem_rdata, mem_wdata; + logic[$bits(word) / $bits(byte) - 1:0] mem_wstrb; + + logic[$clog2(SCHED_BRAM_WORDS) - 1:0] bram_addr; + + assign bram_addr = mem_addr[$bits(bram_addr) + SUBWORD_BITS - 1:SUBWORD_BITS]; + assign mem_ready = (axi_valid & axi_ready) | bram_ready; + assign mem_rdata = bram_ready ? bram_rdata : axi_rdata; + assign select_bram = ~|(mem_la_addr & ~((1 << ($bits(bram_addr) + SUBWORD_BITS)) - 1)); + assign bram_write_next = mem_la_write & select_bram; + + defparam core.ENABLE_COUNTERS = 0; + defparam core.ENABLE_COUNTERS64 = 0; + defparam core.BARREL_SHIFTER = 1; + defparam core.COMPRESSED_ISA = 1; + defparam core.CATCH_MISALIGN = 0; + defparam core.CATCH_ILLINSN = 0; + defparam core.ENABLE_MUL = 1; + defparam core.ENABLE_DIV = 1; + defparam core.ENABLE_IRQ = 1; + defparam core.ENABLE_IRQ_QREGS = 0; + defparam core.ENABLE_IRQ_TIMER = 0; + + picorv32 core + ( + .clk, + .resetn(sync_rst_n), + .trap(), + + .mem_valid, + .mem_instr, + .mem_ready, + + .mem_addr, + .mem_wdata, + .mem_wstrb, + .mem_rdata, + + .mem_la_read, + .mem_la_write, + .mem_la_addr, + .mem_la_wdata(), + .mem_la_wstrb(), + + .pcpi_valid(), + .pcpi_insn(), + .pcpi_rs1(), + .pcpi_rs2(), + .pcpi_wr(), + .pcpi_rd(), + .pcpi_wait(0), + .pcpi_ready(0), + + .irq, + .eoi(), + + .trace_valid(), + .trace_data() + ); + + picorv32_axi_adapter axi + ( + .clk, + .resetn(sync_rst_n), + + .mem_axi_awvalid(axim.awvalid), + .mem_axi_awready(axim.awready), + .mem_axi_awaddr(axim.awaddr), + .mem_axi_awprot(), + + .mem_axi_wvalid(axim.wvalid), + .mem_axi_wready(axim.wready), + .mem_axi_wdata(axim.wdata), + .mem_axi_wstrb(), // Potenciales sorpresas + + .mem_axi_bvalid(axim.bvalid), + .mem_axi_bready(axim.bready), + + .mem_axi_arvalid(axim.arvalid), + .mem_axi_arready(axim.arready), + .mem_axi_araddr(axim.araddr), + .mem_axi_arprot(), + + .mem_axi_rvalid(axim.rvalid), + .mem_axi_rready(axim.rready), + .mem_axi_rdata(axim.rdata), + + .mem_valid(mem_valid & axi_valid), + .mem_instr, + .mem_ready(axi_ready), + .mem_addr, + .mem_wdata, + .mem_wstrb, + .mem_rdata(axi_rdata) + ); + + always_ff @(posedge clk) begin + if (bram_write) begin + for (int i = 0; i < $bits(mem_wstrb); ++i) + if (mem_wstrb[i]) + bram[bram_addr][i] <= mem_wdata[i]; + + bram_rdata <= 'x; + end else + bram_rdata <= bram[bram_addr]; + end + + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) begin + rst_done <= 0; + sync_rst_n <= 0; + + axi_valid <= 0; + bram_read <= 0; + bram_ready <= 0; + bram_write <= 0; + end else begin + if (rst_done) + sync_rst_n <= 1; + else + rst_done <= 1; + + axi_valid <= ~select_bram | (axi_valid & ~axi_ready); + bram_read <= mem_la_read & select_bram; + bram_write <= bram_write_next; + bram_ready <= bram_read | bram_write_next; + end + +endmodule diff --git a/platform/wavelet3d/gfx_top.sv b/platform/wavelet3d/gfx_top.sv new file mode 100644 index 0000000..79ffc2d --- /dev/null +++ b/platform/wavelet3d/gfx_top.sv @@ -0,0 +1,45 @@ +module gfx_top +( + input logic clk, + rst_n, + + input gfx::word a[gfx::SHADER_LANES], + b[gfx::SHADER_LANES], + input logic in_valid, + setup_mul_float, + setup_unit_b, + mnorm_put_hi, + mnorm_put_lo, + mnorm_put_mul, + mnorm_zero_b, + mnorm_zero_flags, + minmax_copy_flags, + shiftr_int_signed, + addsub_copy_flags, + addsub_int_operand, + clz_force_nop, + shiftl_copy_flags, + round_copy_flags, + round_enable, + encode_enable, + + output logic out_valid, + output gfx::word q[gfx::SHADER_LANES] +); + + gfx_axil sched_axi(); + + gfx_fpint fpint + ( + .* + ); + + gfx_sched sched + ( + .clk, + .rst_n, + .irq(0), + .axim(sched_axi.m) + ); + +endmodule diff --git a/platform/wavelet3d/mod.mk b/platform/wavelet3d/mod.mk index 6b8bd47..e5b8541 100644 --- a/platform/wavelet3d/mod.mk +++ b/platform/wavelet3d/mod.mk @@ -1,9 +1,9 @@ define core - $(this)/deps := + $(this)/deps := axixbar picorv32 - $(this)/rtl_top := gfx_fpint + $(this)/rtl_top := gfx_top $(this)/rtl_dirs := . - $(this)/rtl_files := gfx_pkg.sv gfx_fpint.sv + $(this)/rtl_files := gfx_pkg.sv gfx_top.sv $(this)/vl_main := main.cpp $(this)/vl_pkgconfig := python3-embed |
