Verilog Xilinx FIFO IP块输出仿真

Verilog Xilinx FIFO IP块输出仿真,verilog,Verilog,我在玩Xilinx FIFO IP块,在以下输出中我无法解释一些事情: 试验台代码: `define wrclk_period 20 ; `define rdclk_period 10 ; module testbench; reg rst; reg wr_clk ; reg rd_clk ; reg [7:0] din ; reg wr_en ; reg rd_en ; wire [7:0] dout ; wire full ; wire empty ; fifo_generator

我在玩Xilinx FIFO IP块,在以下输出中我无法解释一些事情:

试验台代码:

`define wrclk_period 20 ;
`define rdclk_period 10 ;

module testbench;
reg rst;
reg wr_clk ;
reg rd_clk ;
reg [7:0] din ; 
reg wr_en ;
reg rd_en ;
wire [7:0] dout ;
wire full ; 
wire empty ;

fifo_generator_0 FG0(rst,wr_clk,rd_clk,din,wr_en,rd_en,dout,full,empty) ;


initial wr_clk = 1 ;
always #10 wr_clk = ~wr_clk ;

initial rd_clk = 1 ;
always #5 rd_clk = ~rd_clk ;




integer i,j ;

initial begin 
rst = 1 ; 
#10
   din = 0 ;
   wr_en = 0 ;
   rd_en = 0 ;
   rst = 0 ;
   #`wrclk_period ;
   rst = 1 ;
   #`wrclk_period ;
   rst = 0 ;
   #60;


   for(i= 0 ; i<=5 ; i = i+1  ) begin 
     wr_en = 1 ;
     din = i ;
     #`wrclk_period ;
   end 

   wr_en = 0 ;
   #`wrclk_period ;

   #`rdclk_period ;

   for( j= 0 ; j<=5 ; j = j+1  ) begin 
        rd_en = 1 ;
        #`rdclk_period ;
    end

      rd_en = 0 ;
      #`rdclk_period ;

      $stop ;
   end
endmodule
`定义wrclk_周期20;
`定义rdclk_周期10;
模块测试台;
注册rst;
雷格沃鲁克;
雷格尔德钟;
注册号[7:0]din;
注册商标;
雷格尔登;
金属丝[7:0]dout;
满线;
电线是空的;
先进先出发生器0 FG0(rst、wr clk、rd clk、din、wr en、rd en、dout、满、空);
初始wr_clk=1;
始终#10 wr#clk=~wr#clk;
初始rd_clk=1;
始终#第五时钟=~第三时钟;
整数i,j;
初始开始
rst=1;
#10
din=0;
wr_en=0;
rd_en=0;
rst=0;
#`wrclk_期;
rst=1;
#`wrclk_期;
rst=0;
#60;

对于(i=0;i对不起,在评论中有此内容,但空间严重不足

我不熟悉IP,但可以做出一些有根据的猜测

1/我怀疑在重置后,您必须等待更长的时间才能开始使用FIFO。可能到那时,full标志已低。
“满”标志的问题可能是因为复位后FIFO电平必须通过需要几个周期的时钟域交叉。作为预防措施,设计者将其设置为“满”,因为这是故障安全状态

2/我还怀疑未写入值0x01,因为FIFO仍然认为它已满

3/更仔细地研究波形:2->3是一个时钟,3->4是一个时钟,但当FIFO为空时,您正在读取!!因此,只有在FIFO不再为空时,5才会出现

一般来说,如果你第一次测试一个这样的块,你的计时时间会长很多。所以在写之前重置后等待更长的时间,在写之后等待更长的时间,然后再读取

最后一点意见:您的
rd_en
似乎运行在
rd_clk
的上升沿,没问题。但是您的
wr_en
信号运行在wr_clk的下降沿或
rd_clk
的上升沿。如果是后者,则是错误的