summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-03-09 04:41:29 -0600
committerAlejandro Soto <alejandro@34project.org>2024-03-09 04:41:29 -0600
commit0a9d2b7209ffeac4aaa55ed8bc5d333d2519db6e (patch)
tree795f19deaead190dfade10c45c7211586cebef12
parente11fd369080e7d9b54f1a640c78fb4a1484cb2d6 (diff)
platform/wavelet3d: add picorv32 scheduler core
-rw-r--r--platform/wavelet3d/gfx_axil.sv62
-rw-r--r--platform/wavelet3d/gfx_pkg.sv9
-rw-r--r--platform/wavelet3d/gfx_sched.sv146
-rw-r--r--platform/wavelet3d/gfx_top.sv45
-rw-r--r--platform/wavelet3d/mod.mk6
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