יצירת קובצי נתונים לכניסות ויציאות של מודול חומרה המתוכנן ב-VHDL או VERILOG לצורך סימולציה.
המתכנן וארכיטקט המערכת נדרש למצוא דרכי בדיקה למודול או למערכת המלאה המתוכננים לרוב
ב-VHDL או ב-VERILOG
במאמר זה מוצגת דרך בדיקה ליצירת קובצי נתונים באמצעות שפה עילית C בדוגמא להלן.
(ניתן ליצור קבצים אילה בכל שפה עילית כולל שפות תכנון חומרה VHDL ו(VERILOG.
חלק מקובצי הנתונים מזינים את כניסות המודול והחלק האחר של קובצי הנתונים מושווים ליציאות המודול.
בדוגמא להלן כל כניסה לפקודת ה while חופפת לעליית שעון במערכת ולפיכך התוכנית מיצרת אות כניסה לפי אלגוריתם שיתואר להלן ובעליית השעון בה יש משמעות ליציאות מיוצרים האותות המתאימים כתוצאה מאותות הכניסה הקודמים.
בדוגמא להלן התוכנה מיצרת אותות כניסה למפענח בקר תקשורת RS232.
היות ואותות נדגמים ע"י שעון המהיר פי 16, אותות הכניסה הנוצרים ע"י התוכנה חוזרים על עצמם 16 פעם. בשרטוט למטה כל ביט כולל Start Data Stop משודר ברציפות 16 פעם.
קובץ הכניסה RS232Test.txt יוצר Data סריאלית .ערך כל Byte משודר עולה מקודמו ב-1 לכן
קובץ היציאה VecDat.txt שהתוכנה יוצרת ושבtest bench יושווה ליציאות המודול נראה כך:
00000000
00000001
00000010
:
11111110
11111111
להלן קובץ יוצר האותות הכתוב ב-C
// RS232.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
#include "power.cpp"
#include <fstream>
using namespace std;
void main()
{//---------------------------------------------------------------------------------------------------void main()
//fstream myfile;
//myfile.open ("RS232Test.txt");
FILE *F_RS232Test,*F_VecDat;
const int MsTransmit = 7;
const int start = 0,Stop = 2,Transmit =1;
const int MsCountSamples = 15;
const int MsNbit =7;
int i;
int TestState= start;
int CountDi =0;
int remin;
char VecDi [8];
//char Di;
int k=0;
//int TempBit;
int CountSamples= 0;
int i_transmit=0;
//int kmodu;
int Nbit= 0;
//char Ckmodu;
int MaxDi = power (2,(MsTransmit+1))-1;
F_RS232Test = fopen("RS232Test.txt","wt");
if (!F_RS232Test) cout<< "Failed To Open RS232Test";
F_VecDat = fopen("VecDat.txt","wt");
if (!F_VecDat) cout<< "Failed To Open VecDat";
while (CountDi <= MaxDi)
{ //-----------------------------------------------------------------while (CountDi <= MaxDi)
switch(TestState)
{ // ---------------------------------------------------------switch(TestState)
case start: if(CountSamples == MsCountSamples) TestState = Transmit;
else {fprintf(F_RS232Test,"%d",0);
fputs("\n",F_RS232Test);
printf("%d\n",0);
}
break;
case Transmit: if(CountSamples==0)
{ if (Nbit==0) remin=CountDi; //--------------if(CountSamples==0)
VecDi[Nbit] = remin%2 +48;
remin = remin/2;
}//-------------------------------------------if(CountSamples==0)
fputc(VecDi[Nbit],F_RS232Test);//-----------------fputc(VecDi[Nbit],F_RS232Test);
fputs("\n",F_RS232Test);
printf("%c\n",VecDi[Nbit]);
if(CountSamples == MsCountSamples)
{ //----------------------if(CountSamples == MsCountSamples)
if (Nbit==MsNbit)
{//fputs(VecDi,F_VecDat);
//fputs("\n",F_VecDat);
for(i=MsNbit;i>=0;i--)fputc(VecDi[i],F_VecDat);
fputs("\n",F_VecDat);
Nbit=0;
CountDi++;
TestState = Stop;
}
else
{Nbit++;
}
} //-----------------------if(CountSamples == MsCountSamples)
break;
case Stop: if(CountSamples == MsCountSamples) TestState = start;
else {fprintf(F_RS232Test,"%d",1);
fputs("\n",F_RS232Test);
printf("%d\n",1);
}
break;
default: TestState = start;
break;
}// ---------------------------------------------------------switch(TestState)
if (CountSamples == MsCountSamples) CountSamples =0;
else CountSamples++;
}//-----------------------------------------------------------------while (CountDi <= MaxDi)
fclose(F_RS232Test);
fclose(F_VecDat);
}//---------------------------------------------------------------------------------------------------void main()