testbench for accum adaptation for dma

This commit is contained in:
otroubi
2026-07-29 10:18:33 +03:00
parent 4247a107ef
commit 5eb746c0ad
2 changed files with 99 additions and 87 deletions
+43 -43
View File
@@ -4,13 +4,20 @@ module tb_accumulator_top;
localparam DATA_WIDTH = 12;
localparam ACCUM_WIDTH = 32;
localparam RW_WIDTH = 32;
localparam N_MAX = 4096;
localparam MAX_WINDOW_SIZE = 65;
localparam PACKET_SIZE = 1024;
localparam PACKET_SIZE = 32;
localparam READ_BATCH_SIZE = (PACKET_SIZE*8)/ACCUM_WIDTH;
localparam MAX_WORDS = N_MAX;
localparam MAX_SEQ_NUM = 256;
localparam int WR_WORD_BYTES = ACCUM_WIDTH/8;
localparam int RD_WORD_BYTES = RW_WIDTH/8;
localparam int PACKET_WR_WORDS = PACKET_SIZE / WR_WORD_BYTES;
localparam int PACKET_RD_WORDS = PACKET_SIZE / RD_WORD_BYTES;
logic clk_in;
logic eth_clk_in;
logic rst;
@@ -25,7 +32,7 @@ module tb_accumulator_top;
logic req_ready;
wire send_req;
wire [7:0] m_axis_tdata;
wire [RW_WIDTH-1:0] m_axis_tdata;
wire m_axis_tvalid;
logic m_axis_tready;
wire m_axis_tlast;
@@ -39,10 +46,10 @@ module tb_accumulator_top;
integer tests_passed;
integer packets_seen;
integer current_packet_byte_count;
integer current_packet_word_count;
integer total_words_captured;
byte packet_bytes [0:PACKET_SIZE-1];
logic [RW_WIDTH-1:0] packet_bytes [0:PACKET_RD_WORDS-1];
logic [ACCUM_WIDTH-1:0] expected_words [0:MAX_WORDS-1];
logic [ACCUM_WIDTH-1:0] captured_words_le[0:MAX_WORDS-1];
logic [ACCUM_WIDTH-1:0] captured_words_be[0:MAX_WORDS-1];
@@ -51,7 +58,8 @@ module tb_accumulator_top;
.DATA_WIDTH(DATA_WIDTH),
.ACCUM_WIDTH(ACCUM_WIDTH),
.N_MAX(N_MAX),
.PACKET_SIZE(PACKET_SIZE)
.PACKET_SIZE(PACKET_SIZE),
.RW_WIDTH(RW_WIDTH)
) dut (
.clk_in(clk_in),
.rst(rst),
@@ -62,7 +70,7 @@ module tb_accumulator_top;
.seq_num(seq_num),
.window_size(window_size),
.eth_clk_in(eth_clk_in),
.req_ready(req_ready),
.req_ready(1'b1),
.send_req(send_req),
.m_axis_tdata(m_axis_tdata),
.m_axis_tvalid(m_axis_tvalid),
@@ -85,14 +93,14 @@ module tb_accumulator_top;
integer i;
begin
packets_seen = 0;
current_packet_byte_count = 0;
current_packet_word_count = 0;
total_words_captured = 0;
for (i = 0; i < MAX_WORDS; i = i + 1) begin
expected_words[i] = '0;
captured_words_le[i] = '0;
captured_words_be[i] = '0;
end
for (i = 0; i < PACKET_SIZE; i = i + 1)
for (i = 0; i < PACKET_RD_WORDS; i = i + 1)
packet_bytes[i] = 8'h00;
end
endtask
@@ -184,7 +192,7 @@ module tb_accumulator_top;
smp_num = smp_num_i;
seq_num = seq_num_i;
window_size = window_size_i;
req_ready = 1'b1; // приемник готов заранее
req_ready = 1'b1; // ïðèåìíèê ãîòîâ çàðàíåå
exp_word_count = smp_num_i / window_size_i;
exp_packet_count = (exp_word_count + READ_BATCH_SIZE - 1) / READ_BATCH_SIZE;
@@ -219,7 +227,7 @@ module tb_accumulator_top;
end
timeout_cnt = 0;
while (packets_seen < exp_packet_count && timeout_cnt < 50 * PACKET_SIZE) begin
while (packets_seen < exp_packet_count && timeout_cnt < 50 * PACKET_RD_WORDS) begin
@(posedge eth_clk_in);
timeout_cnt = timeout_cnt + 1;
end
@@ -272,45 +280,37 @@ module tb_accumulator_top;
endtask
always @(posedge eth_clk_in) begin : CAPTURE_AXIS
integer idx;
logic [31:0] tmp_le;
logic [31:0] tmp_be;
if (rst) begin
current_packet_byte_count = 0;
end else if (m_axis_tvalid && m_axis_tready) begin
if (current_packet_byte_count < PACKET_SIZE)
packet_bytes[current_packet_byte_count] = m_axis_tdata;
current_packet_byte_count = current_packet_byte_count + 1;
current_packet_word_count <= 0;
total_words_captured <= 0;
end
else if (m_axis_tvalid && m_axis_tready) begin
// Ñîõðàíÿåì î÷åðåäíîå ñëîâî
if (total_words_captured < MAX_WORDS) begin
captured_words_le[total_words_captured] <= m_axis_tdata;
captured_words_be[total_words_captured] <= {
m_axis_tdata[7:0],
m_axis_tdata[15:8],
m_axis_tdata[23:16],
m_axis_tdata[31:24]
};
end
total_words_captured <= total_words_captured + 1;
current_packet_word_count <= current_packet_word_count + 1;
if (m_axis_tlast) begin
packets_seen = packets_seen + 1;
packets_seen <= packets_seen + 1;
if (current_packet_byte_count != PACKET_SIZE) begin
$display("[packet] ERROR: packet size=%0d expected=%0d", current_packet_byte_count, PACKET_SIZE);
total_errors = total_errors + 1;
if (current_packet_word_count + 1 != PACKET_RD_WORDS) begin
$display("[packet] ERROR: packet size=%0d expected=%0d",
current_packet_word_count + 1,
PACKET_RD_WORDS);
total_errors <= total_errors + 1;
end
for (idx = 0; idx < READ_BATCH_SIZE; idx = idx + 1) begin
tmp_le = {
packet_bytes[idx*4 + 3],
packet_bytes[idx*4 + 2],
packet_bytes[idx*4 + 1],
packet_bytes[idx*4 + 0]
};
tmp_be = {
packet_bytes[idx*4 + 0],
packet_bytes[idx*4 + 1],
packet_bytes[idx*4 + 2],
packet_bytes[idx*4 + 3]
};
if (total_words_captured + idx < MAX_WORDS) begin
captured_words_le[total_words_captured + idx] = tmp_le;
captured_words_be[total_words_captured + idx] = tmp_be;
end
end
total_words_captured = total_words_captured + READ_BATCH_SIZE;
current_packet_byte_count = 0;
current_packet_word_count <= 0;
end
end
end
+54 -42
View File
@@ -11,173 +11,185 @@
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="2,748,541.000 ns"></ZoomStartTime>
<ZoomEndTime time="2,749,382.001 ns"></ZoomEndTime>
<Cursor1Time time="2,749,045.000 ns"></Cursor1Time>
<ZoomStartTime time="0.000 ns"></ZoomStartTime>
<ZoomEndTime time="2,960.001 ns"></ZoomEndTime>
<Cursor1Time time="300.000 ns"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="556"></NameColumnWidth>
<ValueColumnWidth column_width="107"></ValueColumnWidth>
<NameColumnWidth column_width="539"></NameColumnWidth>
<ValueColumnWidth column_width="116"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="18" />
<wvobject type="logic" fp_name="/tb_accumulator_top/clk_in">
<wvobject fp_name="/tb_accumulator_top/clk_in" type="logic">
<obj_property name="ElementShortName">clk_in</obj_property>
<obj_property name="ObjectShortName">clk_in</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/eth_clk_in">
<wvobject fp_name="/tb_accumulator_top/eth_clk_in" type="logic">
<obj_property name="ElementShortName">eth_clk_in</obj_property>
<obj_property name="ObjectShortName">eth_clk_in</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/rst">
<wvobject fp_name="/tb_accumulator_top/rst" type="logic">
<obj_property name="ElementShortName">rst</obj_property>
<obj_property name="ObjectShortName">rst</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/s_axis_tdata">
<wvobject fp_name="/tb_accumulator_top/s_axis_tdata" type="array">
<obj_property name="ElementShortName">s_axis_tdata[11:0]</obj_property>
<obj_property name="ObjectShortName">s_axis_tdata[11:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/s_axis_tvalid">
<wvobject fp_name="/tb_accumulator_top/s_axis_tvalid" type="logic">
<obj_property name="ElementShortName">s_axis_tvalid</obj_property>
<obj_property name="ObjectShortName">s_axis_tvalid</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/start">
<wvobject fp_name="/tb_accumulator_top/start" type="logic">
<obj_property name="ElementShortName">start</obj_property>
<obj_property name="ObjectShortName">start</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/smp_num">
<wvobject fp_name="/tb_accumulator_top/smp_num" type="array">
<obj_property name="ElementShortName">smp_num[31:0]</obj_property>
<obj_property name="ObjectShortName">smp_num[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/seq_num">
<wvobject fp_name="/tb_accumulator_top/seq_num" type="array">
<obj_property name="ElementShortName">seq_num[15:0]</obj_property>
<obj_property name="ObjectShortName">seq_num[15:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/req_ready">
<wvobject fp_name="/tb_accumulator_top/req_ready" type="logic">
<obj_property name="ElementShortName">req_ready</obj_property>
<obj_property name="ObjectShortName">req_ready</obj_property>
<obj_property name="CustomSignalColor">#E0FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/send_req">
<wvobject fp_name="/tb_accumulator_top/send_req" type="logic">
<obj_property name="ElementShortName">send_req</obj_property>
<obj_property name="ObjectShortName">send_req</obj_property>
<obj_property name="CustomSignalColor">#E0FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/m_axis_tdata">
<wvobject fp_name="/tb_accumulator_top/m_axis_tdata" type="array">
<obj_property name="ElementShortName">m_axis_tdata[7:0]</obj_property>
<obj_property name="ObjectShortName">m_axis_tdata[7:0]</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/m_axis_tready">
<wvobject fp_name="/tb_accumulator_top/m_axis_tready" type="logic">
<obj_property name="ElementShortName">m_axis_tready</obj_property>
<obj_property name="ObjectShortName">m_axis_tready</obj_property>
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/m_axis_tlast">
<wvobject fp_name="/tb_accumulator_top/m_axis_tlast" type="logic">
<obj_property name="ElementShortName">m_axis_tlast</obj_property>
<obj_property name="ObjectShortName">m_axis_tlast</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/finish">
<wvobject fp_name="/tb_accumulator_top/finish" type="logic">
<obj_property name="ElementShortName">finish</obj_property>
<obj_property name="ObjectShortName">finish</obj_property>
<obj_property name="CustomSignalColor">#FAAFBE</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/batch_req">
<wvobject fp_name="/tb_accumulator_top/dut/batch_req" type="logic">
<obj_property name="ElementShortName">batch_req</obj_property>
<obj_property name="ObjectShortName">batch_req</obj_property>
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/readout_begin">
<wvobject fp_name="/tb_accumulator_top/dut/readout_begin" type="logic">
<obj_property name="ElementShortName">readout_begin</obj_property>
<obj_property name="ObjectShortName">readout_begin</obj_property>
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="group" fp_name="group25">
<wvobject fp_name="group25" type="group">
<obj_property name="label">acc</obj_property>
<obj_property name="DisplayName">label</obj_property>
<obj_property name="isExpanded"></obj_property>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/PACKET_SIZE">
<wvobject fp_name="/tb_accumulator_top/dut/accum_main/PACKET_SIZE" type="array">
<obj_property name="ElementShortName">PACKET_SIZE[31:0]</obj_property>
<obj_property name="ObjectShortName">PACKET_SIZE[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/READ_BATCH_SIZE">
<wvobject fp_name="/tb_accumulator_top/dut/accum_main/READ_BATCH_SIZE" type="array">
<obj_property name="ElementShortName">READ_BATCH_SIZE[31:0]</obj_property>
<obj_property name="ObjectShortName">READ_BATCH_SIZE[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/addrb">
<wvobject fp_name="/tb_accumulator_top/dut/accum_main/addrb" type="array">
<obj_property name="ElementShortName">addrb[15:0]</obj_property>
<obj_property name="ObjectShortName">addrb[15:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/wr_state">
<wvobject fp_name="/tb_accumulator_top/dut/accum_main/wr_state" type="array">
<obj_property name="ElementShortName">wr_state[3:0]</obj_property>
<obj_property name="ObjectShortName">wr_state[3:0]</obj_property>
</wvobject>
</wvobject>
<wvobject type="group" fp_name="group27">
<wvobject fp_name="group27" type="group">
<obj_property name="label">fifo</obj_property>
<obj_property name="DisplayName">label</obj_property>
<obj_property name="isExpanded"></obj_property>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/acc_din">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/acc_din" type="array">
<obj_property name="ElementShortName">acc_din[31:0]</obj_property>
<obj_property name="ObjectShortName">acc_din[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FF0080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/din_valid">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/din_valid" type="logic">
<obj_property name="ElementShortName">din_valid</obj_property>
<obj_property name="ObjectShortName">din_valid</obj_property>
<obj_property name="CustomSignalColor">#FF0080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/batch_req">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/batch_req" type="logic">
<obj_property name="ElementShortName">batch_req</obj_property>
<obj_property name="ObjectShortName">batch_req</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_state">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_state" type="array">
<obj_property name="ElementShortName">wr_state[2:0]</obj_property>
<obj_property name="ObjectShortName">wr_state[2:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/rd_state">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/rd_state" type="array">
<obj_property name="ElementShortName">rd_state[2:0]</obj_property>
<obj_property name="ObjectShortName">rd_state[2:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_unavail">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_unavail" type="logic">
<obj_property name="ElementShortName">wr_unavail</obj_property>
<obj_property name="ObjectShortName">wr_unavail</obj_property>
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_rst_busy">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_rst_busy" type="logic">
<obj_property name="ElementShortName">wr_rst_busy</obj_property>
<obj_property name="ObjectShortName">wr_rst_busy</obj_property>
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/empty">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/empty" type="logic">
<obj_property name="ElementShortName">empty</obj_property>
<obj_property name="ObjectShortName">empty</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/PROG_FULL_THRESH">
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/PROG_FULL_THRESH" type="array">
<obj_property name="ElementShortName">PROG_FULL_THRESH[31:0]</obj_property>
<obj_property name="ObjectShortName">PROG_FULL_THRESH[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/wr_data_count">
<obj_property name="ElementShortName">wr_data_count[9:0]</obj_property>
<obj_property name="ObjectShortName">wr_data_count[9:0]</obj_property>
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/wr_data_count" type="array">
<obj_property name="ElementShortName">wr_data_count[7:0]</obj_property>
<obj_property name="ObjectShortName">wr_data_count[7:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/rd_data_count">
<obj_property name="ElementShortName">rd_data_count[11:0]</obj_property>
<obj_property name="ObjectShortName">rd_data_count[11:0]</obj_property>
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/rd_data_count" type="array">
<obj_property name="ElementShortName">rd_data_count[7:0]</obj_property>
<obj_property name="ObjectShortName">rd_data_count[7:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/fifo_wr_en_r" type="logic">
<obj_property name="ElementShortName">fifo_wr_en_r</obj_property>
<obj_property name="ObjectShortName">fifo_wr_en_r</obj_property>
<obj_property name="CustomSignalColor">#FAAFBE</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_accumulator_top/dut/output_async_fifo/rd_en" type="logic">
<obj_property name="ElementShortName">rd_en</obj_property>
<obj_property name="ObjectShortName">rd_en</obj_property>
<obj_property name="CustomSignalColor">#FAAFBE</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
</wvobject>
</wave_config>