verilog 计算机网络 仿真 激励 pcap
做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的更多相关文章
- 学会使用Hdlbits网页版Verilog代码仿真验证平台
给大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过“https://hdlbits.01xz.net/wiki/Main_Page” 地址链接进 ...
- 【仿真】【modelsim】:verilog功能仿真流程
一.编写verilog源文件,在diamond中编译.编写testbench文件.在diamond设置中将仿真工具设置为modelsim,运行仿真向导 二.自动进入modelsim, 编译全部 运行仿 ...
- 全平台轻量级 Verilog 编译器 & 仿真环境
一直苦于 modelsim 没有Mac版本,且其体量过大,在学习verilog 时不方便使用. 终于找到一组轻量级且全平台 ( Linux+Windows+macOS ) 的编译仿真工具组. Icar ...
- VCS使用学习笔记(1)——Verilog相关的仿真知识
本文主要学习Verilog的仿真特性,以及仿真器对Verilog的处理,算是对Verilog知识的增量学习.本文内容与我的另一篇博文(http://www.cnblogs.com/IClearner/ ...
- 【设计经验】5、Verilog对数据进行四舍五入(round)与饱和(saturation)截位
一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 Matlab2016a 仿真工具:Vivado自带仿真器 二.引言 在利用 ...
- Verilog对数据进行四舍五入(round)与饱和(saturation)截位
转自https://www.cnblogs.com/liujinggang/p/10549095.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件 ...
- DC综合及仿真验证和DFT测试
综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是R ...
- vivado2018.3 与 modelsim联合仿真
我用的是目前最新版本的软件,vivado2018.3与modelsim10.6d.废话不多说,直接上操作 1.modelsim编译vivado库 1)双击启动vivado软件,如下图操作 2)Simu ...
- 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真
浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...
随机推荐
- Rails 5 Test Prescriptions 第10章 Unit_Testing JavaScript(新工具,learn曲线太陡峭,pass)
对Js的单元测试是一个大的题目.作者认为Ruby的相关测试工具比Js的测试工具更灵活 大多数Js代码最终是关于响应用户的行为和改变DOM中的元素 没有什么javascript的知识点.前两节用了几个新 ...
- chrome插件访问原始页面的变量
开发chrome插件时遇到需要获取原始网页中的一个js变量的值问题.由于content.js和原始网页的作用域环境不同,无法直接获取变量的值,提示undefined.谷歌找到大神提供的办法.综合起来记 ...
- UVA-1153 Keep the Customer Satisfied (贪心)
题目大意:有n件工作,做每件工作的消耗时间为s,截止时间为d,问最多能做完几件工作. 题目分析:贪心策略:优先做截止时间靠前的,一旦做不完当前工作,则从已经做过的工作中删去一件耗时最长的,用当前工作取 ...
- socket中 emit和on的写法
socket.emit('action');表示发送了一个action命令,命令是字符串的,在另一端接收时,可以这么写: socket.on('action',function(){...});soc ...
- @pathVariable的作用(二十二)
spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller public class TestController { @Requ ...
- poj 1789 Truck History 最小生成树 prim 难度:0
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19122 Accepted: 7366 De ...
- Jenkins插件开发(一)--环境搭建
最近写了一个jenkins插件,功能比较简单,时间主要是花在对jenkins插件框架和Maven的熟悉上.jenkins插件虽然以前也接触过一点,不过现在都忘得差不多了,这个笔记权当知识点记录,顺带介 ...
- pixi之加载纹理贴图和精灵类的使用
因为之前看过three.js的缘故,所以pixi学习起来也是很快的,主要就是熟悉pixi的API,所以,在这里记录一下pixi常用API,废话不多说,下面上干货. 一.为你的PIXI场景添加图片(精灵 ...
- geek网工作室主页------我的第一个小项目
传送门:袁咩咩的小小博客 很快,就到了大二的寒假,大学的生活就这样过去了接近一半,之前听说大二寒假会有项目什么的,已经准好了心理准备. 但第一次着手项目,还是有点小紧张 在这之前我已经看了一些框架,也 ...
- WPF 中的 NameScope
我们在 WPF 中使用绑定时可以使用 ElementName=Foo 这样的写法,并且还能够真的在运行时找到这个名称对应的对象,是因为 WPF 中提供了名称范围概念. 实现 INameScope 接口 ...