(3)异步FIFO验证方案方针激励代码集成电路

  • 格式:doc
  • 大小:38.50 KB
  • 文档页数:3

FIFO验证方案
FIFO功能:
8位异步FIFO的设计,其中写时钟100MHz,读时钟为5MHz,其中RAM的深度
为256。当写时钟脉冲上升沿到来时,判断写信号是有效,则写一个八位数据到
RAM中;当读时钟脉冲上升沿到来时,判断读信号是有效,则从RAM中把一个
八位数据读出来。当RAM中数据写满时产生一个满标志,不能再往RAM再写数
据;当RAM中数据读空时产生一个满标志,不能再从RAM读出数据
一、概述:
根据技术及其功能要求,对系统预确认,运行确认,性能确认等一系列活动。
二、预确认:
1、系统主要技术参数
2、数据的读写速度
3、工作电源电压
4、各引脚工作电压
三、模块运行确认:
目的是确认系统是否完成预期设计的功能;
1、将系统运行:
2、验证写满标志产生逻辑:
复位后先将读写信号使能(置0),读信号不使能(置1),写数据由8位计
数器cnt连续计数产生,并写入到存储单元中;让系统不断写数据,在一定
时间内看系统是否有产生写满标志;
3、验证空标志产生逻辑:
复位后先将读写信号置1(无效),读信号使能(置0),让系统不断的读数
据,在一定时间内看系统是否有产生空标志;
4、验证读地址产生模块:
系统复位后,一个8位rd_cnt计数器清0,在读使能和没有产生读空标
志的条件下,在读时钟上升沿的到来,rd_cnt计数器加1,跟随着rd_addr
读地址的变化,看产生的读地址变化是有符合预期设计。
5、验证写地址模块:
系统复位后,一个8位wr_cnt计数器清0,在写使能和没有产生写满标
志的条件下,在写时钟上升沿的到来,wr_cnt计数器加1,跟随着wr_addr
写地址的变化,看产生的写地址变化是有符合预期设计。
6、验证写数据模块:
系统复位后,在写使能时,写数据由8位计数器cnt连续计数产生,并
写入到存储单元中;调整计数器cnt的初值,验证产生的数据是否与写入的
数据一致。
7、验证写数据模块:
系统复位后,在读写使能时,看由8位计数器cnt连续计数产生并写入
的数据是否与读出来的数据顺序和数值一致。
四、系统运行确认:
(1)复位后,读信号和写信号不使能(均置1),由于存储单元没有数据,看是
否产生读空标志;(2)将写信号使能(置0),看写入的数据是否与设计输入的数据
一致;(3)将读信号使能,看读出来的数据顺序和数值是否与写入的数据一致;(4)
将写信号置1,看在一定的时钟下由预期设定的读地址加1与写地址相等时,有
读空标志产生否;(5)接着将写信号使能,将读信号置1,看在一定的时钟下由预
期设定的写地址加1与读地址相等时,有写满标志产生否;(6)将读写时钟使能,
看数据的读写是否正确,有写时钟比读时钟快,经过一定的时钟周期后,看有写
满标志产生;接下来,由于写满不能再写,故读时钟在读使能信号下读出数据时,
写满信号变为0,接着写满信号1和0交替出现。

仿真激励代码
module simulus;
reg clk_100M; //写数据时钟
reg clk_5M; //读数据时钟
reg rst_n; // 全局复位信号 低有效
reg wr_en; // 写使能信号 低有效
reg rd_en; // 读使能信号 低有效
reg[`DATA_WIDTH-1:0] wr_data; // 8位数据输入信号
wire[7:0] rd_data; // 8位数据输出信号
wire wr_full; //写满标志信号
wire rd_empty; //读空标志信号
reg[7:0] cnt; //仿真计数器
output[7:0]rd_cnt;
output[7:0]wr_cnt;
reg[7:0]rd_cnt //读地址跟随计数器
reg[7:0]rd_cnt //写地址跟随计数器
fifo fifo1(clk_100M,
clk_5M,
rst_n,
wr_en,
rd_en,
wr_data,
rd_data,
wr_full,
rd_empty);
always #10 clk_5M = ~clk_5M;
always #5 clk_100M = !clk_100M;
//输入数据初始化
initial
begin
rst_n = 0;
clk_100M = 0;
clk_5M = 1;
wr_en = 0;
rd_en = 0;
#20 rst_n = 1;
end
//写入数据
always @(posedge clk_100M or negedge rst_n)
begin
if(!rst_n)
wr_data <= 8'h0;
else
wr_data <= cnt;
end
// 计数器产生数据并写入存储单元
always @(posedge clk_100M or negedge rst_n)
begin
if(!rst_n)
cnt <= 8'h38;
else
cnt <= cnt + 1'b1;
end
// 读地址跟随计数器
always @(posedge clk_5M or negedge rst_n)
begin
if(!rst_n)
rd_cnt <= 8'd0;
else if(!rd_en && !rd_empty)
rd_cnt <= rd_cnt + 1'b1;
end
// 写地址跟随计数器
always @(posedge clk_100M or negedge rst_n)
begin
if(!rst_n)
wd_cnt <= 8'd0;
else if(!wr_en && !wr_full)
wr_cnt <= wr_cnt + 1'b1;
end
endmodule