sv激励生成方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值