5.FileIo
Note: Samples below assumes Veritak Project Extension "Enable [%u]
unit=byte" is enabled.
Here is a example using FileIo in Verilog-2001 and multi-dimmentional array.
This program converts RGB to Black &White with shades ,or without shades(binary).
No conversion ( after_abc1.bmp)

Converted to Black&White with shades (after_abc2.bmp)

Converted to Binary. (after_abc3.bmp)

//Refered C source is found per following URL
//http://www.fit.ac.jp/elec/7_online/lu/sample/bmp_image_proc.cpp
`define Y_SIZE 2048 //maximum size of y dots
`define X_SIZE 2048 //maximum size of x dots
`define HIGH 255 //maxinum Strength
`define LOW 0 //minimum Strengh
`define LEVEL 256 //
module bmp_test;
parameter read_filename="3port.bmp";//input file name
parameter write_filename1="after_abc1.bmp";//output file just after read
parameter write_filename2="after_abc2.bmp";//ouput file, Black and White with strength
parameter write_filename3="after_abc3.bmp";//output file Black and White with binary
parameter [7:0] INTENSITY=100;//0-255
integer biCompression,
biSizeImage,
biXPelsPerMeter,
biYPelsPerMeter,
biClrUsed,
biClrImportant;
reg [15:0] bfType;
integer bfSize;
reg [15:0] bfReserved1, bfReserved2;
integer bfOffBits;
integer biSize, biWidth, biHeight;
reg [15:0] biPlanes, biBitCount;
reg [7:0] image_in [0:`Y_SIZE][0:`X_SIZE][0:2]; //input color matrix
reg [7:0] image_out [0:`Y_SIZE][0:`X_SIZE][0:2]; //output color matrix
reg [7:0] image_bw [0:`Y_SIZE][0:`X_SIZE]; //shades matrix
//********************************************
// Read 24Bit bitmap file *
//********************************************
task readBMP(input [128*8:1] read_filename);
integer fp;
integer i, j, k;
reg [7:0] byte;
begin
// Open File
fp = $fopen(read_filename, "rb") ;//must be binary read mode
if (!fp) begin
$display("readBmp: Open error!\n");
$finish;
end
$display("input file : %s\n", read_filename);
// Read Header Informations
$fread(bfType, fp);
$fread(bfSize, fp);
$fread(bfReserved1, fp);
$fread(bfReserved2, fp);
$fread(bfOffBits, fp);
$fread(biSize, fp);
$fread(biWidth, fp);
if (biWidth%4) begin
$display("Sorry, biWidth%4 must be zero in this program. Found =%d",biWidth);
$finish;
end
$fread(biHeight, fp);
$fread(biPlanes, fp);
$fread(biBitCount, fp);
if (biBitCount !=24) begin
$display("Sorry, biBitCount must be 24 in this program. Found=%d",biBitCount);
$finish;
end
$fread(biCompression, fp);
$fread(biSizeImage, fp);
$fread(biXPelsPerMeter, fp);
$fread(biYPelsPerMeter, fp);
$fread(biClrUsed, fp);
$fread(biClrImportant, fp);
// Read RGB Data
for (i=0; i< biHeight; i=i+1) begin
for (j=0; j< biWidth; j=j+1) begin
for (k=0; k<3; k=k+1) begin
$fread(byte,fp);
image_in[biHeight-i][j][2-k]=byte;
end
end
end
$display("Current POS=%d",$ftell(fp));
$fclose(fp);
end
endtask
//******************************************************
// Output 24bits to bitmap file *
//******************************************************
task writeBMP(input [128*8:1] write_filename,input O);
integer fp;
integer i, j, k;
begin
// Open File
fp = $fopen(write_filename, "wb");//must be binary read mode
if (!fp) begin
$display("writeBmp: Open error!\n");
$finish;
end
$display("output file : %s\n", write_filename);
// Write Header Informations
$fwrite(fp,"%u",bfType);
$fwrite(fp,"%u",bfSize);
$fwrite(fp,"%u",bfReserved1);
$fwrite(fp,"%u",bfReserved2);
$fwrite(fp,"%u",bfOffBits);
$fwrite(fp,"%u",biSize);
$fwrite(fp,"%u",biWidth);
$fwrite(fp,"%u",biHeight);
$fwrite(fp,"%u",biPlanes);
$fwrite(fp,"%u",biBitCount);
$fwrite(fp,"%u",biCompression);
$fwrite(fp,"%u",biSizeImage);
$fwrite(fp,"%u",biXPelsPerMeter);
$fwrite(fp,"%u",biYPelsPerMeter);
$fwrite(fp,"%u",biClrUsed);
$fwrite(fp,"%u",biClrImportant);
// Write Bitmap Data
for (i=0; i< biHeight; i=i+1) begin
for (j=0; j< biWidth; j=j+1) begin
for (k=0; k<3; k=k+1) begin
if (O) $fwrite(fp,"%u",image_out[biHeight-i][j][2-k]);
else $fwrite(fp,"%u",image_in[biHeight-i][j][2-k]);
end
end
end
$display("Current WPOS=%d",$ftell(fp));
$fclose(fp);
end
endtask
//**********************************************
// Convert RGB to 256 levels of Black & White *
//**********************************************
task BMPto256BW;
integer y, x, a;
begin
for (y=0; y<biHeight; y=y+1) begin
for (x=0; x<biWidth; x=x+1) begin
a =$rtoi(0.3*image_in[y][x][0] + 0.59*image_in[y][x][1] + 0.11*image_in[y][x][2]);
if (a<`LOW) a = `LOW;
if (a>`HIGH) a = `HIGH;
image_bw[y][x] = a;
end
end
end
endtask
//****************************************
// Convert Black&While to 24bit bitmap *
//****************************************
task BWto24BMP;
integer y, x, a;
begin
for (y=0; y<biHeight; y=y+1) begin
for (x=0; x<biWidth; x=x+1) begin
a = image_bw[y][x];
image_out[y][x][0] = a;
image_out[y][x][1] = a;
image_out[y][x][2] = a;
end
end
end
endtask
//****************************************
// Make binary *
//****************************************
task toBinary( input [7:0] intensity);
integer y, x;
begin
for (y=0; y<biHeight; y=y+1)begin
for (x=0; x<biWidth; x=x+1) begin
if(image_bw[y][x] >= intensity) image_bw[y][x]=`HIGH;
else image_bw[y][x] = `LOW;
end
end
end
endtask
initial begin
//Operation1
readBMP(read_filename); // Read ,
writeBMP(write_filename1,0);//and just write without any conversion
//Operation2
BMPto256BW; //Convert RGB to Black&White
BWto24BMP; //
writeBMP(write_filename2,1);//Output
//Operation3
toBinary(INTENSITY);
BWto24BMP;
writeBMP(write_filename3,1);//Output
end
endmodule
Another examples is text file operation.
Use $fscanf,$fdisplay,$fseek,$ftell to operate text file.
In this example;
//Sep.21.2005
//$fseek/$fscanf/$fdisplay Test
module large_file;
parameter integer WORDS=1024*1024*8;//1024*1024*34 BYTES;
parameter integer STR_LEN=32+2;//CR+LF
integer i;
integer fp;
integer offset;
reg [255:0] R2;
initial begin
//Open
fp=$fopen("large_file.txt","w+");//Open By Write & Read Mode
if (!fp) begin
$display("File Can not be opend.!");
$finish;
end
//Write
$display("Writing Large File..");
for (i=0; i<WORDS;i=i+1) begin
R2={i+7,i+6,i+5,i+4,i+3,i+2,i+1,i};
if (i%10000==1) $display("%d",i);
$fdisplay(fp,"%32x",R2[127:0]);
end
$display("Large Text File genrated Words=%d Total %fMBytes",WORDS,(WORDS*STR_LEN)/1e6);
//Trival Check
trival_check(fp);
//Random Check
random_check(fp);
end
task disp_current_position(input integer fp);
integer position;
begin
position=$ftell(fp);
$display("Current Posion=%d",position);
end
endtask
task trival_check(input integer fp);
parameter OFFSET=10;
begin
$display("Trival Check Starts...");
offset=$ftell(fp);
disp_current_position(fp);
offset=offset-OFFSET*STR_LEN;
$fseek(fp, offset,0);
disp_current_position(fp);
for (i=0;i<OFFSET;i=i+1) begin
$fscanf(fp,"%h\n",R2);
$display("%h",R2);
end
$display("Trival Check Done.\n");
end
endtask
task random_check(input integer fp);
integer EOF;
parameter integer No_of_Checks=1000_000;
integer i,position,aligned_pos,word_pos;
reg [127:0] word;
begin
$display("Random Check.Starts.. It takes several minutes.");
$fseek(fp,0,2);//Go to EOF
EOF=$ftell(fp);//EOF position
disp_current_position(fp);
for (i=0;i< No_of_Checks;i=i+1) begin
position={$random} % EOF;//or $unsigned($random) % EOF
word_pos=(position/STR_LEN);
aligned_pos=word_pos*STR_LEN;
$fseek(fp,aligned_pos,0);//Goto aligned_pos
$fscanf(fp,"%h\n",R2);
word={word_pos+3,word_pos+2,word_pos+1,word_pos};
if (word !==R2[127:0] ) begin//Check result
$display("Fails. Error detected");
$stop;//assert(0);
end
end
$display("Random Test passed. Random %d seeks performed . Error Detected 0",No_of_Checks);
end
endtask
endmodule