做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. JSP 指令

    JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute="value" %&g ...

  2. HTML DOM知识点补充:

    DOM Console 控制台对象提供了浏览器的debug的方法支持. 常用的:console.log(). ⚠️coffeescript中,这个方法不加括号. DOM Document 当一个HTM ...

  3. selenium 3.6.0 geckodriver的一次坑

    Traceback (most recent call last):  File "./se3.py", line 16, in <module>    dr=webd ...

  4. 不管服不服 Windows仍是全球第一大桌面系统

    不管服不服 Windows仍是全球第一大桌面系统 近日,根据来自市场调研机构 Net Applications 公布的统计数据显示,Windows 依然是世界上排名第一的操作系统,而且未来将很难被打破 ...

  5. bzoj-1009-dp+kmp处理转移矩阵幂

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4723  Solved: 2940[Submit][Statu ...

  6. 前端ps切图,图文教程,详细。

    https://blog.csdn.net/OBKoro1/article/details/69817571 1.下载 我现在使用的版本号:PS-CS6,网上很多破解版本的自行搜索下载. 2.安装好P ...

  7. ces

    1. 测试目录 1.1. 测试目录 2. 测试目录2 2.1 测试目录

  8. Alpha阶段第1周/共2周 Scrum立会报告+燃尽图 03

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2248 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 ...

  9. Sqlserver 按照时间段统计数据

    WITH t1 ( [hour], title ) , ' 0:00:00--- 1:00:00' UNION ALL , ' 1:00:00--- 2:00:00' UNION ALL , ' 2: ...

  10. Linux运维学习笔记-文件系统知识体系总结

    文件系统知识总结 新买的硬盘要存放数据需要怎么做? 首先将硬盘装机做RAID,做完RAID后进行分区,分完区后格式化创建文件系统,最后存放数据. 硬盘的内外部结构: 物理形状: 接口类型: IDE(I ...