Livt packages

Livt.Bus

Version 2.0.1

Configurable Avalon, AXI4-Lite, and Wishbone memory-mapped masters, interfaces, bridges, and test components.

Published files (67)

tests/bridges/AvalonToAxi4LiteBridgeTest.lvt

namespace Livt.Bus.Tests.Bridges

using Livt.Bus.Avalon.Testing
using Livt.Bus.Axi4Lite.Testing
using Livt.Bus.Bridges

/**
 * Verifies Avalon-MM transactions converted to AXI4-Lite.
 */
@Test
component AvalonToAxi4LiteBridgeTest
{
	// Avalon-MM transaction source under test.
	upstream: AvalonTestMaster32

	// Bridge subject under test.
	bridge: AvalonToAxi4LiteBridge32

	// Configurable AXI4-Lite target.
	target: Axi4LiteTestSlave32

	/**
	 * Connects the Avalon source, bridge, and AXI4-Lite target.
	 */
	new()
	{
		this.upstream = new AvalonTestMaster32()
		this.bridge = new AvalonToAxi4LiteBridge32(this.upstream)
		this.target = new Axi4LiteTestSlave32(this.bridge)
	}

	/**
	 * Verifies delayed reads, masked writes, responses, and timeout translation.
	 */
	@Test
	fn ForwardsTransactionsAndResponses()
	{
		target.Clear()
		target.ConfigureDelays(2, 0, 2, 1, 2)
		var bridgeTimeout = this.context.TicksFor(10us)
		var upstreamTimeout = this.context.TicksFor(20us)
		bridge.SetTimeoutTicks(bridgeTimeout)
		upstream.SetTimeoutTicks(upstreamTimeout)
		assert bridge.GetTimeoutTicks() == bridgeTimeout
		assert upstream.TryWrite32(0x0C as uint, 0x12345678 as uint, 0b1111) == true
		assert upstream.TryWrite32(0x0C as uint, 0xAA00CC00 as uint, 0b1010) == true
		assert upstream.TryRead32(0x0C as uint) == true
		assert upstream.LastReadValue() == (0xAA34CC78 as uint)
		target.ConfigureResponses(0b10, 0b11)
		assert upstream.TryRead32(0x0C as uint) == true
		assert upstream.LastResponse() == 0b11

		target.ConfigureResponses(0b00, 0b00)
		bridge.SetTimeoutTicks(3 as uint)
		upstream.SetTimeoutTicks(10 as uint)

		// Each AXI channel can stall independently; every timeout must drain.
		target.ConfigureDelays(100, 0, 0, 0, 0)
		assert upstream.TryWrite32(0x10 as uint, 0x11111111 as uint, 0b1111) == true
		assert upstream.LastResponse() == AvalonToAxi4LiteBridge32.RESPONSE_SLVERR
		assert bridge.IsRecovering() == true
		Simulation.Wait(120)
		assert bridge.IsRecovering() == false

		target.ConfigureDelays(0, 100, 0, 0, 0)
		assert upstream.TryWrite32(0x10 as uint, 0x22222222 as uint, 0b1111) == true
		assert upstream.LastResponse() == AvalonToAxi4LiteBridge32.RESPONSE_SLVERR
		assert bridge.IsRecovering() == true
		Simulation.Wait(120)
		assert bridge.IsRecovering() == false

		target.ConfigureDelays(0, 0, 100, 0, 0)
		assert upstream.TryWrite32(0x10 as uint, 0x33333333 as uint, 0b1111) == true
		assert upstream.LastResponse() == AvalonToAxi4LiteBridge32.RESPONSE_SLVERR
		assert bridge.IsRecovering() == true
		Simulation.Wait(120)
		assert bridge.IsRecovering() == false

		target.ConfigureDelays(0, 0, 0, 100, 0)
		assert upstream.TryRead32(0x0C as uint) == true
		assert upstream.LastResponse() == AvalonToAxi4LiteBridge32.RESPONSE_SLVERR
		assert bridge.IsRecovering() == true
		Simulation.Wait(120)
		assert bridge.IsRecovering() == false

		target.ConfigureDelays(0, 0, 0, 0, 100)
		assert upstream.TryRead32(0x0C as uint) == true
		assert upstream.LastResponse() == AvalonToAxi4LiteBridge32.RESPONSE_SLVERR
		assert bridge.LastTimedOut() == true
		assert bridge.IsRecovering() == true
		Simulation.Wait(120)
		assert bridge.IsRecovering() == false

		target.ConfigureDelays(0, 0, 0, 0, 0)
		bridge.SetTimeoutTicks(10 as uint)
		upstream.SetTimeoutTicks(30 as uint)
		assert upstream.TryRead32(0x0C as uint) == true
		assert upstream.LastReadValue() == (0xAA34CC78 as uint)
		assert bridge.LastTimedOut() == false
	}
}