SV DPI-c export method

** Error (suppressible): (vsim-3756) The DPI exported function ‘encryption_inputs_1’ must be called from a context imported tf. A call from a non-context imported tf was detected. The caller’s scope is ciphertest_sv.

The nearest DPI import tf up the call chain is at line 34 of file …/code/10_7_aes_gcm/verilog/file.sv

Time: 0 ns Iteration: 0 Instance: /ciphertest_sv

sv file: module ciphertest_sv;

import "DPI-C" function void sv_print_encryption_inputs(
    input string key, input string iv, input string p, input string a
);

import "DPI-C" function void sv_print_encryption_outputs(
    input string c, input string tag
);

import "DPI-C" function void sv_print_decryption_inputs(
    input string key, input string iv, input string c, input string tag, input string a
);

import "DPI-C" function void sv_print_decryption_output(
    input string p
);

import "DPI-C" function void sv_print_final_result(
    input string msg
);

// Import the C function for running the ciphertest
import "DPI-C" function int ciphertest(input byte key[], input byte iv[], input byte p[], input byte a[], input byte c[],
                                       input int np, input int na, input byte nt, output string r);

// Import the C function for running the test
import "DPI-C" function int run_test();


// Task to call the run_test function in C
task run_full_test;
    int result;
    result = run_test();
    if (result == 0) begin
        $display("Full test passed.");
    end else begin
        $display("Full test failed with error code: %0d", result);
    end
endtask

initial begin
    // Run the full test task
    run_full_test();
end

// Define the DPI-C functions to print the received data
export "DPI-C" function encryption_inputs_1;
export "DPI-C" function encryption_outputs_1;
export "DPI-C" function decryption_inputs_1;
export "DPI-C" function decryption_outputs_1;
export "DPI-C" function final_result_1;

function void encryption_inputs_1(
    input string key, input string iv, input string p, input string a
);
//sv_print_encryption_inputs(
  //  input string key, input string iv, input string p, input string a

// );

    $display("Encryption Inputs:");
    $display("Key: %s", key);
    $display("IV: %s", iv);
    $display("Plaintext: %s", p);
    $display("AAD: %s", a);
endfunction

function void encryption_outputs_1(
    input string c, input string tag
);
    $display("Encryption Outputs:");
    $display("Ciphertext: %s", c);
    $display("Tag: %s", tag);
endfunction

function void decryption_inputs_1(
    input string key, input string iv, input string c, input string tag, input string a
);
    $display("Decryption Inputs:");
    $display("Key: %s", key);
    $display("IV: %s", iv);
    $display("Ciphertext: %s", c);
    $display("Tag: %s", tag);
    $display("AAD: %s", a);
endfunction

function void decryption_outputs_1(
    input string p
);
    $display("Decryption Output:");
    $display("Plaintext: %s", p);
endfunction

function void final_result_1(
    input string msg
);
    $display("Final Result: %s", msg);
endfunction

endmodule
and my c code : include <stdio.h>
include <stdint.h>
include <string.h>
include “micro_aes.h”
include “micro_aes.c”

define TESTFILEPATH “…/code/10_7_aes_gcm/c/GCM_EncryptExtIV128.rsp”

// Function declarations for DPI-C interface
extern void encryption_inputs_1(const char* key, const char* iv, const char* p, const char* a);
extern void encryption_outputs_1(const char* c, const char* tag);
extern void decryption_inputs_1(const char* key, const char* iv, const char* c, const char* tag, const char* a);
extern void decryption_outputs_1(const char* p);
extern void final_result_1(const char* msg);

void str2bytes(const char* hex, uint8_t* bytes) {
unsigned shl = 0;
for (–bytes; *hex; ++hex) {
if (*hex < ‘0’ || ‘f’ < *hex) continue;
if ((shl ^= 4) != 0) *++bytes = 0;
*bytes |= (*hex % 16 + (*hex > ‘9’) * 9) << shl;
}
}

void bytes2str(const uint8_t* bytes, char* str, const size_t len) {
const char offset = 0x27; /* offset must be 7 for uppercase */
size_t i = len + len, shr = 0;
for (str[i] = 0; i–; shr ^= 4) {
str[i] = bytes[i / 2] >> shr & 0xF | ‘0’;
if (str[i] > ‘9’) str[i] += offset;
}
}

int ciphertest(uint8_t* key, uint8_t* iv, uint8_t* p, uint8_t* a, uint8_t* c,
size_t np, size_t na, uint8_t nt, char* r) {
char sk[65], si[2*GCM_NONCE_LEN + 1], sp[0x100], sc[0x100], sa[0x100], msg[30];
uint8_t tmp[0x80], t = 0;
sprintf(msg, “%s”, “passed the test”);

// Call SV function to print encryption inputs
char sk_str[65], si_str[2*GCM_NONCE_LEN + 1], sp_str[0x100], sa_str[0x100];
bytes2str(key, sk_str, AES_KEY_SIZE);
bytes2str(iv, si_str, GCM_NONCE_LEN);
bytes2str(p, sp_str, np);
bytes2str(a, sa_str, na);

   
 encryption_inputs_1(sk_str, si_str, sp_str, sa_str);

// Perform encryption
AES_GCM_encrypt(key, iv, p, np, a, na, tmp, tmp + np);

// Call SV function to print encryption outputs
char tmp_str[0x100], tmp_tag_str[0x100];
bytes2str(tmp, tmp_str, np);
bytes2str(tmp + np, tmp_tag_str, nt);
encryption_outputs_1(tmp_str, tmp_tag_str);

if (memcmp(c, tmp, np + nt)) {
    sprintf(msg, "%s", "encrypt failure");
    t = 1;
}

// Call SV function to print decryption inputs
bytes2str(c, tmp_str, np);
bytes2str(c + np, tmp_tag_str, nt);
decryption_inputs_1(sk_str, si_str, tmp_str, tmp_tag_str, sa_str);

// Perform decryption
memset(tmp, 0xcc , sizeof tmp);
t |= AES_GCM_decrypt(key, iv, c, np, a, na, nt, tmp) ? 2 : 0;

if (t == 0) {
    // Call SV function to print decryption output
    bytes2str(tmp, tmp_str, np);
    decryption_outputs_1(tmp_str);
} else {
    sprintf(msg, "%sdecrypt failure", t & 1 ? "encrypt & " : "");
}

bytes2str(key, sk, AES_KEY_SIZE);
bytes2str(iv, si, GCM_NONCE_LEN);
bytes2str(p, sp, np);
bytes2str(a, sa, na);
bytes2str(c, sc, np + nt);
sprintf(r, "%s\nK: %s\ni: %s\nP: %s\nA: %s\nC: %s", msg, sk, si, sp, sa, sc);

// Call SV function to print the final result
final_result_1(r);

return t;

}

int run_test(){
const char *linehdr = { "Key = ", "IV = ", "AAD = ", "PT = ", "CT = ", "Tag = " };
char buffer[0x800], *value = “”, *line = “”;
size_t pass = 0, df = 0, ef = 0, sk = 0, sn = 0, sp = 0, sa = 0, st = 0;
uint8_t key[AES_KEY_SIZE], tmp[AES_KEY_SIZE], iv[GCM_NONCE_LEN];
uint8_t i, p[96], c[112], a[96], t[16], rc = 1;
FILE *fp, *fs, *ferr;

fp = fopen(TESTFILEPATH, "r");
fs = fopen("passed.log", "w");
ferr = fopen("failed.log", "w");

if (fp == NULL) {
    printf("File not found: %s\n", TESTFILEPATH);
    return 1;
}
if (!fs || !ferr) return 1;

do {
    if ((line = fgets(buffer, sizeof buffer, fp)) != NULL) {
        buffer[strcspn(buffer, "\n")] = 0;
        if (strlen(buffer) < 4) continue;
    }
    for (i = 0; i < 6; i++) {
        if (strncmp(buffer, linehdr[i], strlen(linehdr[i])) == 0) {
            value = strrchr(buffer, ' ') + 1;
            break;
        }
    }
    switch (i) {
    case 0:
        sk = strlen(value) / 2;
        if (sk == AES_KEY_SIZE) str2bytes(value, tmp);
        break;
    case 1:
        sn = strlen(value) / 2;
        if (sn == GCM_NONCE_LEN) str2bytes(value, iv);
        break;
    case 2:
        sa = strlen(value) / 2;
        str2bytes(value, a);
        break;
    case 3:
        sp = strlen(value) / 2;
        str2bytes(value, p);
        break;
    case 4:
        str2bytes(value, c);
        break;
    case 5:
        st = strlen(value) / 2;
        str2bytes(value, t);
        break;
    }
    if (i == 0 || line == NULL) {
        if (!rc && sn == GCM_NONCE_LEN && sk == AES_KEY_SIZE) {
            memcpy(c + sp, t, st);   /* put tag at the end */
            
            rc = ciphertest(key, iv, p, a, c, sp, sa, st, buffer);

            fprintf(rc ? ferr : fs, "%s\n", buffer); /* save the log */
            if (rc == 0) ++pass;
            else {
                if (rc & 1) ++ef;
                if (rc & 2) ++df;
            }
	printf("\n");
        }
        memcpy(key, tmp, sizeof key);
        rc = 0;
    }
} while (line != NULL);
printf("test cases: %d\nsuccessful: %d\nfailed encrypt: %d, failed decrypt: %d\n",
      pass + (ef > df ? ef : df), pass, ef, df);

fclose(fp); fclose(fs); fclose(ferr);
if (ef + df == 0) {
    remove("passed.log"); remove("failed.log");
}
return 0;

}
please relpay ehre i get a error how to import the context function in c