1、基本步骤
1.1 方法1:
1.创建一个.sv文件
2.定义一个类,包含变量(范围和权重的约束)、变量转换为所需激励数据的方法、生成供参考模型使用的激励的copy
3.时序化,转换为带时钟的数据
1.2 方法2:
1.创建一个data文件
2.读取文件行,预处理后转换为包数据格式
3.时序化,转换为带时钟的数据
2、具体方法
2.1、读取文件激励,file_to_stream_pkg.sv
//
package file_to_stream_pkg;
import config_pkg::*;
typedef struct {
bit err ;
bit sop ;
bit eop ;
bit vld ;
bit [ 2:0] vldb ;
bit [63:0] data ;
bit bypass ;
bit connecting;
} data_stream_s;
typedef struct {
logic [31:0] len ;
bit [63:0] data[$] ;
logic [31:0] data_size;
} pkt_data_s;
task automatic file_data(input string filename,output pkt_data_s pkt_data_q[$]);
int file ;
int file_s ;
string file_line;
string line;
logic[31:0] char_len;
bit [ 3:0] hex_data;
bit [63:0] dd_word_data[$];
bit [ 3:0] char2hex_data[$];
logic[31:0] dd_word_data_size;
pkt_data_s pkt_data ;
//
$display("self_debug[INFO] : file of %0s is processiong!",filename);
file = $fopen(filename,"r");
if(file == 0)begin
return;
end
//
while(!$feof(file))begin
file_s = $fgets(file_line,file);
replace_space(file_line,line);//remove special character at head and tail
//jump space line or flag line
char_len = line.len();
if(is_all_spaces(line)== 1 || line.len() == 0 || line[0] == "#")begin
continue;
end
else begin
//$display("self_debug[INFO] : char_len=%0d ",char_len);
char2hex_data={};
for (int i = 0;i < char_len;i++)begin
//$display("self_debug[INFO] : line[%0d]=%0h ",i,line[i]);
string2hex(line[i],hex_data);
char2hex_data.push_back(hex_data);
end
dd_word_data = {>>{char2hex_data}};
dd_word_data_size = dd_word_data.size();
$display("self_debug[INFO] : char_len=%0d,dd_word_data_size=%0d ",char_len,dd_word_data_size);
foreach (dd_word_data[i])begin
$display("self_debug[INFO] : dd_word_data[%0d]=%h ",i,dd_word_data[i]);
end
//
pkt_data.data = dd_word_data ;
pkt_data.data_size = dd_word_data_size ;
pkt_data.len = char_len/2 ;
pkt_data_q.push_back(pkt_data);
end
end
//for (int i=0;i<char2hex_data.size();i++)begin
// $display("self_debug[INFO] : char2hex_data[%0d]=%h,size=%0d ",i,char2hex_data[i],char2hex_data.size());
//end
$fclose(file);//close file and delete resource
endtask
//string(ascii) to hex
function automatic void string2hex(input byte str,output bit[3:0] hex_array);
case (str)
"0": hex_array = 4'h0;
"1": hex_array = 4'h1;
"2": hex_array = 4'h2;
"3": hex_array = 4'h3;
"4": hex_array = 4'h4;
"5": hex_array = 4'h5;
"6": hex_array = 4'h6;
"7": hex_array = 4'h7;
"8": hex_array = 4'h8;
"9": hex_array = 4'h9;
"A", "a": hex_array = 4'hA;
"B", "b": hex_array = 4'hB;
"C", "c": hex_array = 4'hC;
"D", "d": hex_array = 4'hD;
"E", "e": hex_array = 4'hE;
"F", "f": hex_array = 4'hF;
default: begin
hex_array = 4'h0; //invalid character
$display("WARNING: Invalid hex char '%c'", str);
end
endcase
//$display("WARNING: Invalid hex str='%0h',hex_array=%0h", str,hex_array);
endfunction
function automatic void data_pack(input pkt_data_s pkt_data_q[$],output data_stream_s data_stream_s_q[$]);
data_stream_s data_stream ;
pkt_data_s pkt_data ;
repeat (pkt_data_q.size())begin
//for (int k=0;k<pkt_data_q.size();k++)begin
$display("data_pack begin!");
//$displayh("data_pack_q = %p",pkt_data_q[0]);
pkt_data = pkt_data_q[0];
pkt_data_q.pop_front();
//foreach(pkt_data.data[i])begin
// $display("pkt_data.data[%0d]=%h\n", i, pkt_data.data[i]);
//end
foreach (pkt_data.data[i])begin
if( i==0 )begin
data_stream.err = 0 ;
data_stream.sop = 1 ;
data_stream.eop = 0 ;
data_stream.vld = 1 ;
data_stream.vldb = 7 ;
data_stream.data = pkt_data.data[i] ;
if( pkt_data.len<=8 )begin
data_stream.eop = 1 ;
data_stream.vldb = pkt_data.len-1 ;
end
data_stream_s_q.push_back(data_stream);
end else if(i == (pkt_data.data_size-1)) begin
data_stream.err = 0 ;
data_stream.sop = 0 ;
data_stream.eop = 1 ;
data_stream.vld = 1 ;
data_stream.vldb = pkt_data.len%8-1 ;
data_stream.data = pkt_data.data[i] ;
data_stream_s_q.push_back(data_stream);
end else begin
data_stream.err = 0 ;
data_stream.sop = 0 ;
data_stream.eop = 0 ;
data_stream.vld = 1 ;
data_stream.vldb = 7 ;
data_stream.data = pkt_data.data[i] ;
data_stream_s_q.push_back(data_stream);
end
//$display("pkt_data.data[%0d]=%h,sop=%h,eop=%h,vld=%h,vldb=%h\n", i, pkt_data.data[i],data_stream.sop,data_stream.eop,data_stream.vld,data_stream.vldb);
end
end
//
endfunction
//read fileline,then translate to the queue of package
task send_pack(input string filename,output data_stream_s data_stream_q[$]);
pkt_data_s pkt_data[$];
//
$display("send_pack begin!");
file_data(filename,pkt_data);
data_pack(pkt_data,data_stream_q);
endtask
endpackage
2.2.1、时序化
data_stream_s stream_data;//stream_data
data_stream_s stream_data_q[$];
initial begin
#1us
send_pack("cfg/data.txt",stream_data_q);
//file_data("cfg/data.txt",pkt_data);
//data_pack(pkt_data,stream_data_q);
forever begin
@(posedge clk)begin
wait (stream_data_q.size()>0);
if(stream_data_q.size()>0)begin
//$display("pkt_data.data[%0d]=%h,sop=%h,eop=%h,vld=%h,vldb=%h\n", i, pkt_data.data[i],data_stream.sop,data_stream.eop,data_stream.vld,data_stream.vldb);
stream_data.err = stream_data_q[0].err ;
stream_data.sop = stream_data_q[0].sop ;
stream_data.eop = stream_data_q[0].eop ;
stream_data.vld = stream_data_q[0].vld ;
stream_data.vldb = stream_data_q[0].vldb ;
stream_data.data = stream_data_q[0].data ;
$display("stream_data.data=%h,sop=%h,eop=%h,vld=%h,vldb=%h\n", stream_data.data,stream_data.sop,stream_data.eop,stream_data.vld,stream_data.vldb);
stream_data_q.pop_front();
end
end
end
end
2.2、随机生成
class message;
rand bit[31:0] len;
rand bit[63:0] data;
randc bit[4:0] ;
constrains len dist{[2:500]:=6,[501:500]:=4};
endclass