C ドライバー ファイルと float 型 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

C ドライバー ファイルは、常にデータ転送に 32 ビット符号なし整数 (U32) を使用します。次の例では、関数で float 型の引数 ar1 が使用されています。a の値が設定され、r1 の値が返されます。

float calculate(float a, float *r1)
{
#pragma HLS INTERFACE mode=ap_vld register port=r1
#pragma HLS INTERFACE mode=s_axilite port=a 
#pragma HLS INTERFACE mode=s_axilite port=r1 
#pragma HLS INTERFACE mode=s_axilite port=return 

 *r1 = 0.5f*a;
 return (a>0);
}

合成後、Vitis HLS ですべてのポートがデフォルトの AXI4-Lite インターフェイスにまとめられ、C ドライバー ファイルが作成されますが、次の図に示すように、ドライバー ファイルでは U32 型が使用されています。

// API to set the value of A
void XCalculate_SetA(XCalculate *InstancePtr, u32 Data) {
    Xil_AssertVoid(InstancePtr != NULL);
    Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
    XCalculate_WriteReg(InstancePtr->Hls_periph_bus_BaseAddress, 
XCALCULATE_HLS_PERIPH_BUS_ADDR_A_DATA, Data);
}

// API to get the value of R1
u32 XCalculate_GetR1(XCalculate *InstancePtr) {
    u32 Data;

    Xil_AssertNonvoid(InstancePtr != NULL);
    Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);

    Data = XCalculate_ReadReg(InstancePtr->Hls_periph_bus_BaseAddress, 
XCALCULATE_HLS_PERIPH_BUS_ADDR_R1_DATA);
    return Data;
}

これらの関数が float 型で直接使用できる場合は、書き込み値および読み出し値が予測される float 型と一貫しません。これらの関数をソフトウェアで使用する場合は、次を使用して型を変換します。

float a=3.0f,r1;
u32 ua,ur1;

// cast float “a” to type U32
XCalculate_SetA(&calculate,*((u32*)&a));
ur1=XCalculate_GetR1(&calculate);

// cast return type U32 to float type for “r1”
r1=*((float*)&ur1);