在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3520|回复: 9

[求助] 求哪位大侠帮忙写个testbench

[复制链接]
发表于 2010-5-10 12:28:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我要用Verilog语言设计一个异步FIFO并用modelsim仿真出来,现在模块程序已经写好了,但是测试程序遇到问题了,请大侠们帮我写一个。下面我把我的各个模块程序附上。小女不胜感激
//verilog RTL for  the read-clock domain to write-clock domain synchonizer module
module sync_r2w(wrptr2,rptr,wclk,wrst_n);
parameter ADDRSIZE=4;
output[ADDRSIZE:0]wrptr2;
input[ADDRSIZE:0]rptr;
input wclk,wrst_n;
reg[ADDRSIZE:0]wrptr2,wrptr1;
[email=always@(posedge]always@(posedge[/email] wclk or negedge wrst_n)
if (!wrst_n){wrptr2,wrptr1}<=0;
else {wrptr2,wrptr1}<={wrptr1,rptr};
endmodule

//verilog RTL for the write-clock domain to read-clock domain synchronizer module
module sync_w2r(rwptr2,wptr,rclk,rrst_n);
parameter ADDRSIZE=4;
output[ADDRSIZE:0]rwptr2;
input[ADDRSIZE:0]wptr;
input rclk,rrst_n;
reg[ADDRSIZE:0]rwptr2,rwptr1;
[email=always@(posedge]always@(posedge[/email] rclk or negedge rrst_n)
if (!rrst_n){rwptr2,rwptr1}<=0;
else {rwptr2,rwptr1}<={rwptr1,wptr};
endmodule

module rptr_empty(rempty,raddr,rptr,rwptr2,rinc,rclk,rrst_n);
parameter ADDRSIZE=4;
output rempty;
output [ADDRSIZE-1:0]raddr;
output [ADDRSIZE:0] rptr;
input [ADDRSIZE:0] rwptr2;
input rinc,rclk,rrst_n;
reg [ADDRSIZE:0]rptr,rbin,rgnext,rbnext;
reg raddrmsb,rempty;
//graystyle1 pointer
[email=always@(posedge]always@(posedge[/email] rclk or negedge rrst_n)
if (!rrst_n) begin
rptr<=0;
raddrmsb<=0;
end
else begin
rptr<=rgnext;
raddrmsb<=rgnext[ADDRSIZE]^rgnext[ADDRSIZE-1];
end
[email=always@(rptr]always@(rptr[/email] or rinc or rempty ) begin:Gray_inc
integer i;
for(i=0;i<=ADDRSIZE;i=i+1)
rbin=^(rptr>>i);//gray to binary converter
if(!rempty)
rbnext=rbin+rinc;//increment the fifo counter
else
rbnext=rbin;
rgnext=(rbnext>>1)^rbnext;//binary to gray converter
end
//memory read-address pointer
assign raddr={raddrmsb,rptr[ADDRSIZE-2:0]};
//generation empty flag
[email=always@(posedge]always@(posedge[/email] rclk or negedge rrst_n)
if(!rrst_n) rempty <=1'b1;
else rempty <=(rgnext==rwptr2);
endmodule


module wptr_full (wfull,waddr,wptr,wrptr2,winc,wclk,wrst_n);
parameter ADDRSIZE=4;
output wfull;
output[ADDRSIZE-1:0] waddr;
output [ADDRSIZE:0] wptr;
input [ADDRSIZE :0] wrptr2;
input winc,wclk,wrst_n;
reg [ADDRSIZE:0] wptr,wbin,wgnext,wbnext;
reg waddrmsb,wfull;
//graystyle1 pointer
[email=always@(posedge]always@(posedge[/email] wclk or negedge wrst_n)
if(!wrst_n) begin
wptr<=0;
waddrmsb<=0;
end
else begin
wptr<=wgnext;
waddrmsb<=wgnext[ADDRSIZE]^wgnext[ADDRSIZE-1];
end
[email=always@(wptr]always@(wptr[/email] or winc or wfull) begin:Gray_inc
integer i;
for(i=0;i<=ADDRSIZE;i=i+1)
wbin=^(wptr>>i);//gray to binary converter
if(!wfull)
wbnext=wbin+winc;//increment the fifo counter
else
wbnext=wbin;
wgnext=(wbnext>>1)^wbnext;//binary to grayconverter
end
//memory write-address pointer
assign waddr={waddrmsb,wptr[ADDRSIZE-2:0]};
//generation full flag
wire w_2ndmsb=wgnext[ADDRSIZE]^wgnext[ADDRSIZE-1];
wire wr_2ndmsb=wrptr2[ADDRSIZE]^wrptr2[ADDRSIZE-1];
always @(posedge wclk or negedge wrst_n)
if(!wrst_n) wfull<=1'b1;
else wfull<=((wgnext[ADDRSIZE]!==wrptr2[ADDRSIZE])&&(w_2ndmsb==wr_2ndmsb)&&(wgnext[ADDRSIZE-2:0]==wrptr2[ADDRSIZE-2:0]));
endmodule



//buffer memory arry
module fifomem(rdata,wdata,waddr,raddr,wclk,wclken);
parameter DATASIZE=8;//memory data word width
parameter ADDRSIZE=4;//number of memory address bits
output[DATASIZE-1:0]rdata;
input [DATASIZE-1:0]wdata;
input wclk,wclken;
input[ADDRSIZE-1:0]raddr,waddr;
//instantiation of a vendor's dual_PORT RAM
`ifdef VENDORRAM
VENOR_RAM MEM(.dout(rdata),.din(wdata),.waddr(waddr),.raddr(raddr),.wclken(wclken),.clk(clk));
`else
reg[DATASIZE-1:0] MEM[0:ADDRSIZE-1];
assign rdata=MEM[raddr];//output the data
always @(posedge wclk)
if(wclken) MEM[waddr]<=wdata;//store the data
`endif   
endmodule
发表于 2010-5-10 13:24:02 | 显示全部楼层
把你的bench发上来给大家看看。帮你参谋一下。
 楼主| 发表于 2010-5-10 22:24:20 | 显示全部楼层
2# wycawyc



`timescale 1ns/100ps
module testbench;
parameter DATASIZE=8;
reg[DATASIZE-1:0] wdata,rdata;
reg wclk,rclk,wrst_n,rrst_n;
reg winc,rinc;
wire wfull,rempty;
//
initial
begin
#2000 $finsh ;
end
//
afifo DUT (rdata,wdata,winc,rinc,rempty,wfull,wclk,rclk,wrst_n,rrst_n);
initial
begin
wclk=0;
rclk=0;
wrst_n=1;
rrst_n=1;
winc=0;
rinc=0;
wdata=0;
#10 wrst_n=0;rrst_n=0;
#10 wrst_n=1;rrst_n=1;
end
//
initial
begin
$fsdbDumpfile("verilog.fsdb");
$fsdbDumpvars(0,afifo);
end
//
initial
begin
$monitor($time,"rinc=%b,rempty=%b,wfull=%b,rdata=%b",rinc,rempty,wfull,rdata);
end
endmodule
 楼主| 发表于 2010-5-10 22:37:08 | 显示全部楼层
3# yaqixinghuan

自己不会写。找了点儿书。依葫芦画瓢写了几句。
发表于 2010-5-11 12:53:44 | 显示全部楼层
看了你的测试平台,基本复位和时钟的产生,还有监控和fsdb的使用都应该没问题,关键是你怎么提供写入数据并观察读出数据了。
发表于 2010-5-11 18:53:49 | 显示全部楼层
代码基本上没有注释,写的太不规范了。
发表于 2010-5-11 20:55:34 | 显示全部楼层
109935913到群里问问同学们。你的程序太难了。
 楼主| 发表于 2010-5-12 07:49:27 | 显示全部楼层
7# wushihai
已经加了群了,可是没有人反应啊~
 楼主| 发表于 2010-5-12 07:50:37 | 显示全部楼层
5# gaurson
怎么写入观察啊~望大侠指导
发表于 2010-5-12 13:24:51 | 显示全部楼层
9# yaqixinghuan

就是提供wdata,然后观察rdata咯,至于怎么实现,就是逻辑设计的考虑了,和测试平台关系不大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 04:16 , Processed in 0.024694 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表