v1.0
This commit is contained in:
114
tb/tb_async_fifo.v
Normal file
114
tb/tb_async_fifo.v
Normal file
@@ -0,0 +1,114 @@
|
||||
`timescale 1ns/1ps
|
||||
module tb_async_fifo;
|
||||
parameter DATA_WIDTH = 8;
|
||||
parameter FIFO_DEPTH = 16;
|
||||
|
||||
reg wr_clk;
|
||||
reg rd_clk;
|
||||
reg wr_rst_n;
|
||||
reg rd_rst_n;
|
||||
reg wr_en;
|
||||
reg [DATA_WIDTH -1:0] wr_data;
|
||||
wire full;
|
||||
reg rd_en;
|
||||
wire [DATA_WIDTH -1:0] rd_data;
|
||||
wire empty;
|
||||
|
||||
async_fifo #(
|
||||
.DATA_WIDTH(DATA_WIDTH),
|
||||
.FIFO_DEPTH(FIFO_DEPTH)
|
||||
) u_async_fifo(
|
||||
.wr_clk(wr_clk),
|
||||
.wr_rst_n(wr_rst_n),
|
||||
.rd_clk(rd_clk),
|
||||
.rd_rst_n(rd_rst_n),
|
||||
.wr_en(wr_en),
|
||||
.wr_data(wr_data),
|
||||
.full(full),
|
||||
.rd_en(rd_en),
|
||||
.rd_data(rd_data),
|
||||
.empty(empty)
|
||||
);
|
||||
|
||||
initial begin
|
||||
wr_clk = 0;
|
||||
rd_clk = 0;
|
||||
forever begin
|
||||
#20;
|
||||
wr_clk = ~wr_clk;
|
||||
end
|
||||
end
|
||||
|
||||
initial begin
|
||||
forever begin
|
||||
#10;
|
||||
rd_clk = ~rd_clk;
|
||||
end
|
||||
end
|
||||
initial begin
|
||||
init;
|
||||
push;
|
||||
pop;
|
||||
$fsdbDumpfile("tb.fsdb");
|
||||
$fsdbDumpvars(0,tb_async_fifo,"+all");
|
||||
#100;
|
||||
$finish;
|
||||
end
|
||||
|
||||
task init;
|
||||
begin
|
||||
wr_rst_n = 0;
|
||||
rd_rst_n = 0;
|
||||
@(posedge wr_clk);
|
||||
@(posedge rd_clk);
|
||||
#1;
|
||||
wr_rst_n = 1'b1;
|
||||
rd_rst_n = 1'b1;
|
||||
|
||||
wr_en = 'b0;
|
||||
wr_data = 'd0;
|
||||
rd_en = 'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
integer i;
|
||||
task push;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge wr_clk) begin
|
||||
wr_data <= {$random}%DATA_WIDTH + 5'd20;
|
||||
wr_en <= 1;
|
||||
if(!full) begin
|
||||
$display("write data is %0d",wr_data);
|
||||
end else begin
|
||||
$display("fifo is full!");
|
||||
end
|
||||
end
|
||||
end
|
||||
wr_en <= 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
task pop;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge rd_clk) begin
|
||||
rd_en <= 1;
|
||||
if(!empty) begin
|
||||
$display("read data is %0d",rd_data);
|
||||
end else begin
|
||||
$display("fifo is empty!");
|
||||
end
|
||||
end
|
||||
end
|
||||
rd_en = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
|
105
tb/tb_rchannel.v
Normal file
105
tb/tb_rchannel.v
Normal file
@@ -0,0 +1,105 @@
|
||||
module tb_rchannel;
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
reg axi_s_arvalid;
|
||||
reg [25:0] axi_s_araddr;
|
||||
reg [7:0] axi_s_arlen;
|
||||
wire axi_s_arready;
|
||||
wire [63:0] axi_s_rdata;
|
||||
wire axi_s_rvalid;
|
||||
wire axi_s_rlast;
|
||||
wire [159:0] rframe_data;
|
||||
wire rframe_valid;
|
||||
reg rframe_ready;
|
||||
reg [127:0] array2axi_rdata;
|
||||
reg array2axi_rdata_valid;
|
||||
|
||||
rchannel u_rchannel(
|
||||
.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.axi_s_arvalid(axi_s_arvalid),
|
||||
.axi_s_araddr(axi_s_araddr),
|
||||
.axi_s_arlen(axi_s_arlen),
|
||||
.axi_s_arready(axi_s_arready),
|
||||
.axi_s_rdata(axi_s_rdata),
|
||||
.axi_s_rvalid(axi_s_rvalid),
|
||||
.axi_s_rlast(axi_s_rlast),
|
||||
.rframe_data(rframe_data),
|
||||
.rframe_valid(rframe_valid),
|
||||
.rframe_ready(rframe_ready),
|
||||
.array2axi_rdata(array2axi_rdata),
|
||||
.array2axi_rdata_valid(array2axi_rdata_valid)
|
||||
);
|
||||
|
||||
initial begin
|
||||
clk = 1'd0;
|
||||
forever begin
|
||||
#10; clk = ~clk;
|
||||
end
|
||||
end
|
||||
|
||||
initial begin
|
||||
rst_n = 1'b0;
|
||||
axi_s_arvalid = 'd0;
|
||||
axi_s_araddr = 'd0;
|
||||
axi_s_arlen = 'd0;
|
||||
rframe_ready = 1'b1;
|
||||
array2axi_rdata = 'd0;
|
||||
array2axi_rdata_valid = 'd0;
|
||||
@(posedge clk) begin
|
||||
rst_n <= 1'b1;
|
||||
end
|
||||
ar({16'h1,6'h3f,4'h0},8'd9);
|
||||
@(posedge clk);
|
||||
@(posedge clk);
|
||||
@(posedge clk);
|
||||
@(posedge clk);
|
||||
@(posedge clk);
|
||||
arrayrdata({64'h2,64'h1});
|
||||
arrayrdata({64'h4,64'h3});
|
||||
arrayrdata({64'h6,64'h5});
|
||||
arrayrdata({64'h8,64'h7});
|
||||
arrayrdata({64'ha,64'h9});
|
||||
#15;
|
||||
$finish;
|
||||
end
|
||||
|
||||
task ar;
|
||||
input [25:0] araddr;
|
||||
input [7:0] arlen;
|
||||
begin
|
||||
@(posedge clk) begin
|
||||
axi_s_arvalid <= 1'b1;
|
||||
axi_s_araddr <= araddr;
|
||||
axi_s_arlen <= arlen;
|
||||
#1;
|
||||
wait(axi_s_arready);
|
||||
@(posedge clk) begin
|
||||
axi_s_arvalid <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
task arrayrdata;
|
||||
input [127:0] rdata;
|
||||
begin
|
||||
@(posedge clk) begin
|
||||
array2axi_rdata <= rdata;
|
||||
array2axi_rdata_valid <= 1'b1;
|
||||
end
|
||||
@(posedge clk) begin
|
||||
array2axi_rdata_valid <= 1'b0;
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
initial begin
|
||||
$fsdbDumpfile("tb.fsdb");
|
||||
$fsdbDumpvars(0,tb_rchannel,"+all");
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
|
97
tb/tb_sync_fifo.v
Normal file
97
tb/tb_sync_fifo.v
Normal file
@@ -0,0 +1,97 @@
|
||||
`timescale 1ns/1ps
|
||||
module tb_sync_fifo;
|
||||
parameter DATA_WIDTH = 30;
|
||||
parameter FIFO_DEPTH = 4;
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
reg wr_en;
|
||||
reg [DATA_WIDTH -1:0] wr_data;
|
||||
wire full;
|
||||
reg rd_en;
|
||||
wire [DATA_WIDTH -1:0] rd_data;
|
||||
wire empty;
|
||||
|
||||
sync_fifo #(
|
||||
.DATA_WIDTH(DATA_WIDTH),
|
||||
.FIFO_DEPTH(FIFO_DEPTH)
|
||||
) u_sync_fifo(
|
||||
.clk(clk),
|
||||
.rst_n(rst_n),
|
||||
.wr_en(wr_en),
|
||||
.wr_data(wr_data),
|
||||
.full(full),
|
||||
.rd_en(rd_en),
|
||||
.rd_data(rd_data),
|
||||
.empty(empty)
|
||||
);
|
||||
|
||||
initial begin
|
||||
clk = 0;
|
||||
forever begin
|
||||
#10;
|
||||
clk = ~clk;
|
||||
end
|
||||
end
|
||||
|
||||
initial begin
|
||||
init;
|
||||
push;
|
||||
pop;
|
||||
$fsdbDumpfile("tb.fsdb");
|
||||
$fsdbDumpvars(0,tb_sync_fifo);
|
||||
#100;
|
||||
$finish;
|
||||
end
|
||||
|
||||
task init;
|
||||
begin
|
||||
rst_n = 0;
|
||||
#30;
|
||||
rst_n = 1'b1;
|
||||
wr_en = 'b0;
|
||||
wr_data = 'd0;
|
||||
rd_en = 'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
integer i;
|
||||
task push;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge clk) begin
|
||||
wr_data <= {$random}%DATA_WIDTH + 5'd20;
|
||||
wr_en <= 1;
|
||||
if(!full) begin
|
||||
$display("write data is %0d",wr_data);
|
||||
end else begin
|
||||
$display("fifo is full!");
|
||||
end
|
||||
end
|
||||
end
|
||||
wr_en <= 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
task pop;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(negedge clk) begin
|
||||
rd_en <= 1;
|
||||
if(!empty) begin
|
||||
$display("read data is %0d",rd_data);
|
||||
end else begin
|
||||
$display("fifo is empty!");
|
||||
end
|
||||
end
|
||||
end
|
||||
rd_en = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
|
100
tb/tb_sync_fifo_128_to_64.v
Normal file
100
tb/tb_sync_fifo_128_to_64.v
Normal file
@@ -0,0 +1,100 @@
|
||||
`timescale 1ns/1ps
|
||||
module tb_sync_fifo_128_to_64;
|
||||
parameter DATA_IN_WIDTH = 128;
|
||||
parameter DATA_OUT_WIDTH = 64;
|
||||
parameter FIFO_DEPTH = 8;
|
||||
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
reg wr_en;
|
||||
reg [DATA_IN_WIDTH -1:0] wr_data;
|
||||
wire full;
|
||||
reg rd_en;
|
||||
wire [DATA_OUT_WIDTH -1:0] rd_data;
|
||||
wire empty;
|
||||
|
||||
sync_fifo_128_to_64 #(
|
||||
.DATA_IN_WIDTH(DATA_IN_WIDTH),
|
||||
.DATA_OUT_WIDTH(DATA_OUT_WIDTH),
|
||||
.FIFO_DEPTH(FIFO_DEPTH)
|
||||
) u_sync_fifo_128_to_64(
|
||||
.clk(clk),
|
||||
.rst_n(rst_n),
|
||||
.wr_en(wr_en),
|
||||
.wr_data(wr_data),
|
||||
.full(full),
|
||||
.rd_en(rd_en),
|
||||
.rd_data(rd_data),
|
||||
.empty(empty)
|
||||
);
|
||||
|
||||
initial begin
|
||||
clk = 0;
|
||||
forever begin
|
||||
#10;
|
||||
clk = ~clk;
|
||||
end
|
||||
end
|
||||
|
||||
initial begin
|
||||
init;
|
||||
push;
|
||||
pop;
|
||||
$fsdbDumpfile("tb.fsdb");
|
||||
$fsdbDumpvars(0,tb_sync_fifo_128_to_64,"+all");
|
||||
#100;
|
||||
$finish;
|
||||
end
|
||||
|
||||
task init;
|
||||
begin
|
||||
rst_n = 0;
|
||||
#30;
|
||||
rst_n = 1'b1;
|
||||
wr_en = 'b0;
|
||||
wr_data = 'd0;
|
||||
rd_en = 'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
integer i;
|
||||
task push;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge clk) begin
|
||||
wr_data <= $random;
|
||||
wr_en <= 1;
|
||||
if(!full) begin
|
||||
$display("write data is %0h",wr_data);
|
||||
end else begin
|
||||
$display("cannot push! fifo is full!");
|
||||
end
|
||||
end
|
||||
end
|
||||
wr_en <= 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
task pop;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge clk) begin
|
||||
rd_en <= 1;
|
||||
if(!empty) begin
|
||||
$display("read data is %0h",rd_data);
|
||||
end else begin
|
||||
$display("cannot pop! fifo is empty!");
|
||||
end
|
||||
end
|
||||
end
|
||||
rd_en = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
|
100
tb/tb_sync_fifo_64_to_128.v
Normal file
100
tb/tb_sync_fifo_64_to_128.v
Normal file
@@ -0,0 +1,100 @@
|
||||
`timescale 1ns/1ps
|
||||
module tb_sync_fifo_64_to_128;
|
||||
parameter DATA_IN_WIDTH = 64;
|
||||
parameter DATA_OUT_WIDTH = 128;
|
||||
parameter FIFO_DEPTH = 8;
|
||||
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
reg wr_en;
|
||||
reg [DATA_IN_WIDTH -1:0] wr_data;
|
||||
wire full;
|
||||
reg rd_en;
|
||||
wire [DATA_OUT_WIDTH -1:0] rd_data;
|
||||
wire empty;
|
||||
|
||||
sync_fifo_64_to_128 #(
|
||||
.DATA_IN_WIDTH(DATA_IN_WIDTH),
|
||||
.DATA_OUT_WIDTH(DATA_OUT_WIDTH),
|
||||
.FIFO_DEPTH(FIFO_DEPTH)
|
||||
) u_sync_fifo_64_to_128(
|
||||
.clk(clk),
|
||||
.rst_n(rst_n),
|
||||
.wr_en(wr_en),
|
||||
.wr_data(wr_data),
|
||||
.full(full),
|
||||
.rd_en(rd_en),
|
||||
.rd_data(rd_data),
|
||||
.empty(empty)
|
||||
);
|
||||
|
||||
initial begin
|
||||
clk = 0;
|
||||
forever begin
|
||||
#10;
|
||||
clk = ~clk;
|
||||
end
|
||||
end
|
||||
|
||||
initial begin
|
||||
init;
|
||||
push;
|
||||
pop;
|
||||
$fsdbDumpfile("tb.fsdb");
|
||||
$fsdbDumpvars(0,tb_sync_fifo_64_to_128,"+all");
|
||||
#100;
|
||||
$finish;
|
||||
end
|
||||
|
||||
task init;
|
||||
begin
|
||||
rst_n = 0;
|
||||
#30;
|
||||
rst_n = 1'b1;
|
||||
wr_en = 'b0;
|
||||
wr_data = 5'd19;
|
||||
rd_en = 'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
integer i;
|
||||
task push;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge clk) begin
|
||||
wr_data <= i+5'd20;
|
||||
wr_en <= 1;
|
||||
if(!full) begin
|
||||
$display("write data is %0h",wr_data);
|
||||
end else begin
|
||||
$display("cannot push! fifo is full!");
|
||||
end
|
||||
end
|
||||
end
|
||||
wr_en <= 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
task pop;
|
||||
begin
|
||||
for(i=0;i<=20;i=i+1) begin
|
||||
@(posedge clk) begin
|
||||
rd_en <= 1;
|
||||
if(!empty) begin
|
||||
$display("read data is %0h",rd_data);
|
||||
end else begin
|
||||
$display("cannot pop! fifo is empty!");
|
||||
end
|
||||
end
|
||||
end
|
||||
rd_en = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
|
116
tb/tb_wchannel.v
Normal file
116
tb/tb_wchannel.v
Normal file
@@ -0,0 +1,116 @@
|
||||
`timescale 1ns/1ps
|
||||
module tb_wchannel;
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
|
||||
reg axi_s_awvalid;
|
||||
wire axi_s_awready;
|
||||
reg [7:0] axi_s_awlen;
|
||||
reg [25:0] axi_s_awaddr;
|
||||
|
||||
reg axi_s_wvalid;
|
||||
wire axi_s_wready;
|
||||
|
||||
reg [63:0] axi_s_wdata;
|
||||
reg axi_s_wlast;
|
||||
|
||||
wire wframe_valid;
|
||||
wire [159:0] wframe_data;
|
||||
reg wframe_ready;
|
||||
|
||||
wchannel u_wchannel(
|
||||
.clk(clk),
|
||||
.rst_n(rst_n),
|
||||
.axi_s_awvalid(axi_s_awvalid),
|
||||
.axi_s_awready(axi_s_awready),
|
||||
.axi_s_awlen(axi_s_awlen),
|
||||
.axi_s_awaddr(axi_s_awaddr),
|
||||
.axi_s_wvalid(axi_s_wvalid),
|
||||
.axi_s_wready(axi_s_wready),
|
||||
.axi_s_wdata(axi_s_wdata),
|
||||
.axi_s_wlast(axi_s_wlast),
|
||||
.wframe_valid(wframe_valid),
|
||||
.wframe_data(wframe_data),
|
||||
.wframe_ready(wframe_ready)
|
||||
);
|
||||
|
||||
initial begin
|
||||
clk = 0;
|
||||
forever begin
|
||||
#10 clk = ~clk;
|
||||
end
|
||||
end
|
||||
|
||||
initial begin
|
||||
rst_n = 1'b0;
|
||||
axi_s_awvalid = 1'b0;
|
||||
axi_s_awlen = 8'b0;
|
||||
axi_s_wvalid = 1'b0;
|
||||
axi_s_wdata = 64'b0;
|
||||
axi_s_wlast = 1'b0;
|
||||
wframe_ready = 1'b1;
|
||||
@(posedge clk) begin
|
||||
rst_n <= 1'b1;
|
||||
end
|
||||
aw(8'd5,{16'h0,6'h3f,4'h0});
|
||||
aw(8'd3,26'h20);
|
||||
w(64'd1,0);
|
||||
w(64'd2,0);
|
||||
w(64'd3,0);
|
||||
w(64'd4,0);
|
||||
w(64'd5,0);
|
||||
w(64'd6,1);
|
||||
@(posedge clk) begin
|
||||
axi_s_wvalid <= 1'b0;
|
||||
end
|
||||
w(64'd6,0);
|
||||
w(64'd7,0);
|
||||
@(posedge clk) begin
|
||||
axi_s_wvalid <= 1'b0;
|
||||
end
|
||||
$display("end");
|
||||
#100;
|
||||
$finish;
|
||||
end
|
||||
|
||||
task aw;
|
||||
input [7:0] awlen;
|
||||
input [25:0] awaddr;
|
||||
begin
|
||||
@(posedge clk) begin
|
||||
axi_s_awvalid <= 1'b1;
|
||||
axi_s_awaddr <= awaddr;
|
||||
axi_s_awlen <= awlen;
|
||||
end
|
||||
#1;
|
||||
wait(axi_s_awready);
|
||||
@(posedge clk) begin
|
||||
axi_s_awvalid <= 1'b0;
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
task w;
|
||||
input [63:0] wdata;
|
||||
input wlast;
|
||||
begin
|
||||
@(posedge clk) begin
|
||||
axi_s_wvalid <= 1'b1;
|
||||
axi_s_wdata <= wdata;
|
||||
axi_s_wlast <= wlast;
|
||||
$display("wdata is %0h",wdata);
|
||||
end
|
||||
#1;
|
||||
wait(axi_s_wready);
|
||||
@(posedge clk) begin
|
||||
axi_s_wvalid <= 1'b0;
|
||||
end
|
||||
end
|
||||
endtask
|
||||
|
||||
initial begin
|
||||
$fsdbDumpfile("tb.fsdb");
|
||||
$fsdbDumpvars(0,tb_wchannel,"+all");
|
||||
|
||||
end
|
||||
endmodule
|
Reference in New Issue
Block a user