URL
https://opencores.org/ocsvn/csa/csa/trunk
Subversion Repositories csa
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 35 to Rev 36
- ↔ Reverse comparison
Rev 35 → Rev 36
/csa/trunk/bench/csa_pli.c
18,29 → 18,116
|
#include <string.h> |
#include <stdio.h> |
#include <errno.h> |
#include <vpi_user.h> |
|
|
char data[120*8*8]; |
|
|
static int read_data_compile(char* used_data) |
{ |
vpiHandle systf_h; |
vpiHandle trarg_itr; // argument iterator |
vpiHandle trarg_h; // argument handle; |
PLI_INT32 trarg_type; // argument type |
PLI_INT32 reg_size; // argument type |
|
systf_h=vpi_handle(vpiSysTfCall,NULL); |
if(!systf_h) |
{ |
vpi_printf("ERROR: could not obtain the handle to systf call\n"); |
tf_dofinish(); |
return 0; |
} |
|
trarg_itr=vpi_iterate(vpiArgument, systf_h); |
if(!trarg_itr) |
{ |
vpi_printf("ERROR: could not obtain the iterate to argument\n"); |
tf_dofinish(); |
return 0; |
} |
|
// get the first argument |
trarg_h=vpi_scan(trarg_itr); |
if(vpi_get(vpiType,trarg_h)!=vpiConstant) |
{ |
if(vpi_get(vpiConstType,trarg_h)!=vpiStringConst) |
{ |
vpi_printf("the first argument type is incorrect (not a string constant)\n"); |
tf_dofinish(); |
return 0; |
} |
} |
|
// get the next argumnent |
trarg_h=vpi_scan(trarg_itr); |
trarg_type=vpi_get(vpiType,trarg_h); |
if(trarg_type==vpiConstant) |
// offset ? |
{ |
if(vpi_get(vpiConstType,trarg_h)!=vpiBinaryConst) |
{ |
vpi_printf("the offset must be dec constant [%d] \n",vpi_get(vpiConstType,trarg_h)); |
tf_dofinish(); |
return 0; |
} |
trarg_h=vpi_scan(trarg_itr); |
trarg_type=vpi_get(vpiType,trarg_h); |
} |
|
if(trarg_type!=vpiReg) |
{ |
vpi_printf("error:the current argument's type must be reg [%d]",trarg_type); |
tf_dofinish(); |
return 0; |
} |
|
reg_size=vpi_get(vpiSize,trarg_h); |
|
trarg_h=vpi_scan(trarg_itr); |
if(trarg_h) |
// size argument |
{ |
s_vpi_value value_s; |
trarg_type=vpi_get(vpiType,trarg_h); |
if(trarg_type!=vpiConstant || vpi_get(vpiConstType,trarg_h)!=vpiBinaryConst) |
{ |
vpi_printf("error:size type must be a binary constant"); |
tf_dofinish(); |
return 0; |
} |
value_s.format=vpiIntVal; |
vpi_get_value(trarg_h,&value_s); |
if(value_s.value.integer*8>reg_size) |
{ |
vpi_printf("warning:size is beyond the length of the register"); |
} |
} |
|
return 0; |
} |
|
static int read_data(char *fn) |
{ |
vpiHandle systf_handle; |
vpiHandle arg_itr; |
vpiHandle arg_handle; |
vpiHandle arg_handle_reg; |
PLI_INT32 arg_type; |
PLI_INT32 arg_size; |
PLI_INT32 read_size; |
s_vpi_value value_s; |
|
FILE *fp; |
FILE *fp1; |
char str[120]; |
int i; |
int n; |
|
systf_handle = vpi_handle(vpiSysTfCall, NULL); |
arg_itr = vpi_iterate(vpiArgument, systf_handle); |
if (arg_itr == NULL) |
{ |
vpi_printf("ERROR: $pow failed to obtain systf arg handles\n"); |
vpi_printf("ERROR: failed to obtain systf arg handles\n"); |
tf_dofinish(); |
return(0); |
} |
|
48,40 → 135,93
arg_handle = vpi_scan(arg_itr); |
value_s.format = vpiStringVal; |
vpi_get_value(arg_handle, &value_s); |
strcpy(str,value_s.value.str); |
fp=fopen(value_s.value.str,"rb"); |
if(!fp) |
{ |
vpi_printf("ERROR: failed to open the file [%s]\n",value_s.value.str); |
tf_dofinish(); |
return 0; |
} |
|
fp=fopen(str,"rb"); |
if(fp) |
arg_handle = vpi_scan(arg_itr); |
arg_type=vpi_get(vpiType,arg_handle); |
arg_handle_reg=arg_handle; |
if(arg_type==vpiConstant) |
{ |
int i; |
int b; |
unsigned int word; |
int vector_size; |
//fscanf(fp,"%s",&data); |
arg_handle = vpi_scan(arg_itr); |
value_s.format = vpiIntVal; |
vpi_get_value(arg_handle, &value_s); |
if(0<fseek(fp,value_s.value.integer,SEEK_SET)) |
{ |
vpi_printf("warning: failed to seek the offset\n"); |
} |
|
vector_size = vpi_get(vpiSize, arg_handle); |
vpi_printf("vector_size=%d \n", vector_size); |
arg_handle_reg = vpi_scan(arg_itr); |
} |
|
|
// calute the size |
read_size=vpi_get(vpiSize,arg_handle_reg); |
arg_handle = vpi_scan(arg_itr); |
if(arg_handle) |
{ |
value_s.format = vpiIntVal; |
vpi_get_value(arg_handle, &value_s); |
if(value_s.value.integer<read_size*8) |
read_size=value_s.value.integer*8; |
} |
|
// read the value to vector |
{ |
unsigned int dword; |
int i; |
int read; |
value_s.format = vpiVectorVal; |
vpi_get_value(arg_handle, &value_s); |
for (i=0;i<vector_size/32;i++) |
vpi_get_value(arg_handle_reg, &value_s); |
i=0; |
if(read_size >= 32) |
{ |
fread(&word,4,1,fp); |
value_s.value.vector[i].bval=0; |
value_s.value.vector[i].aval=word; |
for(i=0;i<read_size;i+=32) |
{ |
read=fread(&dword,4,1,fp); |
if(1!=read) |
{ |
vpi_printf("warning read fail [%d] \n",read); |
break; |
} |
value_s.value.vector[i/32].bval=0x00; |
value_s.value.vector[i/32].aval=dword; |
} |
} |
vpi_put_value(arg_handle, &value_s,NULL, vpiNoDelay); |
fclose(fp); |
if(i<read_size) |
{ |
PLI_INT32 reduant=read_size-i; |
PLI_INT32 reduant_mask; |
int n; |
reduant_mask=0; |
for(n=0;n<reduant;n++) |
{ |
reduant_mask |= (1<<n); |
} |
read=fread(&dword,reduant/8,1,fp); |
if(1!=read) |
{ |
vpi_printf("warning fail \n"); |
} |
value_s.value.vector[i/32].bval&=~reduant_mask; |
value_s.value.vector[i/32].aval&=~reduant_mask; |
value_s.value.vector[i/32].aval|=reduant_mask&dword; |
} |
vpi_put_value(arg_handle_reg, &value_s,NULL, vpiNoDelay); |
} |
else |
{ |
vpi_printf("can't open the input file in %s \n", __FUNCTION__); |
} |
|
fclose(fp); |
return 0; |
} |
|
|
// thia vpi funciton read_data is used to read a binary to a verilog register; |
// usage: read_data ( file name, [ offset ] , register name ,[size ]); |
// note offset and size argument's unit is byte |
|
static void read_data_register() |
{ |
s_vpi_systf_data tf_data; |
88,7 → 228,7
tf_data.type = vpiSysTask; |
tf_data.tfname = "$read_data"; |
tf_data.calltf = read_data; |
tf_data.compiletf = 0; |
tf_data.compiletf = read_data_compile; |
tf_data.sizetf = 0; |
vpi_register_systf(&tf_data); |
} |
135,11 → 275,9
value_s.format = vpiVectorVal; |
arg_handle = vpi_scan(arg_itr); |
vector_size = vpi_get(vpiSize, arg_handle); |
vpi_printf("str:%s vector_size=%d\n",str,vector_size); |
vpi_get_value(arg_handle, &value_s); |
for(i=0;i<vector_size/32;i++) |
{ |
vpi_printf("i=%d\n",i); |
fwrite(&value_s.value.vector[i].aval,4,1,fp); |
} |
fwrite(&value_s.value.vector[i].aval,(vector_size%32)/8,1,fp); |