做verilog网络逻辑时,需要产生正确的数据包格式激励,手写激励真烦人,现在让testbench读取pcap文件,则可以精确还原数据包的bit与时序,省去了一大批麻烦

1.设计读取逻辑

 `timescale 1ns / 1ps
`define NULL // Coder: joe
// Description:
// 将pcap文件中的数据包读出来,8bit位宽
//
//
//
//
// module PcapParser
#(
parameter pcap_filename = "none",
parameter ipg =
) (
input CLOCK,
input pause,
output reg available = ,
output reg datavalid = ,
output reg [:] data = ,
output reg [:] pktcount = ,
output reg newpkt = ,
output reg pcapfinished =
); // buffers for message
reg [:] global_header [:];
reg [:] packet_header [:]; integer swapped = ;
integer toNanos = ;
integer file = ;
integer r = ;
integer eof = ;
integer i = ;
integer pktSz = ;
integer diskSz = ;
integer countIPG = ; initial begin // open pcap file
if (pcap_filename == "none") begin
$display("pcap filename parameter not set");
$finish_and_return();
end file = $fopen(pcap_filename, "rb");
if (file == `NULL) begin
$display("can't read pcap input");
$finish_and_return();
end // read binary global_header
// r = $fread(file, global_header);
r = $fread(global_header,file); // check magic signature to determine byte ordering
if (global_header[] == 'hD4 && global_header[1] == 8'hC3 && global_header[] == 'hB2) begin
$display(" pcap endian: swapped, ms");
swapped = ;
toNanos = 'd1000000;
end else if (global_header[] == 'hA1 && global_header[1] == 8'hB2 && global_header[] == 'hC3) begin
$display(" pcap endian: native, ms");
swapped = ;
toNanos = 'd1000000;
end else if (global_header[] == 'h4D && global_header[1] == 8'h3C && global_header[] == 'hb2) begin
$display(" pcap endian: swapped, nanos");
swapped = ;
toNanos = 'd1;
end else if (global_header[] == 'hA1 && global_header[1] == 8'hB2 && global_header[] == 'h3c) begin
$display(" pcap endian: native, nanos");
swapped = ;
toNanos = 'd1;
end else begin
$display(" pcap endian: unrecognised format %02x%02x%02x%02x", global_header[], global_header[], global_header[], global_header[] );
$finish_and_return();
end
end always @(posedge CLOCK)
begin
if (eof == && diskSz == && countIPG == ) begin
// read packet header
// fields of interest are U32 so bear in mind the byte ordering when assembling
// multibyte fields
r = $fread(packet_header, file);
eof = $feof(file); if ( eof == ) begin
if (swapped == ) begin
pktSz = {packet_header[],packet_header[],packet_header[] ,packet_header[] };
diskSz = {packet_header[],packet_header[],packet_header[],packet_header[]};
end else begin
pktSz = {packet_header[ ],packet_header[ ],packet_header[],packet_header[]};
diskSz = {packet_header[],packet_header[],packet_header[],packet_header[]};
end $display(" packet %0d: incl_length %0d orig_length %0d eof %0d", pktcount, pktSz, diskSz, eof ); available <= ;
newpkt <= ;
pktcount <= pktcount + ;
countIPG <= ipg; // reload interpacket gap counter
end
end else if ( diskSz > ) begin // packet content is byte-aligned, no swapping required
if (~pause) begin
newpkt <= ;
diskSz <= diskSz - ;
data <= $fgetc(file);
eof = $feof(file);
if ( eof != || diskSz == ) begin
available <= ;
end else begin
datavalid <= ;
end
end else begin
datavalid <= ;
end
end else if (countIPG > ) begin
countIPG <= countIPG - ;
end else if (eof != ) begin
pcapfinished <= ; // terminal loop here
end end endmodule

2.编写testbench文件

将 tcp-4846-connect-disconnect.pcap 文件放在工程目录下。自己随意放置一个,然后修改源码中文件的名称,才可以读到。

 `timescale 1ns / 1ps
`define NULL // Coder: joe
// Description:
// 测试文件,读取数据,打入模块
//
//
//
//
// module PcapParser_test
#(
parameter DATA_WIDTH = ,
parameter CTRL_WIDTH=,
parameter STAGE_NUMBER = ,
parameter NUM_QUEUES =
); // Inputs
reg CLOCK = ;
reg paused = ;
reg rst=;
wire available;
wire [:] pktcount;
wire streamvalid;
wire [:] stream;
wire pcapfinished;
wire newpkt; wire out_wr;
wire [CTRL_WIDTH-:] out_ctl;
wire [DATA_WIDTH-:] out_data; wire out_wr1;
wire [CTRL_WIDTH-:] out_ctl1;
wire [DATA_WIDTH-:] out_data1; // Instantiate the Unit Under Test (UUT)
PcapParser #(
.pcap_filename( "tcp-4846-connect-disconnect.pcap" )
) pcap (
.CLOCK(CLOCK),
.pause(paused),
.available(available),
.datavalid(streamvalid),
.data(stream),
.pktcount(pktcount),
.newpkt(newpkt),
.pcapfinished(pcapfinished)
); always # CLOCK = ~CLOCK; //always #100 paused = ~paused; integer i; initial begin $dumpfile("pcap.lxt");
//$dumpvars(0); // Initialize Inputs
$display("Reading from pcap"); // Wait 100 ns for global reset to finish
#;
rst = ; // Add stimulus here
while (~pcapfinished ) begin
//$display("stream: %8d %x %d %x %x %c", i, paused, pktcount, streamvalid, stream, stream);
#
i = i+;
end $finish; end endmodule

3.读取仿真激励结果

=====================

qsy

2018-7-5 11:39:44

verilog 计算机网络 仿真 激励 pcap的更多相关文章

  1. 学会使用Hdlbits网页版Verilog代码仿真验证平台

    给大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过“https://hdlbits.01xz.net/wiki/Main_Page” 地址链接进 ...

  2. 【仿真】【modelsim】:verilog功能仿真流程

    一.编写verilog源文件,在diamond中编译.编写testbench文件.在diamond设置中将仿真工具设置为modelsim,运行仿真向导 二.自动进入modelsim, 编译全部 运行仿 ...

  3. 全平台轻量级 Verilog 编译器 & 仿真环境

    一直苦于 modelsim 没有Mac版本,且其体量过大,在学习verilog 时不方便使用. 终于找到一组轻量级且全平台 ( Linux+Windows+macOS ) 的编译仿真工具组. Icar ...

  4. VCS使用学习笔记(1)——Verilog相关的仿真知识

    本文主要学习Verilog的仿真特性,以及仿真器对Verilog的处理,算是对Verilog知识的增量学习.本文内容与我的另一篇博文(http://www.cnblogs.com/IClearner/ ...

  5. 【设计经验】5、Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2  Matlab2016a 仿真工具:Vivado自带仿真器 二.引言 在利用 ...

  6. Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    转自https://www.cnblogs.com/liujinggang/p/10549095.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件 ...

  7. DC综合及仿真验证和DFT测试

           综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是R ...

  8. vivado2018.3 与 modelsim联合仿真

    我用的是目前最新版本的软件,vivado2018.3与modelsim10.6d.废话不多说,直接上操作 1.modelsim编译vivado库 1)双击启动vivado软件,如下图操作 2)Simu ...

  9. 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真

    浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...

随机推荐

  1. RoR unobtrusive scripting adapter--UJS(一些Javascript的语法糖)

    Learn how the new Rails UJS library works and compares with the old version of jquery_ujs that it re ...

  2. php-----utf8和gbk相互转换

    utf8转换为gbk <?php header("Content-type:text/html;charset=UTF-8"); echo $str= '你好,这里是utf8 ...

  3. LRIP UVALive - 7148 (点分治)

    大意: 给定树, 每个点有点权, 求最长非减树链, 满足树链上最大值与最小值之差不超过D 点分治, 线段树维护最小值为$x$时的最长非增和非减树链即可. 实现时有技巧是翻转一下儿子区间, 这样可以只维 ...

  4. Android下移植tcpflow

    tcpflow是linux平台下的开源抓包工具,它能监听网络url,获取http请求的各种数据.tcpflow可以说是tcpdump的简约版.要想将tcpflow移植到Android平台中,就需要通过 ...

  5. codeforce——因数筛

    题目大意:给你一个 n 和 k 求 n 的第 k 个因数. #include<iostream> #include <algorithm> #include <queue ...

  6. OC 数据持久化(数据本地化)- 本地存储

    // // ViewController.m // IOS_0113_本地存储 // // Created by ma c on 16/1/13. // Copyright (c) 2016年 博文科 ...

  7. python学习笔记(五)---sublime text 多行代码注释快捷键

    转载网址:https://blog.csdn.net/mycms5/article/details/70194045/ 多行选择后按下ctrl+/ 选择类 Ctrl+D 选中光标所占的文本,继续操作则 ...

  8. Loops with PL/SQL

    1. Basic loop loop /* statements */ end loop; 2. While loop while a > b loop /* statements */ end ...

  9. Docker ENTRYPOINT

    entrypoint: 在启动镜像的时候会执行这个命令下的脚本,在docker run 和docker start情况下都会触发. 好比这个脚本是对某一个文件追加数据,每次start的时候都会追加,文 ...

  10. Python3 循环语句(十)

    Python中的循环语句有 for 和 while. Python循环语句的控制结构图如下所示: while 循环 Python中while语句的一般形式: while 判断条件: 语句 同样需要注意 ...