mirror of
https://github.com/alexforencich/verilog-ethernet.git
synced 2025-01-14 06:43:18 +08:00
Add DROP_OVERSIZE_FRAME parameter
This commit is contained in:
parent
0b2066abe3
commit
92681fad8c
@ -1,6 +1,6 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2014-2018 Alex Forencich
|
||||
Copyright (c) 2014-2021 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@ -66,12 +66,15 @@ module axis_async_fifo #
|
||||
parameter USER_BAD_FRAME_VALUE = 1'b1,
|
||||
// tuser mask for bad frame marker
|
||||
parameter USER_BAD_FRAME_MASK = 1'b1,
|
||||
// Drop frames marked bad
|
||||
// Drop frames larger than FIFO
|
||||
// Requires FRAME_FIFO set
|
||||
parameter DROP_OVERSIZE_FRAME = FRAME_FIFO,
|
||||
// Drop frames marked bad
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_BAD_FRAME = 0,
|
||||
// Drop incoming frames when full
|
||||
// When set, s_axis_tready is always asserted
|
||||
// Requires FRAME_FIFO set
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_WHEN_FULL = 0
|
||||
)
|
||||
(
|
||||
@ -131,13 +134,18 @@ initial begin
|
||||
$finish;
|
||||
end
|
||||
|
||||
if (DROP_BAD_FRAME && !FRAME_FIFO) begin
|
||||
$error("Error: DROP_BAD_FRAME set requires FRAME_FIFO set (instance %m)");
|
||||
if (DROP_OVERSIZE_FRAME && !FRAME_FIFO) begin
|
||||
$error("Error: DROP_OVERSIZE_FRAME set requires FRAME_FIFO set (instance %m)");
|
||||
$finish;
|
||||
end
|
||||
|
||||
if (DROP_WHEN_FULL && !FRAME_FIFO) begin
|
||||
$error("Error: DROP_WHEN_FULL set requires FRAME_FIFO set (instance %m)");
|
||||
if (DROP_BAD_FRAME && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin
|
||||
$error("Error: DROP_BAD_FRAME set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)");
|
||||
$finish;
|
||||
end
|
||||
|
||||
if (DROP_WHEN_FULL && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin
|
||||
$error("Error: DROP_WHEN_FULL set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)");
|
||||
$finish;
|
||||
end
|
||||
|
||||
@ -226,6 +234,7 @@ reg read;
|
||||
reg store_output;
|
||||
|
||||
reg drop_frame_reg = 1'b0;
|
||||
reg send_frame_reg = 1'b0;
|
||||
reg overflow_reg = 1'b0;
|
||||
reg bad_frame_reg = 1'b0;
|
||||
reg good_frame_reg = 1'b0;
|
||||
@ -243,7 +252,7 @@ reg good_frame_sync2_reg = 1'b0;
|
||||
reg good_frame_sync3_reg = 1'b0;
|
||||
reg good_frame_sync4_reg = 1'b0;
|
||||
|
||||
assign s_axis_tready = (FRAME_FIFO ? (!full_cur || full_wr || DROP_WHEN_FULL) : !full) && !s_rst_sync3_reg;
|
||||
assign s_axis_tready = (FRAME_FIFO ? (!full_cur || (full_wr && DROP_OVERSIZE_FRAME) || DROP_WHEN_FULL) : !full) && !s_rst_sync3_reg;
|
||||
|
||||
generate
|
||||
assign s_axis[DATA_WIDTH-1:0] = s_axis_tdata;
|
||||
@ -320,7 +329,7 @@ always @(posedge s_clk) begin
|
||||
wr_ptr_temp = wr_ptr_reg + 1;
|
||||
wr_ptr_reg <= wr_ptr_temp;
|
||||
wr_ptr_gray_reg <= wr_ptr_temp ^ (wr_ptr_temp >> 1);
|
||||
end else if (full_cur || full_wr || drop_frame_reg) begin
|
||||
end else if ((full_cur && DROP_WHEN_FULL) || (full_wr && DROP_OVERSIZE_FRAME) || drop_frame_reg) begin
|
||||
// full, packet overflow, or currently dropping frame
|
||||
// drop frame
|
||||
drop_frame_reg <= 1'b1;
|
||||
@ -337,16 +346,17 @@ always @(posedge s_clk) begin
|
||||
wr_ptr_temp = wr_ptr_cur_reg + 1;
|
||||
wr_ptr_cur_reg <= wr_ptr_temp;
|
||||
wr_ptr_cur_gray_reg <= wr_ptr_temp ^ (wr_ptr_temp >> 1);
|
||||
if (s_axis_tlast) begin
|
||||
// end of frame
|
||||
if (DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~(s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin
|
||||
if (s_axis_tlast || (!DROP_OVERSIZE_FRAME && (full_wr || send_frame_reg))) begin
|
||||
// end of frame or send frame
|
||||
send_frame_reg <= !s_axis_tlast;
|
||||
if (s_axis_tlast && DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~(s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin
|
||||
// bad packet, reset write pointer
|
||||
wr_ptr_temp = wr_ptr_reg;
|
||||
wr_ptr_cur_reg <= wr_ptr_temp;
|
||||
wr_ptr_cur_gray_reg <= wr_ptr_temp ^ (wr_ptr_temp >> 1);
|
||||
bad_frame_reg <= 1'b1;
|
||||
end else begin
|
||||
// good packet, update write pointer
|
||||
// good packet or packet overflow, update write pointer
|
||||
wr_ptr_temp = wr_ptr_cur_reg + 1;
|
||||
wr_ptr_reg <= wr_ptr_temp;
|
||||
wr_ptr_gray_reg <= wr_ptr_temp ^ (wr_ptr_temp >> 1);
|
||||
@ -361,10 +371,27 @@ always @(posedge s_clk) begin
|
||||
wr_ptr_update_valid_reg <= 1'b1;
|
||||
end
|
||||
|
||||
good_frame_reg <= 1'b1;
|
||||
good_frame_reg <= s_axis_tlast;
|
||||
end
|
||||
end
|
||||
end
|
||||
end else if (s_axis_tvalid && full_wr && FRAME_FIFO && !DROP_OVERSIZE_FRAME) begin
|
||||
// data valid with packet overflow
|
||||
// update write pointer
|
||||
send_frame_reg <= 1'b1;
|
||||
wr_ptr_temp = wr_ptr_cur_reg;
|
||||
wr_ptr_reg <= wr_ptr_temp;
|
||||
wr_ptr_gray_reg <= wr_ptr_temp ^ (wr_ptr_temp >> 1);
|
||||
|
||||
if (wr_ptr_update_reg == wr_ptr_update_ack_sync2_reg) begin
|
||||
// no sync in progress; sync update
|
||||
wr_ptr_update_valid_reg <= 1'b0;
|
||||
wr_ptr_sync_gray_reg <= wr_ptr_temp ^ (wr_ptr_temp >> 1);
|
||||
wr_ptr_update_reg <= !wr_ptr_update_ack_sync2_reg;
|
||||
end else begin
|
||||
// sync in progress; flag it for later
|
||||
wr_ptr_update_valid_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
if (s_rst_sync3_reg) begin
|
||||
@ -378,6 +405,7 @@ always @(posedge s_clk) begin
|
||||
wr_ptr_update_reg <= 1'b0;
|
||||
|
||||
drop_frame_reg <= 1'b0;
|
||||
send_frame_reg <= 1'b0;
|
||||
overflow_reg <= 1'b0;
|
||||
bad_frame_reg <= 1'b0;
|
||||
good_frame_reg <= 1'b0;
|
||||
|
@ -71,12 +71,15 @@ module axis_async_fifo_adapter #
|
||||
parameter USER_BAD_FRAME_VALUE = 1'b1,
|
||||
// tuser mask for bad frame marker
|
||||
parameter USER_BAD_FRAME_MASK = 1'b1,
|
||||
// Drop frames marked bad
|
||||
// Drop frames larger than FIFO
|
||||
// Requires FRAME_FIFO set
|
||||
parameter DROP_OVERSIZE_FRAME = FRAME_FIFO,
|
||||
// Drop frames marked bad
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_BAD_FRAME = 0,
|
||||
// Drop incoming frames when full
|
||||
// When set, s_axis_tready is always asserted
|
||||
// Requires FRAME_FIFO set
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_WHEN_FULL = 0
|
||||
)
|
||||
(
|
||||
@ -313,6 +316,7 @@ axis_async_fifo #(
|
||||
.FRAME_FIFO(FRAME_FIFO),
|
||||
.USER_BAD_FRAME_VALUE(USER_BAD_FRAME_VALUE),
|
||||
.USER_BAD_FRAME_MASK(USER_BAD_FRAME_MASK),
|
||||
.DROP_OVERSIZE_FRAME(DROP_OVERSIZE_FRAME),
|
||||
.DROP_BAD_FRAME(DROP_BAD_FRAME),
|
||||
.DROP_WHEN_FULL(DROP_WHEN_FULL)
|
||||
)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2013-2018 Alex Forencich
|
||||
Copyright (c) 2013-2021 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@ -66,12 +66,15 @@ module axis_fifo #
|
||||
parameter USER_BAD_FRAME_VALUE = 1'b1,
|
||||
// tuser mask for bad frame marker
|
||||
parameter USER_BAD_FRAME_MASK = 1'b1,
|
||||
// Drop frames marked bad
|
||||
// Drop frames larger than FIFO
|
||||
// Requires FRAME_FIFO set
|
||||
parameter DROP_OVERSIZE_FRAME = FRAME_FIFO,
|
||||
// Drop frames marked bad
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_BAD_FRAME = 0,
|
||||
// Drop incoming frames when full
|
||||
// When set, s_axis_tready is always asserted
|
||||
// Requires FRAME_FIFO set
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_WHEN_FULL = 0
|
||||
)
|
||||
(
|
||||
@ -124,13 +127,18 @@ initial begin
|
||||
$finish;
|
||||
end
|
||||
|
||||
if (DROP_BAD_FRAME && !FRAME_FIFO) begin
|
||||
$error("Error: DROP_BAD_FRAME set requires FRAME_FIFO set (instance %m)");
|
||||
if (DROP_OVERSIZE_FRAME && !FRAME_FIFO) begin
|
||||
$error("Error: DROP_OVERSIZE_FRAME set requires FRAME_FIFO set (instance %m)");
|
||||
$finish;
|
||||
end
|
||||
|
||||
if (DROP_WHEN_FULL && !FRAME_FIFO) begin
|
||||
$error("Error: DROP_WHEN_FULL set requires FRAME_FIFO set (instance %m)");
|
||||
if (DROP_BAD_FRAME && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin
|
||||
$error("Error: DROP_BAD_FRAME set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)");
|
||||
$finish;
|
||||
end
|
||||
|
||||
if (DROP_WHEN_FULL && !(FRAME_FIFO && DROP_OVERSIZE_FRAME)) begin
|
||||
$error("Error: DROP_WHEN_FULL set requires FRAME_FIFO and DROP_OVERSIZE_FRAME set (instance %m)");
|
||||
$finish;
|
||||
end
|
||||
|
||||
@ -169,11 +177,12 @@ wire empty = wr_ptr_reg == rd_ptr_reg;
|
||||
wire full_wr = wr_ptr_reg == (wr_ptr_cur_reg ^ {1'b1, {ADDR_WIDTH{1'b0}}});
|
||||
|
||||
reg drop_frame_reg = 1'b0;
|
||||
reg send_frame_reg = 1'b0;
|
||||
reg overflow_reg = 1'b0;
|
||||
reg bad_frame_reg = 1'b0;
|
||||
reg good_frame_reg = 1'b0;
|
||||
|
||||
assign s_axis_tready = FRAME_FIFO ? (!full_cur || full_wr || DROP_WHEN_FULL) : !full;
|
||||
assign s_axis_tready = FRAME_FIFO ? (!full_cur || (full_wr && DROP_OVERSIZE_FRAME) || DROP_WHEN_FULL) : !full;
|
||||
|
||||
generate
|
||||
assign s_axis[DATA_WIDTH-1:0] = s_axis_tdata;
|
||||
@ -209,7 +218,7 @@ always @(posedge clk) begin
|
||||
// normal FIFO mode
|
||||
mem[wr_ptr_reg[ADDR_WIDTH-1:0]] <= s_axis;
|
||||
wr_ptr_reg <= wr_ptr_reg + 1;
|
||||
end else if (full_cur || full_wr || drop_frame_reg) begin
|
||||
end else if ((full_cur && DROP_WHEN_FULL) || (full_wr && DROP_OVERSIZE_FRAME) || drop_frame_reg) begin
|
||||
// full, packet overflow, or currently dropping frame
|
||||
// drop frame
|
||||
drop_frame_reg <= 1'b1;
|
||||
@ -220,21 +229,28 @@ always @(posedge clk) begin
|
||||
overflow_reg <= 1'b1;
|
||||
end
|
||||
end else begin
|
||||
// store it
|
||||
mem[wr_ptr_cur_reg[ADDR_WIDTH-1:0]] <= s_axis;
|
||||
wr_ptr_cur_reg <= wr_ptr_cur_reg + 1;
|
||||
if (s_axis_tlast) begin
|
||||
// end of frame
|
||||
if (DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~(s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin
|
||||
if (s_axis_tlast || (!DROP_OVERSIZE_FRAME && (full_wr || send_frame_reg))) begin
|
||||
// end of frame or send frame
|
||||
send_frame_reg <= !s_axis_tlast;
|
||||
if (s_axis_tlast && DROP_BAD_FRAME && USER_BAD_FRAME_MASK & ~(s_axis_tuser ^ USER_BAD_FRAME_VALUE)) begin
|
||||
// bad packet, reset write pointer
|
||||
wr_ptr_cur_reg <= wr_ptr_reg;
|
||||
bad_frame_reg <= 1'b1;
|
||||
end else begin
|
||||
// good packet, update write pointer
|
||||
// good packet or packet overflow, update write pointer
|
||||
wr_ptr_reg <= wr_ptr_cur_reg + 1;
|
||||
good_frame_reg <= 1'b1;
|
||||
good_frame_reg <= s_axis_tlast;
|
||||
end
|
||||
end
|
||||
end
|
||||
end else if (s_axis_tvalid && full_wr && FRAME_FIFO && !DROP_OVERSIZE_FRAME) begin
|
||||
// data valid with packet overflow
|
||||
// update write pointer
|
||||
send_frame_reg <= 1'b1;
|
||||
wr_ptr_reg <= wr_ptr_cur_reg;
|
||||
end
|
||||
|
||||
if (rst) begin
|
||||
@ -242,6 +258,7 @@ always @(posedge clk) begin
|
||||
wr_ptr_cur_reg <= {ADDR_WIDTH+1{1'b0}};
|
||||
|
||||
drop_frame_reg <= 1'b0;
|
||||
send_frame_reg <= 1'b0;
|
||||
overflow_reg <= 1'b0;
|
||||
bad_frame_reg <= 1'b0;
|
||||
good_frame_reg <= 1'b0;
|
||||
|
@ -71,12 +71,15 @@ module axis_fifo_adapter #
|
||||
parameter USER_BAD_FRAME_VALUE = 1'b1,
|
||||
// tuser mask for bad frame marker
|
||||
parameter USER_BAD_FRAME_MASK = 1'b1,
|
||||
// Drop frames marked bad
|
||||
// Drop frames larger than FIFO
|
||||
// Requires FRAME_FIFO set
|
||||
parameter DROP_OVERSIZE_FRAME = FRAME_FIFO,
|
||||
// Drop frames marked bad
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_BAD_FRAME = 0,
|
||||
// Drop incoming frames when full
|
||||
// When set, s_axis_tready is always asserted
|
||||
// Requires FRAME_FIFO set
|
||||
// Requires FRAME_FIFO and DROP_OVERSIZE_FRAME set
|
||||
parameter DROP_WHEN_FULL = 0
|
||||
)
|
||||
(
|
||||
@ -308,6 +311,7 @@ axis_fifo #(
|
||||
.FRAME_FIFO(FRAME_FIFO),
|
||||
.USER_BAD_FRAME_VALUE(USER_BAD_FRAME_VALUE),
|
||||
.USER_BAD_FRAME_MASK(USER_BAD_FRAME_MASK),
|
||||
.DROP_OVERSIZE_FRAME(DROP_OVERSIZE_FRAME),
|
||||
.DROP_BAD_FRAME(DROP_BAD_FRAME),
|
||||
.DROP_WHEN_FULL(DROP_WHEN_FULL)
|
||||
)
|
||||
|
@ -47,7 +47,8 @@ export PARAM_PIPELINE_OUTPUT ?= 2
|
||||
export PARAM_FRAME_FIFO ?= 1
|
||||
export PARAM_USER_BAD_FRAME_VALUE ?= 1
|
||||
export PARAM_USER_BAD_FRAME_MASK ?= 1
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_OVERSIZE_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_DROP_OVERSIZE_FRAME)
|
||||
export PARAM_DROP_WHEN_FULL ?= 0
|
||||
|
||||
ifeq ($(SIM), icarus)
|
||||
@ -68,6 +69,7 @@ ifeq ($(SIM), icarus)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).FRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
@ -93,6 +95,7 @@ else ifeq ($(SIM), verilator)
|
||||
COMPILE_ARGS += -GFRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -GDROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -GDROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -GDROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
|
@ -121,7 +121,7 @@ async def run_test_tuser_assert(dut):
|
||||
test_frame = AxiStreamFrame(test_data, tuser=1)
|
||||
await tb.source.send(test_frame)
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_BAD_FRAME")):
|
||||
for k in range(64):
|
||||
await RisingEdge(dut.s_clk)
|
||||
|
||||
@ -210,7 +210,7 @@ async def run_test_overflow(dut):
|
||||
|
||||
tb.sink.pause = False
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_OVERSIZE_FRAME")):
|
||||
for k in range(2048):
|
||||
await RisingEdge(dut.s_clk)
|
||||
|
||||
@ -307,9 +307,10 @@ tests_dir = os.path.dirname(__file__)
|
||||
rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl'))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("frame_fifo", [0, 1])
|
||||
@pytest.mark.parametrize(("frame_fifo", "drop_oversize_frame", "drop_bad_frame", "drop_when_full"),
|
||||
[(0, 0, 0, 0), (1, 0, 0, 0), (1, 1, 0, 0), (1, 1, 1, 0)])
|
||||
@pytest.mark.parametrize("data_width", [8, 16, 32, 64])
|
||||
def test_axis_async_fifo(request, data_width, frame_fifo):
|
||||
def test_axis_async_fifo(request, data_width, frame_fifo, drop_oversize_frame, drop_bad_frame, drop_when_full):
|
||||
dut = "axis_async_fifo"
|
||||
module = os.path.splitext(os.path.basename(__file__))[0]
|
||||
toplevel = dut
|
||||
@ -335,8 +336,9 @@ def test_axis_async_fifo(request, data_width, frame_fifo):
|
||||
parameters['FRAME_FIFO'] = frame_fifo
|
||||
parameters['USER_BAD_FRAME_VALUE'] = 1
|
||||
parameters['USER_BAD_FRAME_MASK'] = 1
|
||||
parameters['DROP_BAD_FRAME'] = frame_fifo
|
||||
parameters['DROP_WHEN_FULL'] = 0
|
||||
parameters['DROP_OVERSIZE_FRAME'] = drop_oversize_frame
|
||||
parameters['DROP_BAD_FRAME'] = drop_bad_frame
|
||||
parameters['DROP_WHEN_FULL'] = drop_when_full
|
||||
|
||||
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
|
||||
|
||||
|
@ -51,7 +51,8 @@ export PARAM_USER_WIDTH ?= 1
|
||||
export PARAM_FRAME_FIFO ?= 1
|
||||
export PARAM_USER_BAD_FRAME_VALUE ?= 1
|
||||
export PARAM_USER_BAD_FRAME_MASK ?= 1
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_OVERSIZE_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_DROP_OVERSIZE_FRAME)
|
||||
export PARAM_DROP_WHEN_FULL ?= 0
|
||||
|
||||
ifeq ($(SIM), icarus)
|
||||
@ -73,6 +74,7 @@ ifeq ($(SIM), icarus)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).FRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
@ -99,6 +101,7 @@ else ifeq ($(SIM), verilator)
|
||||
COMPILE_ARGS += -GFRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -GDROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -GDROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -GDROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
|
@ -124,7 +124,7 @@ async def run_test_tuser_assert(dut):
|
||||
test_frame = AxiStreamFrame(test_data, tuser=1)
|
||||
await tb.source.send(test_frame)
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_BAD_FRAME")):
|
||||
for k in range(64):
|
||||
await RisingEdge(dut.s_clk)
|
||||
|
||||
@ -213,7 +213,7 @@ async def run_test_overflow(dut):
|
||||
|
||||
tb.sink.pause = False
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_OVERSIZE_FRAME")):
|
||||
for k in range(2048):
|
||||
await RisingEdge(dut.s_clk)
|
||||
|
||||
@ -310,10 +310,11 @@ tests_dir = os.path.dirname(__file__)
|
||||
rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl'))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("frame_fifo", [0, 1])
|
||||
@pytest.mark.parametrize(("frame_fifo", "drop_oversize_frame", "drop_bad_frame", "drop_when_full"),
|
||||
[(0, 0, 0, 0), (1, 0, 0, 0), (1, 1, 0, 0), (1, 1, 1, 0)])
|
||||
@pytest.mark.parametrize("m_data_width", [8, 16, 32])
|
||||
@pytest.mark.parametrize("s_data_width", [8, 16, 32])
|
||||
def test_axis_async_fifo_adapter(request, s_data_width, m_data_width, frame_fifo):
|
||||
def test_axis_async_fifo_adapter(request, s_data_width, m_data_width, frame_fifo, drop_oversize_frame, drop_bad_frame, drop_when_full):
|
||||
dut = "axis_async_fifo_adapter"
|
||||
module = os.path.splitext(os.path.basename(__file__))[0]
|
||||
toplevel = dut
|
||||
@ -342,8 +343,9 @@ def test_axis_async_fifo_adapter(request, s_data_width, m_data_width, frame_fifo
|
||||
parameters['FRAME_FIFO'] = frame_fifo
|
||||
parameters['USER_BAD_FRAME_VALUE'] = 1
|
||||
parameters['USER_BAD_FRAME_MASK'] = 1
|
||||
parameters['DROP_BAD_FRAME'] = frame_fifo
|
||||
parameters['DROP_WHEN_FULL'] = 0
|
||||
parameters['DROP_OVERSIZE_FRAME'] = drop_oversize_frame
|
||||
parameters['DROP_BAD_FRAME'] = drop_bad_frame
|
||||
parameters['DROP_WHEN_FULL'] = drop_when_full
|
||||
|
||||
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
|
||||
|
||||
|
@ -47,7 +47,8 @@ export PARAM_PIPELINE_OUTPUT ?= 2
|
||||
export PARAM_FRAME_FIFO ?= 1
|
||||
export PARAM_USER_BAD_FRAME_VALUE ?= 1
|
||||
export PARAM_USER_BAD_FRAME_MASK ?= 1
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_OVERSIZE_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_DROP_OVERSIZE_FRAME)
|
||||
export PARAM_DROP_WHEN_FULL ?= 0
|
||||
|
||||
ifeq ($(SIM), icarus)
|
||||
@ -68,6 +69,7 @@ ifeq ($(SIM), icarus)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).FRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
@ -93,6 +95,7 @@ else ifeq ($(SIM), verilator)
|
||||
COMPILE_ARGS += -GFRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -GDROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -GDROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -GDROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
|
@ -120,7 +120,7 @@ async def run_test_tuser_assert(dut):
|
||||
test_frame = AxiStreamFrame(test_data, tuser=1)
|
||||
await tb.source.send(test_frame)
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_BAD_FRAME")):
|
||||
for k in range(64):
|
||||
await RisingEdge(dut.clk)
|
||||
|
||||
@ -209,7 +209,7 @@ async def run_test_overflow(dut):
|
||||
|
||||
tb.sink.pause = False
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_OVERSIZE_FRAME")):
|
||||
for k in range(2048):
|
||||
await RisingEdge(dut.clk)
|
||||
|
||||
@ -306,9 +306,10 @@ tests_dir = os.path.dirname(__file__)
|
||||
rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl'))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("frame_fifo", [0, 1])
|
||||
@pytest.mark.parametrize(("frame_fifo", "drop_oversize_frame", "drop_bad_frame", "drop_when_full"),
|
||||
[(0, 0, 0, 0), (1, 0, 0, 0), (1, 1, 0, 0), (1, 1, 1, 0)])
|
||||
@pytest.mark.parametrize("data_width", [8, 16, 32, 64])
|
||||
def test_axis_fifo(request, data_width, frame_fifo):
|
||||
def test_axis_fifo(request, data_width, frame_fifo, drop_oversize_frame, drop_bad_frame, drop_when_full):
|
||||
dut = "axis_fifo"
|
||||
module = os.path.splitext(os.path.basename(__file__))[0]
|
||||
toplevel = dut
|
||||
@ -334,8 +335,9 @@ def test_axis_fifo(request, data_width, frame_fifo):
|
||||
parameters['FRAME_FIFO'] = frame_fifo
|
||||
parameters['USER_BAD_FRAME_VALUE'] = 1
|
||||
parameters['USER_BAD_FRAME_MASK'] = 1
|
||||
parameters['DROP_BAD_FRAME'] = frame_fifo
|
||||
parameters['DROP_WHEN_FULL'] = 0
|
||||
parameters['DROP_OVERSIZE_FRAME'] = drop_oversize_frame
|
||||
parameters['DROP_BAD_FRAME'] = drop_bad_frame
|
||||
parameters['DROP_WHEN_FULL'] = drop_when_full
|
||||
|
||||
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
|
||||
|
||||
|
@ -51,7 +51,8 @@ export PARAM_USER_WIDTH ?= 1
|
||||
export PARAM_FRAME_FIFO ?= 1
|
||||
export PARAM_USER_BAD_FRAME_VALUE ?= 1
|
||||
export PARAM_USER_BAD_FRAME_MASK ?= 1
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_OVERSIZE_FRAME ?= $(PARAM_FRAME_FIFO)
|
||||
export PARAM_DROP_BAD_FRAME ?= $(PARAM_DROP_OVERSIZE_FRAME)
|
||||
export PARAM_DROP_WHEN_FULL ?= 0
|
||||
|
||||
ifeq ($(SIM), icarus)
|
||||
@ -73,6 +74,7 @@ ifeq ($(SIM), icarus)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).FRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).USER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -P $(TOPLEVEL).DROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
@ -99,6 +101,7 @@ else ifeq ($(SIM), verilator)
|
||||
COMPILE_ARGS += -GFRAME_FIFO=$(PARAM_FRAME_FIFO)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_VALUE=$(PARAM_USER_BAD_FRAME_VALUE)
|
||||
COMPILE_ARGS += -GUSER_BAD_FRAME_MASK=$(PARAM_USER_BAD_FRAME_MASK)
|
||||
COMPILE_ARGS += -GDROP_OVERSIZE_FRAME=$(PARAM_DROP_OVERSIZE_FRAME)
|
||||
COMPILE_ARGS += -GDROP_BAD_FRAME=$(PARAM_DROP_BAD_FRAME)
|
||||
COMPILE_ARGS += -GDROP_WHEN_FULL=$(PARAM_DROP_WHEN_FULL)
|
||||
|
||||
|
@ -120,7 +120,7 @@ async def run_test_tuser_assert(dut):
|
||||
test_frame = AxiStreamFrame(test_data, tuser=1)
|
||||
await tb.source.send(test_frame)
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_BAD_FRAME")):
|
||||
for k in range(64):
|
||||
await RisingEdge(dut.clk)
|
||||
|
||||
@ -209,7 +209,7 @@ async def run_test_overflow(dut):
|
||||
|
||||
tb.sink.pause = False
|
||||
|
||||
if int(os.getenv("PARAM_FRAME_FIFO")):
|
||||
if int(os.getenv("PARAM_DROP_OVERSIZE_FRAME")):
|
||||
for k in range(2048):
|
||||
await RisingEdge(dut.clk)
|
||||
|
||||
@ -306,10 +306,11 @@ tests_dir = os.path.dirname(__file__)
|
||||
rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl'))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("frame_fifo", [0, 1])
|
||||
@pytest.mark.parametrize(("frame_fifo", "drop_oversize_frame", "drop_bad_frame", "drop_when_full"),
|
||||
[(0, 0, 0, 0), (1, 0, 0, 0), (1, 1, 0, 0), (1, 1, 1, 0)])
|
||||
@pytest.mark.parametrize("m_data_width", [8, 16, 32])
|
||||
@pytest.mark.parametrize("s_data_width", [8, 16, 32])
|
||||
def test_axis_fifo_adapter(request, s_data_width, m_data_width, frame_fifo):
|
||||
def test_axis_fifo_adapter(request, s_data_width, m_data_width, frame_fifo, drop_oversize_frame, drop_bad_frame, drop_when_full):
|
||||
dut = "axis_fifo_adapter"
|
||||
module = os.path.splitext(os.path.basename(__file__))[0]
|
||||
toplevel = dut
|
||||
@ -338,8 +339,9 @@ def test_axis_fifo_adapter(request, s_data_width, m_data_width, frame_fifo):
|
||||
parameters['FRAME_FIFO'] = frame_fifo
|
||||
parameters['USER_BAD_FRAME_VALUE'] = 1
|
||||
parameters['USER_BAD_FRAME_MASK'] = 1
|
||||
parameters['DROP_BAD_FRAME'] = frame_fifo
|
||||
parameters['DROP_WHEN_FULL'] = 0
|
||||
parameters['DROP_OVERSIZE_FRAME'] = drop_oversize_frame
|
||||
parameters['DROP_BAD_FRAME'] = drop_bad_frame
|
||||
parameters['DROP_WHEN_FULL'] = drop_when_full
|
||||
|
||||
extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user