dma ram test

This commit is contained in:
otroubi
2026-07-27 19:24:47 +03:00
parent ee83bcbb9e
commit 95540713e0
4 changed files with 33 additions and 364 deletions
@@ -14,6 +14,8 @@ VERILOG_SOURCES += $(LIBS_DIR)/axi/axi_reg/axi4l_reg_map.sv
VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_dma_rd.v VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_dma_rd.v
VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_dma_wr.v VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_dma_wr.v
VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_dma.v VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_dma.v
VERILOG_SOURCES += $(LIBS_DIR)/external/verilog-axi/rtl/axi_ram.v
VERILOG_SOURCES += $(RTL_DIR)/axi_ram_wrapper.sv
VERILOG_SOURCES += $(RTL_DIR)/controller.sv VERILOG_SOURCES += $(RTL_DIR)/controller.sv
VERILOG_SOURCES += $(RTL_DIR)/dma_controller.sv VERILOG_SOURCES += $(RTL_DIR)/dma_controller.sv
VERILOG_SOURCES += $(RTL_DIR)/shaper_axis_desc.sv VERILOG_SOURCES += $(RTL_DIR)/shaper_axis_desc.sv
@@ -1,236 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="tb_control_behav.wdb" id="1">
<top_modules>
<top_module name="glbl" />
<top_module name="tb_control" />
</top_modules>
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="160.614 ns"></ZoomStartTime>
<ZoomEndTime time="1,564.737 ns"></ZoomEndTime>
<Cursor1Time time="1,330.716 ns"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="479"></NameColumnWidth>
<ValueColumnWidth column_width="116"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="34" />
<wvobject fp_name="/tb_control/dac_clk_in" type="logic">
<obj_property name="ElementShortName">dac_clk_in</obj_property>
<obj_property name="ObjectShortName">dac_clk_in</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_clk_in" type="logic">
<obj_property name="ElementShortName">adc_clk_in</obj_property>
<obj_property name="ObjectShortName">adc_clk_in</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/rst_n" type="logic">
<obj_property name="ElementShortName">rst_n</obj_property>
<obj_property name="ObjectShortName">rst_n</obj_property>
<obj_property name="CustomSignalColor">#800080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/rst_soft" type="logic">
<obj_property name="ElementShortName">rst_soft</obj_property>
<obj_property name="ObjectShortName">rst_soft</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/start" type="logic">
<obj_property name="ElementShortName">start</obj_property>
<obj_property name="ObjectShortName">start</obj_property>
<obj_property name="CustomSignalColor">#E0FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/adc_start_pulse" type="logic">
<obj_property name="ElementShortName">adc_start_pulse</obj_property>
<obj_property name="ObjectShortName">adc_start_pulse</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/dac_start_pulse" type="logic">
<obj_property name="ElementShortName">dac_start_pulse</obj_property>
<obj_property name="ObjectShortName">dac_start_pulse</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/busy" type="logic">
<obj_property name="ElementShortName">busy</obj_property>
<obj_property name="ObjectShortName">busy</obj_property>
<obj_property name="CustomSignalColor">#E0FFFF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/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 fp_name="/tb_control/dut/finish_pulse" type="logic">
<obj_property name="ElementShortName">finish_pulse</obj_property>
<obj_property name="ObjectShortName">finish_pulse</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/cfg_bus_valid" type="logic">
<obj_property name="ElementShortName">cfg_bus_valid</obj_property>
<obj_property name="ObjectShortName">cfg_bus_valid</obj_property>
<obj_property name="CustomSignalColor">#FF0080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/cfg_bus_input" type="array">
<obj_property name="ElementShortName">cfg_bus_input[159:0]</obj_property>
<obj_property name="ObjectShortName">cfg_bus_input[159:0]</obj_property>
<obj_property name="CustomSignalColor">#FF0080</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_pulse_width" type="array">
<obj_property name="ElementShortName">dac_pulse_width[31:0]</obj_property>
<obj_property name="ObjectShortName">dac_pulse_width[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_pulse_period" type="array">
<obj_property name="ElementShortName">dac_pulse_period[31:0]</obj_property>
<obj_property name="ObjectShortName">dac_pulse_period[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_pulse_height" type="array">
<obj_property name="ElementShortName">dac_pulse_height[11:0]</obj_property>
<obj_property name="ObjectShortName">dac_pulse_height[11:0]</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_pulse_num" type="array">
<obj_property name="ElementShortName">dac_pulse_num[15:0]</obj_property>
<obj_property name="ObjectShortName">dac_pulse_num[15:0]</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_pulse_period" type="array">
<obj_property name="ElementShortName">adc_pulse_period[31:0]</obj_property>
<obj_property name="ObjectShortName">adc_pulse_period[31:0]</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_pulse_num" type="array">
<obj_property name="ElementShortName">adc_pulse_num[15:0]</obj_property>
<obj_property name="ObjectShortName">adc_pulse_num[15:0]</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_window_size" type="array">
<obj_property name="ElementShortName">adc_window_size[31:0]</obj_property>
<obj_property name="ObjectShortName">adc_window_size[31:0]</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_start" type="logic">
<obj_property name="ElementShortName">dac_start</obj_property>
<obj_property name="ObjectShortName">dac_start</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_start" type="logic">
<obj_property name="ElementShortName">adc_start</obj_property>
<obj_property name="ObjectShortName">adc_start</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_rst" type="logic">
<obj_property name="ElementShortName">dac_rst</obj_property>
<obj_property name="ObjectShortName">dac_rst</obj_property>
<obj_property name="CustomSignalColor">#FFA500</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_rst" type="logic">
<obj_property name="ElementShortName">adc_rst</obj_property>
<obj_property name="ObjectShortName">adc_rst</obj_property>
</wvobject>
<wvobject fp_name="group499" type="group">
<obj_property name="label">tb signals</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/tb_control/dac_rst_count" type="array">
<obj_property name="ElementShortName">dac_rst_count[31:0]</obj_property>
<obj_property name="ObjectShortName">dac_rst_count[31:0]</obj_property>
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_rst_count" type="array">
<obj_property name="ElementShortName">adc_rst_count[31:0]</obj_property>
<obj_property name="ObjectShortName">adc_rst_count[31:0]</obj_property>
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dac_start_count" type="array">
<obj_property name="ElementShortName">dac_start_count[31:0]</obj_property>
<obj_property name="ObjectShortName">dac_start_count[31:0]</obj_property>
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/adc_start_count" type="array">
<obj_property name="ElementShortName">adc_start_count[31:0]</obj_property>
<obj_property name="ObjectShortName">adc_start_count[31:0]</obj_property>
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_req_toggle_adc" type="logic">
<obj_property name="ElementShortName">cfg_req_toggle_adc</obj_property>
<obj_property name="ObjectShortName">cfg_req_toggle_adc</obj_property>
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_req_toggle_dac" type="logic">
<obj_property name="ElementShortName">cfg_req_toggle_dac</obj_property>
<obj_property name="ObjectShortName">cfg_req_toggle_dac</obj_property>
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_ack_toggle_adc" type="logic">
<obj_property name="ElementShortName">cfg_ack_toggle_adc</obj_property>
<obj_property name="ObjectShortName">cfg_ack_toggle_adc</obj_property>
<obj_property name="CustomSignalColor">#FF00FF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_ack_toggle_dac" type="logic">
<obj_property name="ElementShortName">cfg_ack_toggle_dac</obj_property>
<obj_property name="ObjectShortName">cfg_ack_toggle_dac</obj_property>
<obj_property name="CustomSignalColor">#FF00FF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_wait_adc_ack" type="logic">
<obj_property name="ElementShortName">cfg_wait_adc_ack</obj_property>
<obj_property name="ObjectShortName">cfg_wait_adc_ack</obj_property>
<obj_property name="CustomSignalColor">#0000FF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_wait_dac_ack" type="logic">
<obj_property name="ElementShortName">cfg_wait_dac_ack</obj_property>
<obj_property name="ObjectShortName">cfg_wait_dac_ack</obj_property>
<obj_property name="CustomSignalColor">#0000FF</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_req_pulse_adc" type="logic">
<obj_property name="ElementShortName">cfg_req_pulse_adc</obj_property>
<obj_property name="ObjectShortName">cfg_req_pulse_adc</obj_property>
<obj_property name="CustomSignalColor">#808000</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_req_pulse_dac" type="logic">
<obj_property name="ElementShortName">cfg_req_pulse_dac</obj_property>
<obj_property name="ObjectShortName">cfg_req_pulse_dac</obj_property>
<obj_property name="CustomSignalColor">#808000</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_ack_pulse_adc" type="logic">
<obj_property name="ElementShortName">cfg_ack_pulse_adc</obj_property>
<obj_property name="ObjectShortName">cfg_ack_pulse_adc</obj_property>
<obj_property name="CustomSignalColor">#DCDCDC</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
<wvobject fp_name="/tb_control/dut/cfg_ack_pulse_dac" type="logic">
<obj_property name="ElementShortName">cfg_ack_pulse_dac</obj_property>
<obj_property name="ObjectShortName">cfg_ack_pulse_dac</obj_property>
<obj_property name="CustomSignalColor">#DCDCDC</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
</wvobject>
</wave_config>
@@ -238,79 +238,6 @@ axis_flat_to_if #(
.m_axis(dma_write_data) .m_axis(dma_write_data)
); );
// AXI4 MASTER DMA
axi4_if #(
.ADDR_W(dma_reg_pkg::AXI_ADDR_WIDTH),
.DATA_W(AXI_DATA_WIDTH),
.ID_W (AXI_ID_WIDTH),
.USER_W(AXI_USER_WIDTH)
) m_axi (
.aclk(ctrl_clk),
.aresetn(rst_n)
);
logic [AXI_USER_WIDTH-1:0] unused_awuser;
logic [AXI_USER_WIDTH-1:0] unused_wuser;
logic [AXI_USER_WIDTH-1:0] unused_aruser;
axi4_if_to_flat #(
.ADDR_W (dma_reg_pkg::AXI_ADDR_WIDTH),
.DATA_W (AXI_DATA_WIDTH),
.ID_W (AXI_ID_WIDTH),
.USER_W (AXI_USER_WIDTH)
) u_axi_if_to_flat (
.s_axi(m_axi),
.m_axi_awid (m_axi_awid),
.m_axi_awaddr (m_axi_awaddr),
.m_axi_awlen (m_axi_awlen),
.m_axi_awsize (m_axi_awsize),
.m_axi_awburst (m_axi_awburst),
.m_axi_awlock (m_axi_awlock),
.m_axi_awcache (m_axi_awcache),
.m_axi_awprot (m_axi_awprot),
.m_axi_awqos (),
.m_axi_awregion(),
.m_axi_awuser (unused_awuser),
.m_axi_awvalid (m_axi_awvalid),
.m_axi_awready (m_axi_awready),
.m_axi_wdata (m_axi_wdata),
.m_axi_wstrb (m_axi_wstrb),
.m_axi_wlast (m_axi_wlast),
.m_axi_wuser (unused_wuser),
.m_axi_wvalid (m_axi_wvalid),
.m_axi_wready (m_axi_wready),
.m_axi_bid (m_axi_bid),
.m_axi_bresp (m_axi_bresp),
.m_axi_buser ({AXI_USER_WIDTH{1'b0}}),
.m_axi_bvalid (m_axi_bvalid),
.m_axi_bready (m_axi_bready),
.m_axi_arid (m_axi_arid),
.m_axi_araddr (m_axi_araddr),
.m_axi_arlen (m_axi_arlen),
.m_axi_arsize (m_axi_arsize),
.m_axi_arburst (m_axi_arburst),
.m_axi_arlock (m_axi_arlock),
.m_axi_arcache (m_axi_arcache),
.m_axi_arprot (m_axi_arprot),
.m_axi_arqos (),
.m_axi_arregion(),
.m_axi_aruser (unused_aruser),
.m_axi_arvalid (m_axi_arvalid),
.m_axi_arready (m_axi_arready),
.m_axi_rid (m_axi_rid),
.m_axi_rdata (m_axi_rdata),
.m_axi_rresp (m_axi_rresp),
.m_axi_rlast (m_axi_rlast),
.m_axi_ruser ({AXI_USER_WIDTH{1'b0}}),
.m_axi_rvalid (m_axi_rvalid),
.m_axi_rready (m_axi_rready)
);
// Controller ADC/DAC outputs. // Controller ADC/DAC outputs.
@@ -365,9 +292,7 @@ axi4_if_to_flat #(
.adc_rst(adc_rst), .adc_rst(adc_rst),
.m_axis_read_data(dma_read_data), .m_axis_read_data(dma_read_data),
.s_axis_write_data(dma_write_data), .s_axis_write_data(dma_write_data)
.m_axi(m_axi)
); );
endmodule : tb_controller_wrapper_axil endmodule : tb_controller_wrapper_axil
@@ -1,9 +1,8 @@
import cocotb import cocotb
from cocotb.clock import Clock from cocotb.clock import Clock
from cocotb.handle import Immediate
from cocotb.triggers import RisingEdge from cocotb.triggers import RisingEdge
from cocotbext.axi import AxiLiteBus, AxiLiteMaster from cocotbext.axi import AxiLiteBus, AxiLiteMaster
from cocotbext.axi import AxiBus, AxiRam, AxiStreamBus, AxiStreamSource, AxiStreamSink from cocotbext.axi import AxiBus, AxiRam, AxiStreamBus, AxiStreamSource, AxiStreamSink, AxiStreamFrame
# Register indexes from axi4l_reg_map_controller_pkg.sv # Register indexes from axi4l_reg_map_controller_pkg.sv
@@ -140,77 +139,56 @@ async def simple_controller_start_check(dut):
await RisingEdge(dut.dac_start) await RisingEdge(dut.dac_start)
@cocotb.test() @cocotb.test()
async def test_dma_write(dut): async def simple_dma_mem_to_mem(dut):
tb = TB(dut) tb = TB(dut)
await tb.reset() await tb.reset()
data = bytes(range(64)) SRC_ADDR = 0x1000
LENGTH = 8
#write data into memory tx_data = bytes([ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 ])
await tb.write_reg(REG_DESC_WRITE_ADDR, 0x1000) ## write part
await tb.write_reg(REG_DESC_WRITE_LEN_AND_TAG, 64)
await tb.write_reg(REG_DESC_WRITE_ADDR, SRC_ADDR)
await tb.write_reg(REG_DESC_WRITE_LEN_AND_TAG, LENGTH)
await tb.write_reg(REG_CONTROL, 1 << CTRL_SEND_DESC_WRITE) await tb.write_reg(REG_CONTROL, 1 << CTRL_SEND_DESC_WRITE)
await RisingEdge(dut.ctrl_clk)
cocotb.start_soon(tb.axis_source.send(data))
for _ in range(200): await tb.axis_source.send(AxiStreamFrame(tx_data))
await tb.write_reg( REG_CONTROL, 1 << CTRL_TAKE_STATUS_WRITE)
for _ in range(20):
await RisingEdge(dut.ctrl_clk) await RisingEdge(dut.ctrl_clk)
status = await tb.read_reg( REG_STATUS_WRITE_LEN) await tb.write_reg(REG_CONTROL, 1 << CTRL_TAKE_STATUS_WRITE)
if status == 64:
break for _ in range(10):
await RisingEdge(dut.ctrl_clk)
else:
assert False, "DMA timeout"
assert await tb.read_reg(REG_STATUS_WRITE_CONFIG) == 0
assert await tb.read_reg(REG_STATUS_WRITE_LEN) == 0x8
mem = await tb.mem.read( 0x1000, 64) ## read part
assert mem == data
@cocotb.test() await tb.write_reg(REG_DESC_READ_ADDR, SRC_ADDR)
async def test_dma_read(dut): await tb.write_reg(REG_DESC_READ_LEN, LENGTH)
tb = TB(dut) await tb.write_reg(REG_DESC_READ_CONFIG, 0x0000_0001)
await tb.reset()
data = bytes(range(64)) await tb.write_reg(REG_CONTROL, 1 << CTRL_SEND_DESC_READ)
#read data from memory rx_frame = await tb.axis_sink.recv()
await tb.mem.write( 0x2000, data) for _ in range(20):
await RisingEdge(dut.ctrl_clk)
await tb.write_reg( REG_DESC_READ_ADDR, 0x2000)
await tb.write_reg( REG_DESC_READ_LEN, 64)
await tb.write_reg( REG_DESC_READ_CONFIG, 1)
await tb.write_reg( REG_CONTROL, 1 << CTRL_SEND_DESC_READ)
frame = await tb.axis_sink.recv()
assert frame.data == data
await tb.write_reg(
REG_CONTROL,
1 << CTRL_TAKE_STATUS_READ
)
for _ in range(100):
status = await tb.read_reg(
REG_READ_STATUS
)
if status != 0:
break
await tb.write_reg(REG_CONTROL, 1 << CTRL_TAKE_STATUS_READ)
for _ in range(10):
await RisingEdge(dut.ctrl_clk) await RisingEdge(dut.ctrl_clk)
else:
assert False, "DMA read status timeout" assert await tb.read_reg(REG_READ_STATUS) == 0x1
assert bytes(rx_frame) == tx_data