From 859877a00d49baa3b944ee7d61c9c1d573026f07 Mon Sep 17 00:00:00 2001 From: Blaise Tine Date: Sat, 20 Mar 2021 08:40:57 -0400 Subject: [PATCH] tex_unit partial update --- driver/tests/tex_demo/common.h | 4 +- driver/tests/tex_demo/demo | Bin 154176 -> 154216 bytes driver/tests/tex_demo/demo.cpp | 2 + driver/tests/tex_demo/kernel.bin | Bin 6340 -> 6340 bytes driver/tests/tex_demo/kernel.c | 31 +++-- driver/tests/tex_demo/kernel.dump | 2 +- driver/tests/tex_demo/kernel.elf | Bin 8176 -> 8176 bytes hw/rtl/VX_config.vh | 36 ++---- hw/rtl/VX_csr_data.v | 23 ++-- hw/rtl/VX_decode.v | 3 +- hw/rtl/VX_define.vh | 20 +-- hw/rtl/VX_gpu_unit.v | 13 +- hw/rtl/VX_instr_demux.v | 6 +- hw/rtl/interfaces/VX_tex_req_if.v | 8 +- hw/rtl/tex_unit/VX_tex_addr_gen.v | 70 ++++++++++ hw/rtl/tex_unit/VX_tex_clamp.v | 22 ++++ hw/rtl/tex_unit/VX_tex_format.v | 8 ++ hw/rtl/tex_unit/VX_tex_memory.v | 16 ++- hw/rtl/tex_unit/VX_tex_sampler.v | 12 ++ hw/rtl/tex_unit/VX_tex_unit.v | 207 +++++++++++++++++------------- hw/rtl/tex_unit/VX_tex_wrap.v | 23 ++++ runtime/include/vx_intrinsics.h | 29 ++--- 22 files changed, 352 insertions(+), 183 deletions(-) create mode 100644 hw/rtl/tex_unit/VX_tex_addr_gen.v create mode 100644 hw/rtl/tex_unit/VX_tex_clamp.v create mode 100644 hw/rtl/tex_unit/VX_tex_format.v create mode 100644 hw/rtl/tex_unit/VX_tex_sampler.v create mode 100644 hw/rtl/tex_unit/VX_tex_wrap.v diff --git a/driver/tests/tex_demo/common.h b/driver/tests/tex_demo/common.h index 9de20206..9ee0d230 100644 --- a/driver/tests/tex_demo/common.h +++ b/driver/tests/tex_demo/common.h @@ -4,11 +4,13 @@ struct kernel_arg_t { uint32_t num_tasks; uint32_t src_width; uint32_t src_height; + uint32_t src_stride; uint32_t src_pitch; + uint32_t src_ptr; uint32_t dst_width; uint32_t dst_height; + uint32_t dst_stride; uint32_t dst_pitch; - uint32_t src_ptr; uint32_t dst_ptr; }; diff --git a/driver/tests/tex_demo/demo b/driver/tests/tex_demo/demo index aee45cbcdbd45b1599163fa90c33cf441d2b698b..9c1958def59c4f631060098ad229ba1022f3c8f2 100755 GIT binary patch delta 28270 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 MS_(zTU^V{#08JwdUjP6A delta 28227 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

j7JG^2t;2ZnXt0wUg9QwQ^e6s}t*Ulay$B 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 F{{RsEB%%NS diff --git a/driver/tests/tex_demo/demo.cpp b/driver/tests/tex_demo/demo.cpp index 4329c825..2c5db4cc 100644 --- a/driver/tests/tex_demo/demo.cpp +++ b/driver/tests/tex_demo/demo.cpp @@ -156,9 +156,11 @@ int main(int argc, char *argv[]) { kernel_arg.num_tasks = std::min(num_tasks, dst_height); kernel_arg.src_width = src_width; kernel_arg.src_height = src_height; + kernel_arg.src_stride = src_bpp; kernel_arg.src_pitch = src_bpp * src_width * src_height; kernel_arg.dst_width = dst_width; kernel_arg.dst_height = dst_height; + kernel_arg.dst_stride = dst_bpp; kernel_arg.dst_pitch = dst_bpp * dst_width * dst_height; kernel_arg.src_ptr = src_addr; kernel_arg.dst_ptr = dst_addr; diff --git a/driver/tests/tex_demo/kernel.bin b/driver/tests/tex_demo/kernel.bin index c992ca179c3cf86a25996c8145a9eb5d72ad4957..a3119cfc8cd96b6d131ea4596313daa32efbef3f 100755 GIT binary patch delta 12 TcmX?Nc*Jl*5TnD!;6e!iA#((q delta 12 TcmX?Nc*Jl*5aWT3!G#h4Bl86t diff --git a/driver/tests/tex_demo/kernel.c b/driver/tests/tex_demo/kernel.c index 89693f2c..cbcc591c 100644 --- a/driver/tests/tex_demo/kernel.c +++ b/driver/tests/tex_demo/kernel.c @@ -2,12 +2,16 @@ #include #include #include "common.h" + +uint32_t ilog2 (uint32_t value) { + return (uint32_t)(sizeof(uint32_t) * 8UL) - (uint32_t)__builtin_clzl((value << 1) - 1UL) - 1; +} struct tile_arg_t { - struct kernel_arg_t karg; - uint32_t tile_width; - uint32_t tile_height; - float deltaX; - float deltaY; + struct kernel_arg_t karg; + uint32_t tile_width; + uint32_t tile_height; + float deltaX; + float deltaY; }; void kernel_body(int task_id, void* arg) { @@ -36,15 +40,14 @@ int main() { struct kernel_arg_t* arg = (struct kernel_arg_t*)0x0; // configure texture unit - vx_csr_write(CSR_TEX0_ADDR, arg->src_ptr); - vx_csr_write(CSR_TEX0_FORMAT, 0); - vx_csr_write(CSR_TEX0_WIDTH, arg->src_width); - vx_csr_write(CSR_TEX0_HEIGHT, arg->src_height); - vx_csr_write(CSR_TEX0_PITCH, arg->src_pitch); - vx_csr_write(CSR_TEX0_WRAP_U, 0); - vx_csr_write(CSR_TEX0_WRAP_V, 0); - vx_csr_write(CSR_TEX0_MIN_FILTER, 0); - vx_csr_write(CSR_TEX0_MAX_FILTER, 0); + vx_csr_write(CSR_TEX_ADDR(0), arg->src_ptr); + vx_csr_write(CSR_TEX_FORMAT(0), 0); + vx_csr_write(CSR_TEX_WIDTH(0), ilog2(arg->src_width)); + vx_csr_write(CSR_TEX_HEIGHT(0), ilog2(arg->src_height)); + vx_csr_write(CSR_TEX_STRIDE(0), ilog2(arg->src_stride)); + vx_csr_write(CSR_TEX_WRAP_U(0), 0); + vx_csr_write(CSR_TEX_WRAP_V(0), 0); + vx_csr_write(CSR_TEX_FILTER(0), 0); struct tile_arg_t targ; targ.karg = *arg; diff --git a/driver/tests/tex_demo/kernel.dump b/driver/tests/tex_demo/kernel.dump index b9f88ac4..9760426f 100644 --- a/driver/tests/tex_demo/kernel.dump +++ b/driver/tests/tex_demo/kernel.dump @@ -29,7 +29,7 @@ Disassembly of section .init: Disassembly of section .text: 80000050

: -80000050: 01c02783 lw a5,28(zero) # 1c <__stack_usage+0x1c> +80000050: 01402783 lw a5,20(zero) # 14 <__stack_usage+0x14> 80000054: 00100073 ebreak 80000058 : diff --git a/driver/tests/tex_demo/kernel.elf b/driver/tests/tex_demo/kernel.elf index a928fbde411fd70ee3eaa33b496d719b834f1b14..56270014347121543190c4fc1d8d84abc731c6b4 100755 GIT binary patch delta 14 Vcmexh|G|DkkN~5@=3s%j`~Wax1#|!a delta 14 Vcmexh|G|DkkO1R>&A|e5`2jOy1@r&_ diff --git a/hw/rtl/VX_config.vh b/hw/rtl/VX_config.vh index 897e9f4b..8bc7a7f6 100644 --- a/hw/rtl/VX_config.vh +++ b/hw/rtl/VX_config.vh @@ -237,33 +237,21 @@ `define CSR_NW 12'hFC1 `define CSR_NC 12'hFC2 -////////// Texture Unit CSRs ///////////// +////////// Texture Units ////////////////////////////////////////////////////// -`define CSR_TEX_BEGIN 12'hFD0 +`define NUM_TEX_UNITS 2 -// Unit 1 -`define CSR_TEX0_ADDR `CSR_TEX_BEGIN -`define CSR_TEX0_FORMAT `CSR_TEX_BEGIN + 12'h1 -`define CSR_TEX0_WIDTH `CSR_TEX_BEGIN + 12'h2 -`define CSR_TEX0_HEIGHT `CSR_TEX_BEGIN + 12'h3 -`define CSR_TEX0_PITCH `CSR_TEX_BEGIN + 12'h4 -`define CSR_TEX0_WRAP_U `CSR_TEX_BEGIN + 12'h5 -`define CSR_TEX0_WRAP_V `CSR_TEX_BEGIN + 12'h6 -`define CSR_TEX0_MIN_FILTER `CSR_TEX_BEGIN + 12'h7 -`define CSR_TEX0_MAX_FILTER `CSR_TEX_BEGIN + 12'h8 +`define CSR_TEX_STATES 8 +`define CSR_TEX_BEGIN(x) (12'hFD0 + (x) * `CSR_TEX_STATES) -// Unit 2 -`define CSR_TEX1_ADDR `CSR_TEX_BEGIN + 12'h9 -`define CSR_TEX1_FORMAT `CSR_TEX_BEGIN + 12'hA -`define CSR_TEX1_WIDTH `CSR_TEX_BEGIN + 12'hB -`define CSR_TEX1_HEIGHT `CSR_TEX_BEGIN + 12'hC -`define CSR_TEX1_PITCH `CSR_TEX_BEGIN + 12'hD -`define CSR_TEX1_WRAP_U `CSR_TEX_BEGIN + 12'hE -`define CSR_TEX1_WRAP_V `CSR_TEX_BEGIN + 12'hF -`define CSR_TEX1_MIN_FILTER `CSR_TEX_BEGIN + 12'h10 -`define CSR_TEX1_MAX_FILTER `CSR_TEX_BEGIN + 12'h11 - -`define CSR_TEX_END `CSR_TEX1_MAX_FILTER +`define CSR_TEX_ADDR(x) (`CSR_TEX_BEGIN(x) + 12'h00) +`define CSR_TEX_FORMAT(x) (`CSR_TEX_BEGIN(x) + 12'h01) +`define CSR_TEX_WIDTH(x) (`CSR_TEX_BEGIN(x) + 12'h02) +`define CSR_TEX_HEIGHT(x) (`CSR_TEX_BEGIN(x) + 12'h03) +`define CSR_TEX_STRIDE(x) (`CSR_TEX_BEGIN(x) + 12'h04) +`define CSR_TEX_WRAP_U(x) (`CSR_TEX_BEGIN(x) + 12'h05) +`define CSR_TEX_WRAP_V(x) (`CSR_TEX_BEGIN(x) + 12'h06) +`define CSR_TEX_FILTER(x) (`CSR_TEX_BEGIN(x) + 12'h07) // Pipeline Queues //////////////////////////////////////////////////////////// diff --git a/hw/rtl/VX_csr_data.v b/hw/rtl/VX_csr_data.v index c9ac3357..a8302f0f 100644 --- a/hw/rtl/VX_csr_data.v +++ b/hw/rtl/VX_csr_data.v @@ -57,27 +57,26 @@ module VX_csr_data #( | fcsr[fpu_to_csr_if.write_wid][`FFG_BITS-1:0]; end - if (write_enable && (write_addr > `CSR_TEX_END || write_addr < `CSR_TEX_BEGIN)) begin + if (write_enable) begin case (write_addr) `CSR_FFLAGS: fcsr[write_wid][`FFG_BITS-1:0] <= write_data[`FFG_BITS-1:0]; `CSR_FRM: fcsr[write_wid][`FRM_BITS+`FFG_BITS-1:`FFG_BITS] <= write_data[`FRM_BITS-1:0]; `CSR_FCSR: fcsr[write_wid] <= write_data[`FFG_BITS+`FRM_BITS-1:0]; - `CSR_SATP: csr_satp <= write_data; - - `CSR_MSTATUS: csr_mstatus <= write_data; - `CSR_MEDELEG: csr_medeleg <= write_data; - `CSR_MIDELEG: csr_mideleg <= write_data; - `CSR_MIE: csr_mie <= write_data; - `CSR_MTVEC: csr_mtvec <= write_data; - - `CSR_MEPC: csr_mepc <= write_data; - + `CSR_SATP: csr_satp <= write_data; + `CSR_MSTATUS: csr_mstatus <= write_data; + `CSR_MEDELEG: csr_medeleg <= write_data; + `CSR_MIDELEG: csr_mideleg <= write_data; + `CSR_MIE: csr_mie <= write_data; + `CSR_MTVEC: csr_mtvec <= write_data; + `CSR_MEPC: csr_mepc <= write_data; `CSR_PMPCFG0: csr_pmpcfg[0] <= write_data; `CSR_PMPADDR0: csr_pmpaddr[0] <= write_data; default: begin - assert(~write_enable) else $error("%t: invalid CSR write address: %0h", $time, write_addr); + if (write_addr < `CSR_TEX_BEGIN(0) || write_addr > `CSR_TEX_BEGIN(`CSR_TEX_STATES)) begin + $error("%t: invalid CSR write address: %0h", $time, write_addr); + end end endcase end diff --git a/hw/rtl/VX_decode.v b/hw/rtl/VX_decode.v index d30ca443..2fc3ffcd 100644 --- a/hw/rtl/VX_decode.v +++ b/hw/rtl/VX_decode.v @@ -361,7 +361,8 @@ module VX_decode #( `ifdef EXT_TEX_ENABLE 3'h5: begin op_type = `OP_BITS'(`GPU_TEX); - use_rd = 1; + op_mod = instr[26:25]; + use_rd = 1; use_rs1 = 1; use_rs2 = 1; use_rs3 = 1; diff --git a/hw/rtl/VX_define.vh b/hw/rtl/VX_define.vh index 5c85cb5e..1bb0e1af 100644 --- a/hw/rtl/VX_define.vh +++ b/hw/rtl/VX_define.vh @@ -26,7 +26,7 @@ `define CSR_ADDR_BITS 12 -`define CSR_WIDTH 32 +`define CSR_WIDTH 12 /////////////////////////////////////////////////////////////////////////////// @@ -388,13 +388,17 @@ `define XDRAM_TAG_WIDTH (`DDRAM_TAG_WIDTH+`CLOG2(2)) ////////////////////////// Texture Unit Configurable Knobs ////////////////////////////// -`define NUM_TEX_UNITS 2 -`define MADDRW 8 -`define MAXWTW 8 -`define MAXHTW 8 -`define MAXFTW 8 -`define MAXFMW 8 -`define MAXAMW 8 + +`define NTEX_BITS `LOG2UP(`NUM_TEX_UNITS) + +`define TEX_ADDR_BITS 32 +`define TEX_FMT_BITS 3 +`define TEX_WRAP_BITS 2 +`define TEX_WIDTH_BITS 12 +`define TEX_HEIGHT_BITS 12 +`define TEX_STRIDE_BITS 12 +`define TEX_FILTER_BITS 1 + //////////////////////////////////////////////////////////////////////////////////////// `include "VX_types.vh" diff --git a/hw/rtl/VX_gpu_unit.v b/hw/rtl/VX_gpu_unit.v index dcbdab68..86d274e3 100644 --- a/hw/rtl/VX_gpu_unit.v +++ b/hw/rtl/VX_gpu_unit.v @@ -111,13 +111,11 @@ module VX_gpu_unit #( assign tex_req_if.PC = gpu_req_if.PC; assign tex_req_if.rd = gpu_req_if.rd; assign tex_req_if.wb = gpu_req_if.wb; - - for (genvar i = 0; i < `NUM_THREADS; i++) begin - assign tex_req_if.u[i] = gpu_req_if.rs1_data[i]; - assign tex_req_if.v[i] = gpu_req_if.rs2_data[i]; - assign tex_req_if.lod[i] = gpu_req_if.rs3_data[i][31:8]; - assign tex_req_if.t[i] = gpu_req_if.rs3_data[i][7:0]; - end + + assign tex_req_if.unit = gpu_req_if.op_mod[`NTEX_BITS-1:0]; + assign tex_req_if.u = gpu_req_if.rs1_data; + assign tex_req_if.v = gpu_req_if.rs2_data; + assign tex_req_if.lod = gpu_req_if.rs3_data; VX_tex_unit #( .CORE_ID(CORE_ID) @@ -159,6 +157,7 @@ module VX_gpu_unit #( assign rsp_wb = 0; assign rsp_data = warp_ctl_data; + `UNUSED_VAR (gpu_req_if.op_mod) `UNUSED_VAR (gpu_req_if.rs2_data) `UNUSED_VAR (gpu_req_if.rs3_data) `UNUSED_VAR (gpu_req_if.wb) diff --git a/hw/rtl/VX_instr_demux.v b/hw/rtl/VX_instr_demux.v index 68b5123d..d8f7e7bb 100644 --- a/hw/rtl/VX_instr_demux.v +++ b/hw/rtl/VX_instr_demux.v @@ -111,14 +111,14 @@ module VX_instr_demux ( wire gpu_req_valid = execute_if.valid && (execute_if.ex_type == `EX_GPU); VX_skid_buffer #( - .DATAW (`NW_BITS + `NUM_THREADS + 32 + 32 + `GPU_BITS + `NR_BITS + 1 + (3 * `NUM_THREADS * 32)) //update number of bits + .DATAW (`NW_BITS + `NUM_THREADS + 32 + 32 + `GPU_BITS + `MOD_BITS + `NR_BITS + 1 + (3 * `NUM_THREADS * 32)) //update number of bits ) gpu_buffer ( .clk (clk), .reset (reset), .valid_in (gpu_req_valid), .ready_in (gpu_req_ready), - .data_in ({execute_if.wid, execute_if.tmask, execute_if.PC, next_PC, `GPU_OP(execute_if.op_type), execute_if.rd, execute_if.wb, gpr_rsp_if.rs1_data, gpr_rsp_if.rs2_data, gpr_rsp_if.rs3_data}), - .data_out ({gpu_req_if.wid, gpu_req_if.tmask, gpu_req_if.PC, gpu_req_if.next_PC, gpu_req_if.op_type, gpu_req_if.rd, gpu_req_if.wb, gpu_req_if.rs1_data, gpu_req_if.rs2_data, gpu_req_if.rs3_data}), + .data_in ({execute_if.wid, execute_if.tmask, execute_if.PC, next_PC, `GPU_OP(execute_if.op_type), execute_if.op_mod, execute_if.rd, execute_if.wb, gpr_rsp_if.rs1_data, gpr_rsp_if.rs2_data, gpr_rsp_if.rs3_data}), + .data_out ({gpu_req_if.wid, gpu_req_if.tmask, gpu_req_if.PC, gpu_req_if.next_PC, gpu_req_if.op_type, gpu_req_if.op_mod, gpu_req_if.rd, gpu_req_if.wb, gpu_req_if.rs1_data, gpu_req_if.rs2_data, gpu_req_if.rs3_data}), .valid_out (gpu_req_if.valid), .ready_out (gpu_req_if.ready) ); diff --git a/hw/rtl/interfaces/VX_tex_req_if.v b/hw/rtl/interfaces/VX_tex_req_if.v index fffd308f..48555145 100644 --- a/hw/rtl/interfaces/VX_tex_req_if.v +++ b/hw/rtl/interfaces/VX_tex_req_if.v @@ -9,12 +9,14 @@ interface VX_tex_req_if (); wire [`NW_BITS-1:0] wid; wire [`NUM_THREADS-1:0] tmask; wire [31:0] PC; - wire [`NR_BITS-1:0] rd; + wire [`NR_BITS-1:0] rd; wire wb; + + wire [`NUM_THREADS-1:0][`NTEX_BITS-1:0] unit; wire [`NUM_THREADS-1:0][31:0] u; wire [`NUM_THREADS-1:0][31:0] v; - wire [`NUM_THREADS-1:0][23:0] lod; - wire [`NUM_THREADS-1:0][7:0] t; + wire [`NUM_THREADS-1:0][31:0] lod; + wire ready; endinterface diff --git a/hw/rtl/tex_unit/VX_tex_addr_gen.v b/hw/rtl/tex_unit/VX_tex_addr_gen.v new file mode 100644 index 00000000..62ab1431 --- /dev/null +++ b/hw/rtl/tex_unit/VX_tex_addr_gen.v @@ -0,0 +1,70 @@ +`include "VX_define.vh" + +module VX_tex_addr_gen #( + parameter CORE_ID = 0, + parameter REQ_TAG_WIDTH = 1, + parameter FRAC_BITS = 20, + parameter INT_BITS = 32 - FRAC_BITS +) ( + input wire clk, + input wire reset, + + // handshake + + input wire valid_in, + output wire ready_in, + + // inputs + + output wire [REQ_TAG_WIDTH-1:0] req_tag, + input wire [`TEX_FILTER_BITS-1:0] filter, + input wire [`TEX_WRAP_BITS-1:0] wrap_u, + input wire [`TEX_WRAP_BITS-1:0] wrap_v, + + input wire [`TEX_ADDR_BITS-1:0] base_addr, + input wire [1:0] log2_stride, + input wire [`TEX_WIDTH_BITS-1:0] log2_width, + input wire [`TEX_HEIGHT_BITS-1:0] log2_height, + input wire [3:0] lod, + + input wire [31:0] coord_u, + input wire [31:0] coord_v, + + // outputs + + output wire [3:0] mem_req_valid, + output wire [REQ_TAG_WIDTH-1:0] mem_req_tag, + output wire [3:0][31:0] mem_req_addr, + input wire mem_req_ready +); + + `UNUSED_VAR (filter) + `UNUSED_VAR (lod) + + wire [31:0] u, y; + wire [31:0] x_offset, y_offset; + wire [31:0] addr0; + + // addressing mode + + assign x_offset = u >> (5'(FRAC_BITS) - log2_width); + assign y_offset = v >> (5'(FRAC_BITS) - log2_height); + assign addr0 = base_addr + (x_offset + (y_offset << log2_width)) << log2_stride; + + wire [3:0] req_valids = 4'(valid_in); + wire [3:0][31:0] req_address = {4{addr0}}; + + VX_pipe_register #( + .DATAW (1 + 4 + 4 * 32 + REQ_TAG_WIDTH), + .RESETW (1) + ) pipe_reg ( + .clk (clk), + .reset (reset), + .enable (~stall_out), + .data_in ({req_valids, req_address, req_tag}), + .data_out ({mem_req_valid, mem_req_addr, mem_req_tag}) + ); + + assign ready_in = ~stall_out; + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_tex_clamp.v b/hw/rtl/tex_unit/VX_tex_clamp.v new file mode 100644 index 00000000..84efd086 --- /dev/null +++ b/hw/rtl/tex_unit/VX_tex_clamp.v @@ -0,0 +1,22 @@ +`include "VX_define.vh" + +module VX_tex_addr_gen #( + parameter FRAC_BITS = 20, + parameter INT_BITS = 32 - FRAC_BITS +) ( + input wire [`TEX_WRAP_BITS-1:0] wrap_i; + input wire [31:0] coord_i, + input wire [31:0] coord_o +) + + always @(*) begin + case (wrap_i) + `ALU_AND: msc_result[i] = alu_in1[i] & alu_in2_imm[i]; + `ALU_OR: msc_result[i] = alu_in1[i] | alu_in2_imm[i]; + `ALU_XOR: msc_result[i] = alu_in1[i] ^ alu_in2_imm[i]; + //`ALU_SLL, + default: msc_result[i] = alu_in1[i] << alu_in2_imm[i][4:0]; + endcase + end + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_tex_format.v b/hw/rtl/tex_unit/VX_tex_format.v new file mode 100644 index 00000000..663cf8af --- /dev/null +++ b/hw/rtl/tex_unit/VX_tex_format.v @@ -0,0 +1,8 @@ +module VX_tex_format #( + parameter CORE_ID = 0 +) ( + // TODO +) + // TODO + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_tex_memory.v b/hw/rtl/tex_unit/VX_tex_memory.v index dfeb4e39..4b714565 100644 --- a/hw/rtl/tex_unit/VX_tex_memory.v +++ b/hw/rtl/tex_unit/VX_tex_memory.v @@ -1,23 +1,29 @@ `include "VX_define.vh" module VX_tex_memory #( - parameter CORE_ID = 0 + parameter CORE_ID = 0, + parameter TAG_IN_WIDTH = 1 ) ( `SCOPE_IO_VX_lsu_unit input wire clk, input wire reset, - // Dcache interface + // memory interface VX_dcache_core_req_if dcache_req_if, VX_dcache_core_rsp_if dcache_rsp_if, // inputs - VX_lsu_req_if lsu_req_if, + input wire [3:0] req_valid, + input wire [3:0][31:0] req_addr, + input wire [TAG_IN_WIDTH-1:0] req_tag, + output wire req_ready, // outputs - VX_commit_if ld_commit_if - // VX_commit_if st_commit_if + output wire rsp_valid, + output wire [3:0][31:0] rsp_data, + output wire [TAG_IN_WIDTH-1:0] rsp_tag, + input wire rsp_ready ); `UNUSED_PARAM (CORE_ID) diff --git a/hw/rtl/tex_unit/VX_tex_sampler.v b/hw/rtl/tex_unit/VX_tex_sampler.v new file mode 100644 index 00000000..06e2fde6 --- /dev/null +++ b/hw/rtl/tex_unit/VX_tex_sampler.v @@ -0,0 +1,12 @@ +`include "VX_define.vh" + +module VX_tex_sampler #( + parameter CORE_ID = 0 +) ( + input wire clk, + input wire reset +); + + // TODO + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_tex_unit.v b/hw/rtl/tex_unit/VX_tex_unit.v index 8131171b..543b3f31 100644 --- a/hw/rtl/tex_unit/VX_tex_unit.v +++ b/hw/rtl/tex_unit/VX_tex_unit.v @@ -5,20 +5,22 @@ module VX_tex_unit #( parameter CORE_ID = 0 ) ( input wire clk, - input wire reset, + input wire reset, + + // Texture unit <-> Memory Unit + VX_dcache_core_req_if dcache_req_if, + VX_dcache_core_rsp_if dcache_rsp_if, // Inputs VX_tex_req_if tex_req_if, VX_tex_csr_if tex_csr_if, // Outputs - VX_tex_rsp_if tex_rsp_if, - - // Texture unit <-> Memory Unit - VX_dcache_core_req_if dcache_req_if, - VX_dcache_core_rsp_if dcache_rsp_if + VX_tex_rsp_if tex_rsp_if ); + localparam MEM_REQ_TAGW = `NW_BITS + 32 + 1 + `NR_BITS + `NTEX_BITS; + `UNUSED_PARAM (CORE_ID) `UNUSED_VAR (reset) @@ -31,104 +33,131 @@ module VX_tex_unit #( wire [`NUM_THREADS-1:0][31:0] rsp_data; wire stall_in, stall_out; - reg [`CSR_WIDTH-1:0] tex_addr [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_format [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_width [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_height [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_stride [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_wrap_u [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_wrap_v [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_min_filter [`NUM_TEX_UNITS-1: 0]; - reg [`CSR_WIDTH-1:0] tex_max_filter [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_ADDR_BITS-1:0] tex_addr [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_FMT_BITS-1:0] tex_format [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_WIDTH_BITS-1:0] tex_width [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_HEIGHT_BITS-1:0] tex_height [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_STRIDE_BITS-1:0] tex_stride [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_WRAP_BITS-1:0] tex_wrap_u [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_WRAP_BITS-1:0] tex_wrap_v [`NUM_TEX_UNITS-1: 0]; + reg [`TEX_FILTER_BITS-1:0] tex_filter [`NUM_TEX_UNITS-1: 0]; - `UNUSED_VAR (tex_format) - `UNUSED_VAR (tex_stride) - `UNUSED_VAR (tex_wrap_u) - `UNUSED_VAR (tex_wrap_v) - `UNUSED_VAR (tex_min_filter) - `UNUSED_VAR (tex_max_filter) + // CSRs programming - //tex csr programming, need to make make consistent with `NUM_TEX_UNITS - always @(posedge clk ) begin - if (tex_csr_if.write_enable) begin - case (tex_csr_if.write_addr) - `CSR_TEX0_ADDR : tex_addr[0] <= tex_csr_if.write_data; - `CSR_TEX0_FORMAT : tex_format[0] <= tex_csr_if.write_data; - `CSR_TEX0_WIDTH : tex_width[0] <= tex_csr_if.write_data; - `CSR_TEX0_HEIGHT : tex_height[0] <= tex_csr_if.write_data; - `CSR_TEX0_PITCH : tex_stride[0] <= tex_csr_if.write_data; - `CSR_TEX0_WRAP_U : tex_wrap_u[0] <= tex_csr_if.write_data; - `CSR_TEX0_WRAP_V : tex_wrap_v[0] <= tex_csr_if.write_data; - `CSR_TEX0_MIN_FILTER : tex_min_filter[0] <= tex_csr_if.write_data; - `CSR_TEX0_MAX_FILTER : tex_max_filter[0] <= tex_csr_if.write_data; - - `CSR_TEX1_ADDR : tex_addr[1] <= tex_csr_if.write_data; - `CSR_TEX1_FORMAT : tex_format[1] <= tex_csr_if.write_data; - `CSR_TEX1_WIDTH : tex_width[1] <= tex_csr_if.write_data; - `CSR_TEX1_HEIGHT : tex_height[1] <= tex_csr_if.write_data; - `CSR_TEX1_PITCH : tex_stride[1] <= tex_csr_if.write_data; - `CSR_TEX1_WRAP_U : tex_wrap_u[1] <= tex_csr_if.write_data; - `CSR_TEX1_WRAP_V : tex_wrap_v[1] <= tex_csr_if.write_data; - `CSR_TEX1_MIN_FILTER : tex_min_filter[1] <= tex_csr_if.write_data; - `CSR_TEX1_MAX_FILTER : tex_max_filter[1] <= tex_csr_if.write_data; - default:; - endcase + for (genvar i = 0; i < `NUM_TEX_UNITS; ++i) begin + always @(posedge clk ) begin + if (reset) begin + tex_addr[i] <= 0; + tex_format[i] <= 0; + tex_width[i] <= 0; + tex_height[i] <= 0; + tex_stride[i] <= 0; + tex_wrap_u[i] <= 0; + tex_wrap_v[i] <= 0; + tex_filter[i] <= 0; + end begin + if (tex_csr_if.write_enable) begin + case (tex_csr_if.write_addr) + `CSR_TEX_ADDR(i) : tex_addr[i] <= tex_csr_if.write_data; + `CSR_TEX_FORMAT(i) : tex_format[i] <= tex_csr_if.write_data; + `CSR_TEX_WIDTH(i) : tex_width[i] <= tex_csr_if.write_data; + `CSR_TEX_HEIGHT(i) : tex_height[i] <= tex_csr_if.write_data; + `CSR_TEX_STRIDE(i) : tex_stride[i] <= tex_csr_if.write_data; + `CSR_TEX_WRAP_U(i) : tex_wrap_u[i] <= tex_csr_if.write_data; + `CSR_TEX_WRAP_V(i) : tex_wrap_v[i] <= tex_csr_if.write_data; + `CSR_TEX_FILTER(i) : tex_filter[i] <= tex_csr_if.write_data; + default: + assert(tex_csr_if.write_addr >= `CSR_TEX_BEGIN(0) + && tex_csr_if.write_addr < `CSR_TEX_BEGIN(`CSR_TEX_STATES)); + endcase + end + end end end - // texture response - `UNUSED_VAR (tex_req_if.lod) + // address generation - // texture unit <-> dcache - VX_lsu_req_if lsu_req_if(); - VX_commit_if ld_commit_if(); + wire [3:0] mem_req_valid; + wire [3:0][31:0] mem_req_addr; + wire [TAG_IN_WIDTH-1:0] mem_req_tag; + wire mem_req_ready; - VX_tex_memory #( - .CORE_ID(CORE_ID) - ) tex_memory ( + wire mem_rsp_valid; + wire [3:0][31:0] mem_rsp_data; + wire [TAG_IN_WIDTH-1:0] mem_rsp_tag; + wire mem_rsp_ready; + + VX_tex_addr_gen #( + .FRAC_BITS(20) + ) tex_addr_gen ( .clk (clk), .reset (reset), - .dcache_req_if (dcache_req_if), - .dcache_rsp_if (dcache_rsp_if), - .lsu_req_if (lsu_req_if), - .ld_commit_if (ld_commit_if) + + .valid_in (tex_req_if.valid), + .ready_in (tex_req_if.ready), + + .req_tag ({tex_req_if.wid, tex_req_if.PC, tex_req_if.rd, tex_req_if.wb}), + .filter (tex_filter[tex_req_if.unit]), + .wrap_u (tex_wrap_ufilter[tex_req_if.unit]), + .wrap_v (tex_wrap_v[tex_req_if.unit]), + + .base_addr (tex_addr[tex_req_if.unit]), + .log2_stride (tex_stride[tex_req_if.unit]), + .log2_width (tex_width[tex_req_if.unit]), + .log2_height (tex_height[tex_req_if.unit]), + + .coord_u (tex_req_if.u), + .coord_v (tex_req_if.v), + .lod (tex_req_if.lod), + + .mem_req_valid (mem_req_valid), + .mem_req_tag (mem_req_tag), + .mem_req_addr (mem_req_addr), + .mem_req_ready (mem_req_ready) ); - //point sampling - texel address computation - wire [`NUM_THREADS-1:0] pt_addr_valid; - wire [`NUM_THREADS-1:0] pt_addr_ready; + // retrieve texel values from memory + + VX_tex_memory #( + .CORE_ID (CORE_ID), + .REQ_TAG_WIDTH (MEM_REQ_TAGW) + ) tex_memory ( + .clk (clk), + .reset (reset), - for (genvar i = 0; i < `NUM_THREADS; i++) begin - wire [`CSR_WIDTH-1:0] tex_addr_select; - wire [`CSR_WIDTH-1:0] tex_width_select; - wire [`CSR_WIDTH-1:0] tex_height_select; - - assign tex_addr_select = (tex_req_if.t[i] == 'b1) ? tex_addr[1] : tex_addr[0]; - assign tex_width_select = (tex_req_if.t[i] == 'b1) ? tex_width[1] : tex_width[0]; - assign tex_height_select = (tex_req_if.t[i] == 'b1) ? tex_height[1] : tex_height[0]; - - VX_tex_pt_addr #( - .FRAC_BITS(28) - ) tex_pt_addr ( - .clk (clk), - .reset (reset), + // memory interface + .dcache_req_if (dcache_req_if), + .dcache_rsp_if (dcache_rsp_if), - .valid_in (tex_req_if.valid), - .ready_out (pt_addr_ready[i]), + // inputs + req_valid (mem_req_valid), + req_addr (mem_req_addr), + req_tag (mem_req_tag), + req_ready (mem_req_ready), - .tex_addr (tex_addr_select), - .tex_width (tex_width_select), - .tex_height (tex_height_select), + // outputs + rsp_valid (mem_rsp_valid), + rsp_texel (mem_rsp_data), + rsp_tag (mem_rsp_tag), + rsp_ready (mem_rsp_ready) + ); - .tex_u (tex_req_if.u[i]), - .tex_v (tex_req_if.v[i]), + // apply sampler - .pt_addr (lsu_req_if.base_addr[i]), + VX_tex_sampler #( + .CORE_ID (CORE_ID) + ) tex_sampler ( + .clk (clk), + .reset (reset) - .valid_out (pt_addr_valid[i]), - .ready_in (lsu_req_if.ready) - ); - end + // inputs + //.valid_in (mem_rsp_valid), + //.texel (mem_rsp_data), + //.req_wid (mem_rsp_tag), + //.req_PC (mem_rsp_tag), + //.format (mem_rsp_tag), + //.ready_in (mem_rsp_ready), + ); assign tex_req_if.ready = (& pt_addr_ready); @@ -176,8 +205,8 @@ module VX_tex_unit #( `ifdef DBG_PRINT_TEX always @(posedge clk) begin if (tex_csr_if.write_enable - && (tex_csr_if.write_addr <= `CSR_TEX_END - || tex_csr_if.write_addr >= `CSR_TEX_BEGIN)) begin + && (tex_csr_if.write_addr >= `CSR_TEX_BEGIN(0) + && tex_csr_if.write_addr < `CSR_TEX_BEGIN(`CSR_TEX_STATES))) begin $display("%t: core%0d-tex_csr: csr_tex0_addr, csr_data=%0h", $time, CORE_ID, tex_addr[0]); $display("%t: core%0d-tex_csr: csr_tex0_format, csr_data=%0h", $time, CORE_ID, tex_format[0]); $display("%t: core%0d-tex_csr: csr_tex0_width, csr_data=%0h", $time, CORE_ID, tex_width[0]); diff --git a/hw/rtl/tex_unit/VX_tex_wrap.v b/hw/rtl/tex_unit/VX_tex_wrap.v new file mode 100644 index 00000000..01458269 --- /dev/null +++ b/hw/rtl/tex_unit/VX_tex_wrap.v @@ -0,0 +1,23 @@ +`include "VX_define.vh" + +module VX_tex_wrap #( + parameter CORE_ID = 0, + parameter FRAC_BITS = 20, + parameter INT_BITS = 32 - FRAC_BITS +) ( + input wire [`TEX_WRAP_BITS-1:0] wrap_i; + input wire [31:0] coord_i, + input wire [31:0] coord_o +) + + always @(*) begin + case (wrap_i) + `ALU_AND: msc_result[i] = alu_in1[i] & alu_in2_imm[i]; + `ALU_OR: msc_result[i] = alu_in1[i] | alu_in2_imm[i]; + `ALU_XOR: msc_result[i] = alu_in1[i] ^ alu_in2_imm[i]; + //`ALU_SLL, + default: msc_result[i] = alu_in1[i] << alu_in2_imm[i][4:0]; + endcase + end + +endmodule \ No newline at end of file diff --git a/runtime/include/vx_intrinsics.h b/runtime/include/vx_intrinsics.h index 67644ff0..9fad2c92 100644 --- a/runtime/include/vx_intrinsics.h +++ b/runtime/include/vx_intrinsics.h @@ -14,41 +14,41 @@ extern "C" { #endif #define vx_csr_swap(csr, val) ({ \ - unsigned long __v = (unsigned long)(val); \ + unsigned __v = (unsigned )(val); \ __asm__ __volatile__ ("csrrw %0, " __ASM_STR(csr) ", %1" : "=r" (__v) : "rK" (__v) : "memory"); \ __v; \ }) #define vx_csr_read(csr) ({ \ - register unsigned long __v; \ + register unsigned __v; \ __asm__ __volatile__ ("csrr %0, " __ASM_STR(csr) : "=r" (__v) :: "memory"); \ __v; \ }) #define vx_csr_write(csr, val) ({ \ - unsigned long __v = (unsigned long)(val); \ + unsigned __v = (unsigned )(val); \ __asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0" :: "rK" (__v) : "memory"); \ }) #define vx_csr_read_set(csr, val) ({ \ - unsigned long __v = (unsigned long)(val); \ + unsigned __v = (unsigned )(val); \ __asm__ __volatile__ ("csrrs %0, " __ASM_STR(csr) ", %1" : "=r" (__v) : "rK" (__v) : "memory"); \ __v; \ }) #define vx_csr_set(csr, val) ({ \ - unsigned long __v = (unsigned long)(val); \ + unsigned __v = (unsigned )(val); \ __asm__ __volatile__ ("csrs " __ASM_STR(csr) ", %0" :: "rK" (__v) : "memory"); \ }) #define vx_csr_read_clear(csr, val) ({ \ - unsigned long __v = (unsigned long)(val); \ + unsigned __v = (unsigned )(val); \ __asm__ __volatile__ ("csrrc %0, " __ASM_STR(csr) ", %1" : "=r" (__v) : "rK" (__v) : "memory"); \ __v; \ }) #define vx_csr_clear(csr, val) ({ \ - unsigned long __v = (unsigned long)(val); \ + unsigned __v = (unsigned )(val); \ __asm__ __volatile__ ("csrc " __ASM_STR(csr) ", %0" :: "rK" (__v) : "memory"); \ }) @@ -77,6 +77,13 @@ inline void vx_barrier(unsigned barried_id, unsigned num_warps) { asm volatile (".insn s 0x6b, 4, %1, 0cd (%0)" :: "r"(barried_id), "r"(num_warps)); } +// Texture load +#define vx_tex_ld(unit, u, v, lod) ({ \ + register unsigned result; \ + asm volatile (".insn r4 0x6b, 5, " __ASM_STR(unit) ", %0, %1, %2, %3" :: "r"(result), "r"(u), "r"(v), "r"(lod)); \ + result; \ +}) + // Return active warp's thread id inline int vx_thread_id() { int result; @@ -154,14 +161,6 @@ inline int vx_num_instrs() { return result; } -// Texture load instruction -inline int vx_tex_ld(unsigned t, unsigned u, unsigned v, unsigned lod_t) { - lod_t = (lod_t << 8) | t; - int result; - asm volatile (".insn r4 0x6b, 5, 1, %0, %1, %2, %3" :: "r"(result), "r"(u), "r"(v), "r"(lod_t)); - return result; -} - #define __if(b) vx_split(b); \ if (b)