更高效的网络报文封装verilog前仿真

一、构造输入报文

1.创建网络报文内容的txt文件,16字节为一行

2.编写tb文件,读入txt,并以mac的接口输出

task read_gtp_pkt_data_file;
integer i;
    begin
        $readmemh("/GTP_PKT.txt",R_data);
        for (i = 0; i<PKT_NUM*32; i=i+1)  // 32行
        begin
            $display("R_pkt_data[%d] = %h",i,R_data[i]);
        end
    end
endtask

task config_deparser_gateway;
reg    [MAX_PKT_LEN*8-1:0] pkt_data;
integer i;

begin
    for(i=0; i<DEPARSER_GATEWAY_CFG_MSG_NUM; i=i+1) begin
        pkt_data = {R_data[i*8],
                    R_data[i*8+1],
                    R_data[i*8+2],
                    R_data[i*8+3],
                    R_data[i*8+4],
                    R_data[i*8+5],
                    {(MAX_PKT_LEN-64){8'h0}}};
        gen_pcie_pkt(pkt_data,64,0);
        insert_cycles(50);
    end
end
endtask

task gen_pcie_pkt;

      input [MAX_PKT_LEN*8-1:0] pcie_pkt;

      input [15:0]              len;

      input                     msg_pkt_flag;//0:MSG 1:ETH PKT

      reg   [MAX_PKT_LEN*8-1:0] pkt_data;

      reg                       rem;

      reg   [9:0]               beats;

      integer                   i;

   begin

      rem = (len[5:0] == 6'h0) ? 1'b0 : 1'b1;

      beats = len[13:6] + rem;

      pkt_data = pcie_pkt;

//      wait(W_pktdown_pciedma_rdy);

      wait(W_mac_link_state == 2'b11);

      for (i = 0; i < beats; i = i + 1) begin

         @(posedge R_sys_clk);

         //#1;

         pciedma_pktdown_ena <= 1'b1;

         if (i == 0) begin

            pciedma_pktdown_sop <= 1'b1;

            pciedma_pktdown_qid <= msg_pkt_flag ? 7'h1b : 7'h1c ;

            pciedma_pktdown_err <= 1'b0;

         end

         else begin

            pciedma_pktdown_sop <= 1'b0;

         end

         if (i == (beats - 1)) begin

            pciedma_pktdown_eop <= 1'b1;

            pciedma_pktdown_mty <= 64 - len[5:0];

         end

         else begin

            pciedma_pktdown_eop <= 1'b0;

            pciedma_pktdown_mty <= 6'h0;

         end

         pciedma_pktdown_data <= pkt_data[(MAX_PKT_LEN*8-1)-:512];

         pkt_data <= pkt_data << 512;

      end

      @(posedge R_sys_clk);

      //#1;

      pciedma_pktdown_ena <= 1'b0;

      pciedma_pktdown_sop <= 1'b0;

      pciedma_pktdown_eop <= 1'b0;

   end

endtask

二、输出报文写入到log

1..在tb和global define定义文件

parameter GTP_PKT_FILE = "";
integer log_gtp_pkt_info;
initial begin
    log_gtp_pkt_info = $fopen(GTP_PKT_FILE );
end

三、wireshark联合进行报文解析

将上述log转换为txt文件,导入到wireshark可以快速分析报文的各个字段封装是否正确。

  • 使用wireshark解析16进制报文

 使用wireshark解析16进制报文_16进制报文解析_在线98的博客-CSDN博客

将报文整理为一行,必须是16进制数,软件里打印的时候就以16进制的形式输出,每个数据以空格分开,并在该数据的最前边加上8个0.

00000000 ff ff ff ff ff ff b0 83 fe a7 29 17 08 06 00 01 08 00 06 04 00 01 b0 83 fe a7 29 17 00 00 00 00 00 00 00 00 00 00 c0 a8 13 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值