Variable Precision DSP Blocks User Guide: Agilex™ 5 FPGAs and SoCs

ID 813968
Date 4/01/2024
Public
Document Table of Contents

3.3.2. Tensor Fixed-point Mode

In tensor fixed-point mode, two columns of 80-bit weights can be preloaded to the ping-pong buffers by using one of the following methods:
  • Data input feed
  • Side input feed

The ping-pong buffers load the data to two DOT product vector engines to start calculating the signed 20-bit fixed-point DOT product simultaneously. DOT product can support 10 signed 8x8 multiplication. Next, the CPA adder adds the output of each DOT product to its respective 32-bit fixed-point values either the data input from the cascade_data_in[63:0] bus or the previous cycle’s accumulation value. The CPA adder only perform addition. The CPA adder output the data in 32-bit fixed-point format to the core fabric or to the next DSP block in the chain through the cascade_data_out[63:0] bus.

Table 27.  Tensor Fixed-point Mode Equations for Data Input Feed Method
Input Operands Cascade Input Enabled Accumulator Enabled
10-element signed 8x8

Column One = column one cascade_data_in[31:0] + 32-bit fixed-point of (data_in_1[7:0]*data_in_1[7:0] + data_in_2[7:0]*data_in_2[7:0] + data_in_3[7:0]*data_in_3[7:0] + data_in_4[7:0]*data_in_4[7:0] + data_in_5[7:0]*data_in_5[7:0] + data_in_6[7:0]*data_in_6[7:0] + data_in_7[7:0]*data_in_7[7:0] + data_in_8[7:0]*data_in_8[7:0] + data_in_9[7:0]*data_in_9[7:0] + data_in_10[7:0]*data_in_10[7:0])

Column One = column one col_one_accresult[31:0]+ 32-bit fixed-point of (data_in_1[7:0]*data_in_1[7:0] + data_in_2[7:0]*data_in_2[7:0] + data_in_3[7:0]*data_in_3[7:0] + data_in_4[7:0]*data_in_4[7:0] + data_in_5[7:0]*data_in_5[7:0] + data_in_6[7:0]*data_in_6[7:0] + data_in_7[7:0]*data_in_7[7:0] + data_in_8[7:0]*data_in_8[7:0] + data_in_9[7:0]*data_in_9[7:0] + data_in_10[7:0]*data_in_10[7:0])

Column two = column two cascade_data_in[63:32] + 32-bit fixed-point of (data_in_1[7:0]*data_in_1[7:0] + data_in_2[7:0]*data_in_2[7:0] + data_in_3[7:0]*data_in_3[7:0] + data_in_4[7:0]*data_in_4[7:0] + data_in_5[7:0]*data_in_5[7:0] + data_in_6[7:0]*data_in_6[7:0] + data_in_7[7:0]*data_in_7[7:0] + data_in_8[7:0]*data_in_8[7:0] + data_in_9[7:0]*data_in_9[7:0] + data_in_10[7:0]*data_in_10[7:0])

Column two = column two col_two_accresult[31:0]+ 32-bit fixed-point of (data_in_1[7:0]*data_in_1[7:0] + data_in_2[7:0]*data_in_2[7:0] + data_in_3[7:0]*data_in_3[7:0] + data_in_4[7:0]*data_in_4[7:0] + data_in_5[7:0]*data_in_5[7:0] + data_in_6[7:0]*data_in_6[7:0] + data_in_7[7:0]*data_in_7[7:0] + data_in_8[7:0]*data_in_8[7:0] + data_in_9[7:0]*data_in_9[7:0] + data_in_10[7:0]*data_in_10[7:0])

Table 28.  Tensor Fixed-point Mode Equations for Data Input Feed Method
Input Operands Cascade Input Enabled Accumulator Enabled
10-element signed 8x8

Column One = column one cascade_data_in[31:0] + 32-bit Fixed-point of (data_in_1[7:0]*b1 + data_in_2[7:0]*b2 + data_in_3[7:0]*b3 + data_in_4[7:0]*b4 + data_in_5[7:0]*b5 + data_in_6[7:0]*b6 + data_in_7[7:0]*b7 + data_in_8[7:0]*b8 + data_in_9[7:0]*b9 + data_in_10[7:0]*b10)

b1, b2, b3, b4, b5 are feed in by shifting data[87:80]

b6, b7, b8, b9, b10 are feed in by shifting data[95:88]

Column One = column one col_one_accresult[31:0] + 32-bit Fixed-point of (data_in_1[7:0]*b1 + data_in_2[7:0]*b2 + data_in_3[7:0]*b3 + data_in_4[7:0]*b4 + data_in_5[7:0]*b5 + data_in_6[7:0]*b6 + data_in_7[7:0]*b7 + data_in_8[7:0]*b8 + data_in_9[7:0]*b9 + data_in_10[7:0]*b10)

b1, b2, b3, b4, b5 are feed in by shifting data[87:80]

b6, b7, b8, b9, b10 are feed in by shifting data[95:88]

Column Two = column two cascade_data_in[63:32] + 32-bit fixed-point of (data_in_1[7:0]*b1 + data_in_2[7:0]*b2 + data_in_3[7:0]*b3 + data_in_4[7:0]*b4 + data_in_5[7:0]*b5 + data_in_6[7:0]*b6 + data_in_7[7:0]*b7 + data_in_8[7:0]*b8 + data_in_9[7:0]*b9 + data_in_10[7:0]*b10)

b1, b2, b3, b4, b5 are feed in by shifting data[87:80]

b6, b7, b8, b9, b10 are feed in by shifting data[95:88]

Column Two = column two col_two_accresult[31:0] + 32-bit fixed-point of (data_in_1[7:0]*b1 + data_in_2[7:0]*b2 + data_in_3[7:0]*b3 + data_in_4[7:0]*b4 + data_in_5[7:0]*b5 + data_in_6[7:0]*b6 + data_in_7[7:0]*b7 + data_in_8[7:0]*b8 + data_in_9[7:0]*b9 + data_in_10[7:0]*b10)

b1, b2, b3, b4, b5 are feed in by shifting data[87:80]

b6, b7, b8, b9, b10 are feed in by shifting data[95:88]

Figure 55. Tensor Fixed-point Mode One Column Datapath