tensor: Fully connect writeback IO
This commit is contained in:
@@ -87,40 +87,49 @@ module VX_tensor_hopper_core_block import VX_gpu_pkg::*; #(
|
|||||||
wire initiate_ready;
|
wire initiate_ready;
|
||||||
wire writeback_valid;
|
wire writeback_valid;
|
||||||
wire writeback_last;
|
wire writeback_last;
|
||||||
|
wire [`NW_WIDTH-1:0] writeback_wid;
|
||||||
|
wire [4:0] writeback_rd; // tensor writeback IO has 0~31 rd
|
||||||
logic writeback_ready;
|
logic writeback_ready;
|
||||||
|
wire [`NUM_THREADS-1:0][`XLEN-1:0] writeback_data;
|
||||||
|
|
||||||
wire metadata_valid = ~metadata_queue_emptys[0/*FIXME*/];
|
wire metadata_valid = ~metadata_queue_emptys[0/*FIXME*/];
|
||||||
wire hmma_wait = metadata_valid &&
|
wire hmma_wait = metadata_valid &&
|
||||||
(execute_if_data_op_type[0] == `INST_TENSOR_HGMMA_WAIT);
|
(execute_if_data_op_type[0/*FIXME*/] == `INST_TENSOR_HGMMA_WAIT);
|
||||||
// skip HGMMA_WAIT for kickoff
|
// skip HGMMA_WAIT for kickoff
|
||||||
wire initiate_valid = metadata_valid && !hmma_wait;
|
wire initiate_valid = metadata_valid && !hmma_wait;
|
||||||
|
wire [`NW_WIDTH-1:0] initiate_wid = execute_if_data_wid[0/*FIXME*/];
|
||||||
|
|
||||||
// we're recycling execute_if.op_type as operands_if.op_type which might
|
// we're recycling execute_if.op_type as operands_if.op_type which might
|
||||||
// have a different width; let's be safe
|
// have a different width; let's be safe
|
||||||
`STATIC_ASSERT((`INST_ALU_BITS == `INST_OP_BITS),
|
`STATIC_ASSERT((`INST_ALU_BITS == `INST_OP_BITS),
|
||||||
("static assertion failed: `INST_ALU_BITS != `INST_OP_BITS"))
|
("static assertion failed: `INST_ALU_BITS != `INST_OP_BITS"))
|
||||||
|
|
||||||
|
`STATIC_ASSERT((`NUM_THREADS == 8),
|
||||||
|
("static assertion failed: tensor_hopper_core only supports NUM_THREADS == 8"))
|
||||||
|
`STATIC_ASSERT((`XLEN == 32),
|
||||||
|
("static assertion failed: tensor_hopper_core only supports XLEN == 32"))
|
||||||
|
|
||||||
TensorCoreDecoupled tensor_hopper_core (
|
TensorCoreDecoupled tensor_hopper_core (
|
||||||
.clock(clk),
|
.clock(clk),
|
||||||
.reset(reset),
|
.reset(reset),
|
||||||
|
|
||||||
.io_initiate_ready(initiate_ready),
|
.io_initiate_ready(initiate_ready),
|
||||||
.io_initiate_valid(initiate_valid),
|
.io_initiate_valid(initiate_valid),
|
||||||
.io_initiate_bits_wid(`NW_WIDTH'(0)/*FIXME*/),
|
.io_initiate_bits_wid(initiate_wid),
|
||||||
|
|
||||||
.io_writeback_ready(writeback_ready),
|
.io_writeback_ready(writeback_ready),
|
||||||
.io_writeback_valid(writeback_valid),
|
.io_writeback_valid(writeback_valid),
|
||||||
.io_writeback_bits_last(writeback_last),
|
.io_writeback_bits_last(writeback_last),
|
||||||
.io_writeback_bits_wid(/*unused*/),
|
.io_writeback_bits_wid(writeback_wid),
|
||||||
.io_writeback_bits_rd(/*unused*/),
|
.io_writeback_bits_rd(writeback_rd),
|
||||||
.io_writeback_bits_data_0(/*unused*/),
|
.io_writeback_bits_data_0(writeback_data[0]),
|
||||||
.io_writeback_bits_data_1(/*unused*/),
|
.io_writeback_bits_data_1(writeback_data[1]),
|
||||||
.io_writeback_bits_data_2(/*unused*/),
|
.io_writeback_bits_data_2(writeback_data[2]),
|
||||||
.io_writeback_bits_data_3(/*unused*/),
|
.io_writeback_bits_data_3(writeback_data[3]),
|
||||||
.io_writeback_bits_data_4(/*unused*/),
|
.io_writeback_bits_data_4(writeback_data[4]),
|
||||||
.io_writeback_bits_data_5(/*unused*/),
|
.io_writeback_bits_data_5(writeback_data[5]),
|
||||||
.io_writeback_bits_data_6(/*unused*/),
|
.io_writeback_bits_data_6(writeback_data[6]),
|
||||||
.io_writeback_bits_data_7(/*unused*/),
|
.io_writeback_bits_data_7(writeback_data[7]),
|
||||||
|
|
||||||
.io_respA_ready(smem_A_if.rsp_ready),
|
.io_respA_ready(smem_A_if.rsp_ready),
|
||||||
.io_respA_valid(smem_A_if.rsp_valid),
|
.io_respA_valid(smem_A_if.rsp_valid),
|
||||||
@@ -156,7 +165,6 @@ module VX_tensor_hopper_core_block import VX_gpu_pkg::*; #(
|
|||||||
// .writeback_ready(writeback_ready)
|
// .writeback_ready(writeback_ready)
|
||||||
// );
|
// );
|
||||||
|
|
||||||
wire [`NUM_THREADS-1:0][`XLEN-1:0] wb_data = '0;
|
|
||||||
logic commit_select_tensor;
|
logic commit_select_tensor;
|
||||||
|
|
||||||
always @(*) begin
|
always @(*) begin
|
||||||
@@ -193,12 +201,13 @@ module VX_tensor_hopper_core_block import VX_gpu_pkg::*; #(
|
|||||||
if (commit_select_tensor) begin
|
if (commit_select_tensor) begin
|
||||||
commit_if.valid = writeback_valid;
|
commit_if.valid = writeback_valid;
|
||||||
commit_if.data.uuid = '0;
|
commit_if.data.uuid = '0;
|
||||||
commit_if.data.wid = '0; // FIXME
|
commit_if.data.wid = writeback_wid;
|
||||||
commit_if.data.tmask = {NUM_LANES{1'b1}};
|
commit_if.data.tmask = {NUM_LANES{1'b1}};
|
||||||
commit_if.data.PC = '0;
|
commit_if.data.PC = '0;
|
||||||
commit_if.data.wb = writeback_last;
|
commit_if.data.wb = writeback_last;
|
||||||
commit_if.data.rd = (`NR_BITS'(`NUM_IREGS) + `NR_BITS'(4'd3/*FIXME*/));
|
// writeback_rd is 0-based
|
||||||
commit_if.data.data = wb_data;
|
commit_if.data.rd = (`NR_BITS'(`NUM_IREGS) + {1'b0, writeback_rd});
|
||||||
|
commit_if.data.data = writeback_data;
|
||||||
// mark as "ghost" commit. This will prevent this commit from
|
// mark as "ghost" commit. This will prevent this commit from
|
||||||
// decrementing from pending_instr buffer
|
// decrementing from pending_instr buffer
|
||||||
commit_if.data.tensor = 1'b1;
|
commit_if.data.tensor = 1'b1;
|
||||||
@@ -213,7 +222,7 @@ module VX_tensor_hopper_core_block import VX_gpu_pkg::*; #(
|
|||||||
commit_if.data.PC = execute_if_data_PC[0];
|
commit_if.data.PC = execute_if_data_PC[0];
|
||||||
commit_if.data.wb = execute_if_data_wb[0];
|
commit_if.data.wb = execute_if_data_wb[0];
|
||||||
commit_if.data.rd = execute_if_data_rd[0];
|
commit_if.data.rd = execute_if_data_rd[0];
|
||||||
commit_if.data.data = wb_data; // FIXME ?
|
commit_if.data.data = '0; // FIXME ?
|
||||||
commit_if.data.tensor = 1'b0;
|
commit_if.data.tensor = 1'b0;
|
||||||
commit_if.data.pid = 1'b0;
|
commit_if.data.pid = 1'b0;
|
||||||
commit_if.data.sop = 1'b1;
|
commit_if.data.sop = 1'b1;
|
||||||
|
|||||||
Reference in New Issue
Block a user