diff --git a/fu/vector/VectorAllReduceRTL.py b/fu/vector/VectorAllReduceRTL.py index 58d91ac4..cd740f61 100644 --- a/fu/vector/VectorAllReduceRTL.py +++ b/fu/vector/VectorAllReduceRTL.py @@ -90,6 +90,7 @@ def construct(s, DataType, CtrlType, high = (i + 1) * sub_bw # s.connect() works with slice objects directly during elaboration. s.temp_result[i][0:sub_bw] //= s.recv_in[0].msg.payload[low:high] + s.temp_result[i][sub_bw:data_bitwidth] //= 0 @update def update_result(): diff --git a/fu/vector/VectorMulComboRTL.py b/fu/vector/VectorMulComboRTL.py index 880f88d1..b77236e9 100644 --- a/fu/vector/VectorMulComboRTL.py +++ b/fu/vector/VectorMulComboRTL.py @@ -95,8 +95,8 @@ def update_input_output(): for i in range(num_lanes): s.temp_result[i] @= TempDataType(0) - s.Fu[i].recv_in[0].msg[0:sub_bw] @= FuDataType() - s.Fu[i].recv_in[1].msg[0:sub_bw] @= FuDataType() + s.Fu[i].recv_in[0].msg @= 0 + s.Fu[i].recv_in[1].msg @= 0 if s.recv_opt.msg.operation == OPT_VEC_MUL: # Connection: split into vectorized FUs diff --git a/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_scalar_tb.v b/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_scalar_tb.v index 6f2063df..ac470ba4 100644 --- a/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_scalar_tb.v +++ b/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_scalar_tb.v @@ -3,6 +3,7 @@ `include "header.sv" // vcs -sverilog -full64 -timescale=1ns/1ps ../MeshMultiCgraRTL__explicit__pickled.v MeshMultiCgraRTL_2x2_fir_scalar_tb.v -debug_access+all +// vcs -sverilog -full64 -timescale=1ns/1ps ../../../../../coredec_acc_soc/accelerator_soc/MeshMultiCgraRTL__explicit__pickled.v ../MeshMultiCgraRTL_2x2_fir_scalar_tb.v -debug_access+all +incdir+.. module cgra_test ( diff --git a/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_vector_global_reduce_tb.v b/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_vector_global_reduce_tb.v new file mode 100644 index 00000000..a8356e3c --- /dev/null +++ b/multi_cgra/test/sv_test/MeshMultiCgraRTL_2x2_fir_vector_global_reduce_tb.v @@ -0,0 +1,473 @@ +`timescale 1ps/1ps + +`include "header_fir_vector_global_reduce.sv" + +// vcs -sverilog -full64 -timescale=1ns/1ps ../../MeshMultiCgraRTL__explicit_vector_global_reduce__pickled.v ../MeshMultiCgraRTL_2x2_fir_vector_global_reduce_tb.v -debug_access+all +incdir+.. +// vcs -sverilog -full64 -timescale=1ns/1ps ../../../../../coredec_acc_soc/accelerator_soc/MeshMultiCgraRTL__explicit_vector_global_reduce__pickled.v ../MeshMultiCgraRTL_2x2_fir_vector_global_reduce_tb.v -debug_access+all +incdir+.. + +module cgra_test +( +); + + logic [0:0] clk; + logic [0:0] reset; + + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 recv_from_cpu_pkt__msg; + logic [0:0] recv_from_cpu_pkt__rdy; + logic [0:0] recv_from_cpu_pkt__val; + + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 send_to_cpu_pkt__msg; + logic [0:0] send_to_cpu_pkt__rdy; + logic [0:0] send_to_cpu_pkt__val; + + MeshMultiCgraRTL__explicit_vector_global_reduce MultiCGRA (.*); + + int PASS = 'd0; + time pass_time_of = 'd0; + + initial + begin + $display("\nTEST begin\n"); + + clk = 1'b0; + recv_from_cpu_pkt__val = 1'b0; + send_to_cpu_pkt__rdy = 1'b1; + + reset = 1'b0; + #7 + reset = 1'b1; + #50 + reset = 1'b0; + #10 +/* +typedef struct packed { + logic [4:0] src; + logic [4:0] dst; + logic [1:0] src_cgra_id; + logic [1:0] dst_cgra_id; + logic [0:0] src_cgra_x; + logic [0:0] src_cgra_y; + logic [0:0] dst_cgra_x; + logic [0:0] dst_cgra_y; + logic [7:0] opaque; + logic [0:0] vc_id; + MultiCgraPayload_Cmd_Data_DataAddr_Ctrl_CtrlAddr__d9140faa89010e06 payload; +} IntraCgraPacket_4_2x2_16_8_2_CgraPayload__432fde8bfb7da0ed; +*/ +/* +typedef struct packed { + logic [4:0] cmd; + CgraData_32_1_1_1__payload_32__predicate_1__bypass_1__delay_1 data; + logic [6:0] data_addr; + CGRAConfig_7_4_2_4_4_3__49d22cda396bec88 ctrl; + logic [3:0] ctrl_addr; +} MultiCgraPayload_Cmd_Data_DataAddr_Ctrl_CtrlAddr__d9140faa89010e06; +*/ +/* +typedef struct packed { + logic [31:0] payload; + logic [0:0] predicate; + logic [0:0] bypass; + logic [0:0] delay; +} CgraData_32_1_1_1__payload_32__predicate_1__bypass_1__delay_1; +*/ +/* +typedef struct packed { + logic [6:0] operation; + logic [3:0][2:0] fu_in; + logic [7:0][2:0] routing_xbar_outport; + logic [7:0][1:0] fu_xbar_outport; + logic [2:0] vector_factor_power; + logic [0:0] is_last_ctrl; + logic [3:0][1:0] write_reg_from; + logic [3:0][3:0] write_reg_idx; + logic [3:0][0:0] read_reg_from; + logic [3:0][3:0] read_reg_idx; +} CGRAConfig_7_4_2_4_4_3__49d22cda396bec88; +*/ + + #10 + recv_from_cpu_pkt__val = 1'b1; + recv_from_cpu_pkt__msg = unpack_pkt('h0000000180002000200020003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000180002000200020003008000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000000018001e001c001a0019010000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000180026002400220021018000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00000001800220020001e001d020000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000000018002a002800260025028000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000180002000200020003030000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00000001a0000000000000007000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00000000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000060000000000000000004e8d100100001400020000200000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000000006000000000000000000208d100000004000080000100001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000000006000000000000000000018d100000000000000000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000000006000000000000000000018d100000000000000000000003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000220000000000000005000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000080000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00000000c0000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00000000a0000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000000000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008000100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00080000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000800006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000800006000000000000000000108d100b00001000020000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000800006000000000000000000238d100000000000000000100002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000800006000000000000000000018d100000000000000000000003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008000080000000000000003000000000000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008000080000000000000003000000000000000000000000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00080000c0000000000000003000000000000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00080000c0000000000000003000000000000200000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00080000a0000000000000003000000000000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008000000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00200001a0000000000000005000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0020000100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00200000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002000006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002000006000000000000000000198d100100001000020000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0020000060000000000000000000c8d100000004000080000100002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002000006000000000000000000378d100100000040000000200003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0020000000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00280001a0000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028000100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00280000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002800006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002800006000000000000000000018d100000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028000060000000000000000002e8d100100001010020000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028000060000000000000000000b8d100000000040000000100003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028000000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00400001a0000000000000005000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00400001a0000000000000001000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0040000100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00400000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004000006000000000000000000208d100400001440020000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004000006000000000000000000198d100000004000080000100001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0040000060000000000000000000c00200000000040000000200002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004000006000000000000000000018d100000000000000000000003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00400000c0000000000000003000000000000300000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0040000000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00480001a0000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0048000100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00480000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004800006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004800006000000000000000000198d100300004040080000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004800006000000000000000000018d100000000000000000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0048000060000000000000000001000a00200000100000000200003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0048000000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00009001a0000000000000007000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000900100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00009000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000900060000000000000000004e8d100100001400020000200000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000090006000000000000000000208d100000004000080000100001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000090006000000000000000000018d100000000000000000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000090006000000000000000000018d100000000000000000000003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000900080000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00009000c0000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00009000a0000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0000900000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008900100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00089000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000890006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000890006000000000000000000108d100b00001000020000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h000890006000000000000000000238d100000000000000000100002); + #10 // Might need to send this twice if CGRA is really not rdy. + recv_from_cpu_pkt__msg = unpack_pkt('h000890006000000000000000000018d100000000000000000000003); + #10 // Second send. + recv_from_cpu_pkt__msg = unpack_pkt('h000890006000000000000000000018d100000000000000000000003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008900080000000000000003000000000000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008900080000000000000003000000000000000000000000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00089000c0000000000000003000000000000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00089000c0000000000000003000000000000200000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00089000a0000000000000003000000000000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0008900000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00209001a0000000000000005000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0020900100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00209000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002090006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002090006000000000000000000198d100100001000020000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0020900060000000000000000000c8d100000004000080000100002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002090006000000000000000000378d100100000040000000200003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0020900000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00289001a0000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028900100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00289000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002890006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h002890006000000000000000000018d100000000000000000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028900060000000000000000002e8d100100001010020000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028900060000000000000000000b8d100000000040000000100003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0028900000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00409001a0000000000000005000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00409001a0000000000000001000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0040900100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00409000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004090006000000000000000000208d100400001440020000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004090006000000000000000000198d100000004000080000100001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0040900060000000000000000000c00200000000040000000200002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004090006000000000000000000018d100000000000000000000003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00409000c0000000000000003000000000000300000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0040900000000000000000000000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00489001a0000000000000003000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0048900100000000000000009000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h00489000e000000000000004d000000000000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004890006000000000000000000018d100000000000000000000000); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004890006000000000000000000198d100300004040080000000001); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h004890006000000000000000000018d100000000000000000000002); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0048900060000000000000000001000a00200000100000000200003); + #10 + recv_from_cpu_pkt__msg = unpack_pkt('h0048900000000000000000000000000000000000000000000000000); + + #10 + recv_from_cpu_pkt__val = 0; + + #10000 + + if ('d1 == PASS) $display("TEST PASSED at %0t.", pass_time_of); + else $display("TEST FAILED at %0t.", $time); + + $display("%d", unpack_pkt('h01800001c000000000000229700238d100000000000000000100000).payload.data.payload); + + $display("#########cgra 0 tile 0 cnst mem#################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__0.const_mem.reg_file.regs[i]) ) + $display("cgra0tile0cnst %d %d %d (%d)", i, MultiCGRA.cgra__0.tile__0.const_mem.reg_file.regs[i].payload, MultiCGRA.cgra__0.tile__0.const_mem.reg_file.regs[i].predicate, MultiCGRA.cgra__0.tile__0.const_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__1.const_mem.reg_file.regs[i]) ) + $display("cgra0tile1cnst %d %d", i, MultiCGRA.cgra__0.tile__1.const_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__4.const_mem.reg_file.regs[i]) ) + $display("cgra0tile4cnst %d %d", i, MultiCGRA.cgra__0.tile__4.const_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__5.const_mem.reg_file.regs[i]) ) + $display("cgra0tile5cnst %d %d", i, MultiCGRA.cgra__0.tile__5.const_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__8.const_mem.reg_file.regs[i]) ) + $display("cgra0tile8cnst %d %d", i, MultiCGRA.cgra__0.tile__8.const_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__9.const_mem.reg_file.regs[i]) ) + $display("cgra0tile9cnst %d %d", i, MultiCGRA.cgra__0.tile__9.const_mem.reg_file.regs[i]); + end + + $display("********cgra 0 ctrl mem******************"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__0.ctrl_mem.reg_file.regs[i]) ) + $display("cgra0tile0ctrl %d %d", i, MultiCGRA.cgra__0.tile__0.ctrl_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__1.ctrl_mem.reg_file.regs[i]) ) + $display("cgra0tile1ctrl %d %d", i, MultiCGRA.cgra__0.tile__1.ctrl_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__4.ctrl_mem.reg_file.regs[i]) ) + $display("cgra0tile4ctrl %d %d", i, MultiCGRA.cgra__0.tile__4.ctrl_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__5.ctrl_mem.reg_file.regs[i]) ) + $display("cgra0tile5ctrl %d %d", i, MultiCGRA.cgra__0.tile__5.ctrl_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__8.ctrl_mem.reg_file.regs[i]) ) + $display("cgra0tile8ctrl %d %d", i, MultiCGRA.cgra__0.tile__8.ctrl_mem.reg_file.regs[i]); + end + $display("##########################"); + for (int i = 0; i < 512; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.tile__9.ctrl_mem.reg_file.regs[i]) ) + $display("cgra0tile9ctrl %d %d", i, MultiCGRA.cgra__0.tile__9.ctrl_mem.reg_file.regs[i]); + end + + $display("*************cgra0 data mem 0*************"); + for (int i = 0; i < 16; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.data_mem.memory_wrapper__0.memory.regs[i]) ) + $display("cgra0regfile0 (addr 0 init) %d %d (%d)", i, MultiCGRA.cgra__0.data_mem.memory_wrapper__0.memory.regs[i].payload, MultiCGRA.cgra__0.data_mem.memory_wrapper__0.memory.regs[i]); + end + $display("#############cgra0 data mem 1#############"); + for (int i = 0; i < 16; i++) + begin + if ( !$isunknown(MultiCGRA.cgra__0.data_mem.memory_wrapper__1.memory.regs[i]) ) + $display("cgra0regfile1 (addr 0 init) %d %d", i, MultiCGRA.cgra__0.data_mem.memory_wrapper__1.memory.regs[i]); + end + + $finish(); + end + + initial + forever + begin + #5 + clk = ~clk; + end + + always @ (posedge clk or negedge clk) + begin + #1 + + if ( send_to_cpu_pkt__val && ( ('d2212 * 'd2 + 'd3) == send_to_cpu_pkt__msg.payload.data.payload ) ) + begin + PASS = 'd1; + pass_time_of = $time; + end + end + + /*initial + begin + $dumpfile("./output.vcd"); + $dumpvars (0, cgra_test); + end*/ + // The Verilator test fails on these $fsdb* functions; if pragmas do not work, add --bbox-sys to Verilator cmd. +`ifndef VERILATOR + initial + begin + $fsdbDumpfile("./output.fsdb"); + $fsdbDumpvars ("+all", "cgra_test"); + $fsdbDumpMDA; + $fsdbDumpSVA; + end +`endif + + +endmodule + diff --git a/multi_cgra/test/sv_test/header_fir_vector_global_reduce.sv b/multi_cgra/test/sv_test/header_fir_vector_global_reduce.sv new file mode 100644 index 00000000..6a0e3247 --- /dev/null +++ b/multi_cgra/test/sv_test/header_fir_vector_global_reduce.sv @@ -0,0 +1,358 @@ +function automatic IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 make_intra_cgra_pkt +( + input logic [4:0] src, + input logic [4:0] dst, + input logic [4:0] cmd, + input logic [31:0] data_payload, + input logic data_predicate, + input logic [6:0] data_addr, + input logic [6:0] ctrl_operation +); + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 pkt; + integer file_handle; + + pkt.src = src; + pkt.dst = dst; + pkt.src_cgra_id = 2'd0; + pkt.dst_cgra_id = 2'd0; + pkt.src_cgra_x = 1'b0; + pkt.src_cgra_y = 1'b0; + pkt.dst_cgra_x = 1'b0; + pkt.dst_cgra_y = 1'b0; + pkt.opaque = 8'd0; + pkt.vc_id = 1'b0; + + + pkt.payload.cmd = cmd; + pkt.payload.data_addr = data_addr; + pkt.payload.ctrl_addr = 4'd0; + + pkt.payload.data.payload = data_payload; + pkt.payload.data.predicate = data_predicate; + pkt.payload.data.bypass = 1'b0; + pkt.payload.data.delay = 1'b0; + + + pkt.payload.ctrl.operation = ctrl_operation; + pkt.payload.ctrl.fu_in = '{default: 3'd0}; + pkt.payload.ctrl.routing_xbar_outport = '{default: 3'd0}; + pkt.payload.ctrl.fu_xbar_outport = '{default: 2'd0}; + pkt.payload.ctrl.vector_factor_power = 3'd0; + pkt.payload.ctrl.is_last_ctrl = 1'b0; + pkt.payload.ctrl.write_reg_from = '{default: 2'd0}; + pkt.payload.ctrl.write_reg_idx = '{default: 4'd0}; + pkt.payload.ctrl.read_reg_from = '{default: 1'd0}; + pkt.payload.ctrl.read_reg_idx = '{default: 4'd0}; + +/* +111103b7 lui x7 +00138393 ADDI x7 +01039393 slli x7, x7, 16 +01039393 slli x7, x7, 16 +lui 31 +addi 31 +ADD 7 7 31 +0070b023 sd x7, 0(x1) + +22220437 lui x8 +addi x8 +01041413 slli x8, x8, 16 +01041413 slli x8, x8, 16 +lui 31 +addi 31 +ADD 8 8 31 +0080b423 sd x8, 8(x1) + +33330537 lui x10 +ADDI x10 +01051513 slli x10, x10, 16 +01051513 slli x10, x10, 16 +lui 31 +addi 31 +ADD 10 10 31 +00a0b823 sd x10, 16(x1) + +01808093 Advance x1 += 24 (h1018) +*/ + + file_handle = $fopen("hexcode.txt", "a"); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[63:0] ); + $fdisplay( file_handle, "%h3b7", (logic_pkt(pkt)[63:44] + logic_pkt(pkt)[43]) ); + $fdisplay( file_handle, "%h38393", (logic_pkt(pkt)[43:32] + logic_pkt(pkt)[31]) ); + $fdisplay( file_handle, "01039393" ); + $fdisplay( file_handle, "01039393" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[31:12] + logic_pkt(pkt)[11]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[11:0] ); + $fdisplay( file_handle, "01f383b3" ); + $fdisplay( file_handle, "0070b023" ); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[127:64] ); + $fdisplay( file_handle, "%h437", (logic_pkt(pkt)[127:108] + logic_pkt(pkt)[107]) ); + $fdisplay( file_handle, "%h40413", (logic_pkt(pkt)[107:96] + logic_pkt(pkt)[95]) ); + $fdisplay( file_handle, "01041413" ); + $fdisplay( file_handle, "01041413" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[95:76] + logic_pkt(pkt)[75]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[75:64] ); + $fdisplay( file_handle, "01f40433" ); + $fdisplay( file_handle, "0080b423" ); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[184:128] ); + $fdisplay( file_handle, "%h537", ({ {7{1'b0}}, logic_pkt(pkt)[184:172] } + logic_pkt(pkt)[171]) ); + $fdisplay( file_handle, "%h50513", ( logic_pkt(pkt)[171:160] + logic_pkt(pkt)[159]) ); + $fdisplay( file_handle, "01051513" ); + $fdisplay( file_handle, "01051513" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[159:140] + logic_pkt(pkt)[139]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[139:128] ); + $fdisplay( file_handle, "01f50533" ); + $fdisplay( file_handle, "00a0b823" ); + // Advance x1 += 24 (h1018) + $fdisplay( file_handle, "01808093" ); + $fclose(file_handle); + + return pkt; +endfunction + +function automatic IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 make_intra_cgra_config_pkt +( + input logic [4:0] src, + input logic [4:0] dst, + input logic [4:0] cmd, + input logic [6:0] operation, + input logic [3:0][2:0] fu_in_code, + input logic [7:0][2:0] routing_xbar_outport, + input logic [7:0][1:0] fu_xbar_outport, + input logic [3:0][1:0] write_reg_from, + input logic [3:0][0:0] read_reg_from, + input logic [3:0][3:0] write_reg_idx, + input logic [3:0][3:0] read_reg_idx, + input logic [3:0] ctrl_addr +); + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 pkt; + integer file_handle; + + pkt.src = src; + pkt.dst = dst; + pkt.src_cgra_id = 2'd0; + pkt.dst_cgra_id = 2'd0; + pkt.src_cgra_x = 1'b0; + pkt.src_cgra_y = 1'b0; + pkt.dst_cgra_x = 1'b0; + pkt.dst_cgra_y = 1'b0; + pkt.opaque = 8'd0; + pkt.vc_id = 1'b0; + + pkt.payload.cmd = cmd; // CMD_CONFIG + pkt.payload.data = '0; // Not used for config packets + pkt.payload.data_addr = 7'd0; + pkt.payload.ctrl_addr = ctrl_addr; + + pkt.payload.ctrl.operation = operation; + pkt.payload.ctrl.fu_in = fu_in_code; + pkt.payload.ctrl.routing_xbar_outport = routing_xbar_outport; + pkt.payload.ctrl.fu_xbar_outport = fu_xbar_outport; + pkt.payload.ctrl.vector_factor_power = 3'd0; + pkt.payload.ctrl.is_last_ctrl = 1'b0; + pkt.payload.ctrl.write_reg_from = write_reg_from; + pkt.payload.ctrl.write_reg_idx = write_reg_idx; + pkt.payload.ctrl.read_reg_from = read_reg_from; + pkt.payload.ctrl.read_reg_idx = read_reg_idx; + + file_handle = $fopen("hexcode.txt", "a"); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[63:0] ); + $fdisplay( file_handle, "%h3b7", (logic_pkt(pkt)[63:44] + logic_pkt(pkt)[43]) ); + $fdisplay( file_handle, "%h38393", (logic_pkt(pkt)[43:32] + logic_pkt(pkt)[31]) ); + $fdisplay( file_handle, "01039393" ); + $fdisplay( file_handle, "01039393" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[31:12] + logic_pkt(pkt)[11]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[11:0] ); + $fdisplay( file_handle, "01f383b3" ); + $fdisplay( file_handle, "0070b023" ); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[127:64] ); + $fdisplay( file_handle, "%h437", (logic_pkt(pkt)[127:108] + logic_pkt(pkt)[107]) ); + $fdisplay( file_handle, "%h40413", (logic_pkt(pkt)[107:96] + logic_pkt(pkt)[95]) ); + $fdisplay( file_handle, "01041413" ); + $fdisplay( file_handle, "01041413" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[95:76] + logic_pkt(pkt)[75]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[75:64] ); + $fdisplay( file_handle, "01f40433" ); + $fdisplay( file_handle, "0080b423" ); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[184:128] ); + $fdisplay( file_handle, "%h537", ({ {7{1'b0}}, logic_pkt(pkt)[184:172] } + logic_pkt(pkt)[171]) ); + $fdisplay( file_handle, "%h50513", ( logic_pkt(pkt)[171:160] + logic_pkt(pkt)[159]) ); + $fdisplay( file_handle, "01051513" ); + $fdisplay( file_handle, "01051513" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[159:140] + logic_pkt(pkt)[139]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[139:128] ); + $fdisplay( file_handle, "01f50533" ); + $fdisplay( file_handle, "00a0b823" ); + // Advance x1 += 24 (h1018) + $fdisplay( file_handle, "01808093" ); + $fclose(file_handle); + + return pkt; +endfunction + +function automatic IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 make_intra_cgra_config_pkt_w_data +( + input logic [4:0] src, + input logic [4:0] dst, + input logic [4:0] cmd, + input logic [6:0] operation, + input logic [3:0][2:0] fu_in_code, + input logic [7:0][2:0] routing_xbar_outport, + input logic [7:0][1:0] fu_xbar_outport, + input logic [3:0][1:0] write_reg_from, + input logic [3:0][0:0] read_reg_from, + input logic [3:0][3:0] write_reg_idx, + input logic [3:0][3:0] read_reg_idx, + input logic [3:0] ctrl_addr, + input logic [31:0] data, + input logic [0:0] pred, + input logic [6:0] data_addr +); + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 pkt; + integer file_handle; + + pkt.src = src; + pkt.dst = dst; + pkt.src_cgra_id = 2'd0; + pkt.dst_cgra_id = 2'd0; + pkt.src_cgra_x = 1'b0; + pkt.src_cgra_y = 1'b0; + pkt.dst_cgra_x = 1'b0; + pkt.dst_cgra_y = 1'b0; + pkt.opaque = 8'd0; + pkt.vc_id = 1'b0; + + pkt.payload.cmd = cmd; + pkt.payload.data_addr = data_addr; + pkt.payload.ctrl_addr = ctrl_addr; + + pkt.payload.ctrl.operation = operation; + pkt.payload.ctrl.fu_in = fu_in_code; + pkt.payload.ctrl.routing_xbar_outport = routing_xbar_outport; + pkt.payload.ctrl.fu_xbar_outport = fu_xbar_outport; + pkt.payload.ctrl.vector_factor_power = 3'd0; + pkt.payload.ctrl.is_last_ctrl = 1'b0; + pkt.payload.ctrl.write_reg_from = write_reg_from; + pkt.payload.ctrl.write_reg_idx = write_reg_idx; + pkt.payload.ctrl.read_reg_from = read_reg_from; + pkt.payload.ctrl.read_reg_idx = read_reg_idx; + + pkt.payload.data.payload = data; + pkt.payload.data.predicate = pred; + pkt.payload.data.bypass = 1'b0; + pkt.payload.data.delay = 1'b0; + + file_handle = $fopen("hexcode.txt", "a"); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[63:0] ); + $fdisplay( file_handle, "%h3b7", (logic_pkt(pkt)[63:44] + logic_pkt(pkt)[43]) ); + $fdisplay( file_handle, "%h38393", (logic_pkt(pkt)[43:32] + logic_pkt(pkt)[31]) ); + $fdisplay( file_handle, "01039393" ); + $fdisplay( file_handle, "01039393" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[31:12] + logic_pkt(pkt)[11]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[11:0] ); + $fdisplay( file_handle, "01f383b3" ); + $fdisplay( file_handle, "0070b023" ); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[127:64] ); + $fdisplay( file_handle, "%h437", (logic_pkt(pkt)[127:108] + logic_pkt(pkt)[107]) ); + $fdisplay( file_handle, "%h40413", (logic_pkt(pkt)[107:96] + logic_pkt(pkt)[95]) ); + $fdisplay( file_handle, "01041413" ); + $fdisplay( file_handle, "01041413" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[95:76] + logic_pkt(pkt)[75]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[75:64] ); + $fdisplay( file_handle, "01f40433" ); + $fdisplay( file_handle, "0080b423" ); + //$fdisplay( file_handle, "%h", logic_pkt(pkt)[184:128] ); + $fdisplay( file_handle, "%h537", ({ {7{1'b0}}, logic_pkt(pkt)[184:172] } + logic_pkt(pkt)[171]) ); + $fdisplay( file_handle, "%h50513", ( logic_pkt(pkt)[171:160] + logic_pkt(pkt)[159]) ); + $fdisplay( file_handle, "01051513" ); + $fdisplay( file_handle, "01051513" ); + $fdisplay( file_handle, "%hfb7", (logic_pkt(pkt)[159:140] + logic_pkt(pkt)[139]) ); + $fdisplay( file_handle, "%hf8f93", logic_pkt(pkt)[139:128] ); + $fdisplay( file_handle, "01f50533" ); + $fdisplay( file_handle, "00a0b823" ); + // Advance x1 += 24 (h1018) + $fdisplay( file_handle, "01808093" ); + $fclose(file_handle); + + return pkt; +endfunction + +function automatic logic [185-1:0] logic_pkt (IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 p); + logic_pkt = { + // Header (MSB->LSB order) + p.src, + p.dst, + p.src_cgra_id, + p.dst_cgra_id, + p.src_cgra_x, + p.src_cgra_y, + p.dst_cgra_x, + p.dst_cgra_y, + p.opaque, + p.vc_id, + // Payload + p.payload.cmd, + p.payload.data.payload, + p.payload.data.predicate, + p.payload.data.bypass, + p.payload.data.delay, + p.payload.data_addr, + p.payload.ctrl.operation, + p.payload.ctrl.fu_in, + p.payload.ctrl.routing_xbar_outport, + p.payload.ctrl.fu_xbar_outport, + p.payload.ctrl.vector_factor_power, + p.payload.ctrl.is_last_ctrl, + p.payload.ctrl.write_reg_from, + p.payload.ctrl.write_reg_idx, + p.payload.ctrl.read_reg_from, + p.payload.ctrl.read_reg_idx, + p.payload.ctrl_addr + }; +endfunction + +function automatic IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 unpack_pkt (logic [217-1:0] v); + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 p; + // Use a running index from LSB upward for clarity + int i = 0; + // ctrl_addr (4) + p.payload.ctrl_addr = v[i +: 4]; i += 4; + // ctrl (107) + p.payload.ctrl.read_reg_idx = v[i +: 16]; i += 16; + p.payload.ctrl.read_reg_from = v[i +: 4]; i += 4; + p.payload.ctrl.write_reg_idx = v[i +: 16]; i += 16; + p.payload.ctrl.write_reg_from = v[i +: 8]; i += 8; + p.payload.ctrl.is_last_ctrl = v[i +: 1]; i += 1; + p.payload.ctrl.vector_factor_power = v[i +: 3]; i += 3; + p.payload.ctrl.fu_xbar_outport = v[i +: 16]; i += 16; // 8*2 + p.payload.ctrl.routing_xbar_outport = v[i +: 24]; i += 24; // 8*3 + p.payload.ctrl.fu_in = v[i +: 12]; i += 12; // 4*3 + p.payload.ctrl.operation = v[i +: 7]; i += 7; + // data_addr (7) + p.payload.data_addr = v[i +: 7]; i += 7; + // data (67) + p.payload.data.delay = v[i +: 1]; i += 1; + p.payload.data.bypass = v[i +: 1]; i += 1; + p.payload.data.predicate = v[i +: 1]; i += 1; + p.payload.data.payload = v[i +: 64]; i += 64; + // cmd (5) + p.payload.cmd = v[i +: 5]; i += 5; + // header tail (27) + p.vc_id = v[i +: 1]; i += 1; + p.opaque = v[i +: 8]; i += 8; + p.dst_cgra_y = v[i +: 1]; i += 1; + p.dst_cgra_x = v[i +: 1]; i += 1; + p.src_cgra_y = v[i +: 1]; i += 1; + p.src_cgra_x = v[i +: 1]; i += 1; + p.dst_cgra_id = v[i +: 2]; i += 2; + p.src_cgra_id = v[i +: 2]; i += 2; + p.dst = v[i +: 5]; i += 5; + p.src = v[i +: 5]; i += 5; + + // Consistency check. + if (i != 217) + $error("unpack index mismatch: %0d != %0d", i, 217); + + return p; +endfunction +