`timescale 100ps / 1ps
module cmd_sync_fifo_tb;
parameter CLK_PERIOD = 150;
// Inputs
reg clk;
reg srst;
reg [31:0] din;
reg wr_en;
reg rd_en;
// Outputs
wire [31:0] dout;
wire full;
wire almost_full;
wire overflow;
wire empty;
wire almost_empty;
wire underflow;
wire [3:0] data_count;
integer i;
// Instantiate the Unit Under Test (UUT)
cmd_sync_fifo uut (
.clk(clk),
.srst(srst),
.din(din),
.wr_en(wr_en),
.rd_en(rd_en),
.dout(dout),
.full(full),
.almost_full(almost_full),
.overflow(overflow),
.empty(empty),
.almost_empty(almost_empty),
.underflow(underflow),
.data_count(data_count)
);
initial begin
// Initialize Inputs
srst = 0;
din = 0;
wr_en = 0;
rd_en = 0;
// Wait 100 ns for global reset to finish
#1000 srst = 1; // reset
#1000 srst = 0;
@(posedge clk);
#10 rd_en = 1; // なにもFIFOに入っていない時にrd_en=1をしているので、UNDERFLOWが出るはず
@(posedge clk);
#10 rd_en = 0;
@(posedge clk); // 3クロック分Wait
@(posedge clk);
@(posedge clk);
#10 srst = 1; // UNDERFLOW をreset;
@(posedge clk);
#10 srst = 0;
@(posedge clk);
#10 wr_en = 1; din = 32'h12345678; // 1データ書き込み
@(posedge clk);
#10 din = 32'h11223344; // もう1つデータを書き込み
@(posedge clk);
#10 wr_en = 0; // 書き込み終了
@(posedge clk);
#10;
@(posedge clk);
#10 rd_en = 1; // 1個のデータをRead
@(posedge clk);
#10 rd_en = 0;
@(posedge clk);
@(posedge clk);
#10 wr_en = 1; // wr_en を1にして、16個書くとOVERFLOWが出るはず
for (i=0; i<16; i=i+1) begin
din <= din +32'h1;
@(posedge clk);
#10;
end
#1000 $stop;
end
always begin
#(CLK_PERIOD/2) clk = 1'b1 ;
#(CLK_PERIOD/2) clk = 1'b0 ;
end
endmodule
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |