Test Bench基础知识笔记
学的内容多了,好多指令和用法都容易遗忘和混淆,出现这种情况就需要勤记笔记,忘记了多翻阅几次,基本上就能完全记住了。
[`timescale 1ns/1ps]前一个1ns表示时延时间,后一个1ps表示时延精度。
写的一个Testbench示例
`timescale ps/ ps
module SendTest_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg [:] RcvWrAddr;
reg [:] RcvWrData;
reg RcvWrEn;
reg Test;
reg clk;
reg rst;
// wires
wire ARPBit;
wire [:] AppData;
wire AppDataFlag;
wire [:] ClientCMD;
wire ICMPBit;
wire [:] RCAckNum;
wire [:] RCWinSize;
wire RcvDone;
wire [:] ReSend;
wire [:] SSeqNum;
wire SendBusy;
wire [:] SendLength;
wire SendRdClk;
wire SendStart;
wire TCPBit;
wire [:] TCPCount;
wire [:] TCPState;
wire [:] TEncoderState;
wire [:] TRAMDATAIN;
wire [:] TRAMDATAOUT;
wire [:] TRcvDecoderStatus;
wire [:] TTestStatus1;
wire UDPBit;
wire [:] Value; // assign statements (if any)
SendTest i1 (
// port map - connection between master ports and signals/registers
.ARPBit(ARPBit),
.AppData(AppData),
.AppDataFlag(AppDataFlag),
.ClientCMD(ClientCMD),
.ICMPBit(ICMPBit),
.RCAckNum(RCAckNum),
.RCWinSize(RCWinSize),
.RcvDone(RcvDone),
.RcvWrAddr(RcvWrAddr),
.RcvWrData(RcvWrData),
.RcvWrEn(RcvWrEn),
.ReSend(ReSend),
.SSeqNum(SSeqNum),
.SendBusy(SendBusy),
.SendLength(SendLength),
.SendRdClk(SendRdClk),
.SendStart(SendStart),
.TCPBit(TCPBit),
.TCPCount(TCPCount),
.TCPState(TCPState),
.TEncoderState(TEncoderState),
.TRAMDATAIN(TRAMDATAIN),
.TRAMDATAOUT(TRAMDATAOUT),
.TRcvDecoderStatus(TRcvDecoderStatus),
.TTestStatus1(TTestStatus1),
.Test(Test),
.UDPBit(UDPBit),
.Value(Value),
.clk(clk),
.rst(rst)
);
parameter CLKTIME=;
parameter RSTTIME=;
initial clk=;
initial forever #(CLKTIME/) clk=~clk;
initial rst=;
initial #RSTTIME rst=; reg [:] CTCPFLAG;
reg [:] CSeqNum;
reg [:] CAckNum;
reg [:] CWinSize;
parameter ACK='b010000;
parameter SYN='b000010;
parameter FIN='b000001;
parameter PUSH='b001000; task SendTCP;
begin
@(negedge clk);//以太网目标MAC地址
RcvWrEn<='b1;
RcvWrAddr<='d0;
RcvWrData<='h00E0;
@(negedge clk); //
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h3DF4;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='hDDF7;
@(negedge clk); //以太网源MAC地址
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='hF0DE;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='hF1B5;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h5EF8;
@(negedge clk);//帧类型IP:0X0800
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0800;
@(negedge clk); //IP帧头
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h4500;
@(negedge clk); //total length
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h40;
@(negedge clk); //Identification
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h4006;
@(negedge clk); //check
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0;
@(negedge clk); //以太网源IP
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h3b45;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h40a9;
@(negedge clk); //以太网目的IP
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h3b45;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h4002;
@(negedge clk); //TCP帧头
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h001E;//src port 30
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h001e;//dest port
@(negedge clk); //seq
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CSeqNum[:];
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CSeqNum[:];
@(negedge clk); //ack
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CAckNum[:];
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CAckNum[:];
@(negedge clk); //
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<={'d5,6'd0,CTCPFLAG};
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CWinSize;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='d0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='d0;
@(negedge clk);
RcvWrEn<='b0;
RcvWrAddr<='d0;
RcvWrData<='d0;
@(negedge RcvDone);
end
endtask task SendT;
begin
//客户机发送'T'//////////////////////////////////////////////////////////////////
@(negedge clk);//以太网目标MAC地址
RcvWrEn<='b1;
RcvWrAddr<='d0;
RcvWrData<='h00E0;
@(negedge clk); //
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h3DF4;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='hDDF7;
@(negedge clk); //以太网源MAC地址
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='hF0DE;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='hF1B5;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h5EF8;
@(negedge clk);//帧类型IP:0X0800
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0800;
@(negedge clk); //IP帧头
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h4500;
@(negedge clk); //total length
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h29;//16'd41
@(negedge clk); //Identification
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h4006;
@(negedge clk); //check
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h0;
@(negedge clk); //以太网源IP
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h3b45;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h40a9;
@(negedge clk); //以太网目的IP
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h3b45;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h4002;
@(negedge clk); //TCP帧头
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h001E;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h001E;
@(negedge clk); //seq
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CSeqNum[:];
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CSeqNum[:];
@(negedge clk); //ack
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CAckNum[:];
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CAckNum[:];
@(negedge clk); //
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<={'d5,6'd0,CTCPFLAG};
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<=CWinSize;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='d0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='d0;
@(negedge clk);
RcvWrAddr<=RcvWrAddr+'b1;
RcvWrData<='h5400;//'T'
@(negedge clk);
RcvWrEn<='b0;
RcvWrAddr<='d0;
RcvWrData<='d0;
@(negedge RcvDone);
end
endtask initial
begin
RcvWrEn<='b0;
RcvWrAddr<='d0;
RcvWrData<='d0;
//写SYN请求//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d0;
CAckNum<='d0;
CTCPFLAG<=SYN;
CWinSize<='d65535;
SendTCP();
wait(SendBusy==);
wait(SendBusy==);
//回应SYN+ACK//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
//发送ACK1//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
//发送ACK2//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
//发送ACK3//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
//发送ACK4//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
//发送ACK5//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
//发送ACK6//////////////////////////////////////////////////////////////////
repeat()@(negedge clk);
CSeqNum<='d1;
CAckNum<='d1;
CTCPFLAG<=ACK;
CWinSize<='d65535;
SendTCP();
end endmodule
Test Bench基础知识笔记的更多相关文章
- JS基础知识笔记
2020-04-15 JS基础知识笔记 // new Boolean()传入的值与if判断一样 var test=new Boolean(); console.log(test); // false ...
- Java多线程基础知识笔记(持续更新)
多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...
- javascript基础知识笔记-自用
笔记内容根据个人基础知识不足不明白之处做的记录.主要看的:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 1.变量,变量的名字又叫标识符 ...
- Mysql之基础知识笔记
Mysql数据库基础知识个人笔记 连接本地数据库: mysql -h localhost -u root -p 回车输入数据库密码 数据库的基础操作: 查看当前所有的数据库:show database ...
- java基础知识-笔记整理
1.查看已安装jdk文件路径 CMD输入java -verbose. 2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...
- JavaScript基础知识笔记
做前端几年了,一直疏于整理归纳,所以这两天把基础看了一遍,加上使用经验,整理了基础知识中关键技术,旨在系统性的学习和备忘.如果发现错误,请留言提示,谢谢! 重要说明:本文只列举基础知识点,中级和高级内 ...
- Javascript 基础知识笔记
标签(空格分隔): 廖老师学习笔记 javascript 基本入门 根据廖雪峰老师官网,自己看后的简单笔记 第一小节 基本知识 <script type="text/javascrip ...
- 初学MySQL基础知识笔记--01
本人初入博客园,第一次写博客,在今后的时间里会一点点的提高自己博客的水平,以及博客的排版等. 在今天,我学习了一下MySQL数据库的基本知识,相信关于MySQL的资料网上会有很多,所以我就不在这里复制 ...
- mysql基础知识笔记
Mysql基础笔记 环境配置 基本概念 mysql命令行 进入 use show 查询 select order by where like 数据过滤regexp concat 文本函数 日期函数 数 ...
随机推荐
- 我终于忍不住喷一下某些书了,关于Java传引用的XX言论
凡是说Java对象传的是引用,简直一派胡言,尤其误导我这种Java初学者,更严重的是以前用过C++的Java初学者. 我们都知道Java建立对象一般都是需要这样的格式: Object obj = ne ...
- Js Carousel
http://getbootstrap.com/javascript/#carousel http://owlgraphic.com/owlcarousel/#demo https://www.mob ...
- htm、html、shtml区别
htm.html.shtml都是静态网页的后缀,三者也可以说都是只是扩展名不同,其他一样,都是静态的网页. htm和html是完全静态的网页不通过服务器编译解释直接送出给浏览器读取的静态网页,以htm ...
- 菜鸟Android之路(上)
自己为什么要学android 本人作为应届毕业生,自己进入社会前做过好多梦,可是呢,现实还是打败了无邪!!面对社会的压力和残酷的竞争力自己如何生成下去??我自己对自己说:第一步 先养活自己,才能走好以 ...
- C#方法定义和调用-2
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- ubuntu系统下创建软件桌面快捷方式
转自ubuntu系统下创建软件桌面快捷方式 默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制- ...
- php 文件上传 以及保存在本地的乱码问题处理
要知道两点: ①浏览器传到PHP程序中是UTF-8编码 ②PHP程序保存上传的文件,要转换成GBK编码才保存在本地中,否则如果直接使用浏览器传过来的文件名保存在本地,会出现文件名乱码. <?ph ...
- 李洪强iOS开发Swift篇—04_运算符
李洪强iOS开发Swift篇—04_运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运 ...
- [topcoder]BestRoads
http://community.topcoder.com/stat?c=problem_statement&pm=10172&rd=13515 http://community.to ...
- php拓展ssh功能
1.下载拓展ssh需要的两个软件包,libssh2和ssh2. libssh2下载地址:http://pan.baidu.com/s/1hq7XOhu libssh2官网下载地址:http://www ...