Livt packages

Livt.Base

Version 1.2.1

Foundational bit, array, string, conversion, formatting, and timing helpers for Livt hardware designs.

Published files (32)

tests/PeriodicTickProviderTest.lvt

namespace Livt.Base.Tests

using Livt.Timing

/**
 * Exercises PeriodicTickProvider with a shared fixture instance. Each scenario establishes
 * the inputs and state it needs.
 */
@Test
@Context(ClockFrequency = 100MHz)
component PeriodicTickProviderTest
{
	// Shared fixture instances, signals, and observation state.
	provider: PeriodicTickProvider
	oneMicrosecondProvider: PeriodicTickProvider1us
	oneMillisecondProvider: PeriodicTickProvider1ms
	tenMillisecondProvider: PeriodicTickProvider10ms
	hundredMillisecondProvider: PeriodicTickProvider100ms
	oneSecondProvider: PeriodicTickProvider1s

	// One-cycle output pulse when the configured interval elapses.
	tick: logic
	oneMicrosecondTick: logic
	oneMillisecondTick: logic
	tenMillisecondTick: logic
	hundredMillisecondTick: logic
	oneSecondTick: logic
	observedTicks: uint
	previousTick: logic
	backToBackPulse: bool

	/**
	 * Creates the shared fixture instances (PeriodicTickProvider, PeriodicTickProvider1us,
	 * PeriodicTickProvider1ms, PeriodicTickProvider10ms, PeriodicTickProvider100ms,
	 * PeriodicTickProvider1s). Tests initialize the state required by their scenario.
	 */
	new()
	{
		this.provider = new PeriodicTickProvider((4 as uint), this.tick)
		this.oneMicrosecondProvider = new PeriodicTickProvider1us(this.oneMicrosecondTick)
		this.oneMillisecondProvider = new PeriodicTickProvider1ms(this.oneMillisecondTick)
		this.tenMillisecondProvider = new PeriodicTickProvider10ms(this.tenMillisecondTick)
		this.hundredMillisecondProvider = new PeriodicTickProvider100ms(this.hundredMillisecondTick)
		this.oneSecondProvider = new PeriodicTickProvider1s(this.oneSecondTick)
		this.observedTicks = 0
		this.previousTick = 0b0
		this.backToBackPulse = false
	}

	/**
	 * Counts observed tick pulses and records adjacent-cycle pulses for the timing assertions.
	 */
	process Observe()
	{
		if (this.tick == 0b1) {
			this.observedTicks = this.observedTicks + 1

			if (this.previousTick == 0b1) {
				this.backToBackPulse = true
			}
		}

		this.previousTick = this.tick
	}

	/**
	 * Checks that the component generates periodic one cycle pulses.
	 */
	@Test
	fn GeneratesPeriodicOneCyclePulses()
	{
		assert this.provider.GetPeriodTicks() == (4 as uint)

		Simulation.Wait(500)

		assert this.observedTicks >= (5 as uint)
		assert this.backToBackPulse == false
	}

	/**
	 * Checks that the component derives common periods at100 m hz.
	 */
	@Test
	fn DerivesCommonPeriodsAt100MHz()
	{
		assert this.oneMicrosecondProvider.GetPeriodTicks() == (100 as uint)
		assert this.oneMillisecondProvider.GetPeriodTicks() == (100000 as uint)
		assert this.tenMillisecondProvider.GetPeriodTicks() == (1000000 as uint)
		assert this.hundredMillisecondProvider.GetPeriodTicks() == (10000000 as uint)
		assert this.oneSecondProvider.GetPeriodTicks() == (100000000 as uint)
	}
}

/**
 * Exercises PeriodicTickProvider50MHz with a shared fixture instance. Each scenario
 * establishes the inputs and state it needs.
 */
@Test
@Context(ClockFrequency = 50MHz)
component PeriodicTickProvider50MHzTest
{
	// Shared fixture instances, signals, and observation state.
	oneMicrosecondProvider: PeriodicTickProvider1us
	oneMillisecondProvider: PeriodicTickProvider1ms
	oneSecondProvider: PeriodicTickProvider1s
	oneMicrosecondTick: logic
	oneMillisecondTick: logic
	oneSecondTick: logic

	/**
	 * Creates the shared fixture instances (PeriodicTickProvider1us, PeriodicTickProvider1ms,
	 * PeriodicTickProvider1s). Tests initialize the state required by their scenario.
	 */
	new()
	{
		this.oneMicrosecondProvider = new PeriodicTickProvider1us(this.oneMicrosecondTick)
		this.oneMillisecondProvider = new PeriodicTickProvider1ms(this.oneMillisecondTick)
		this.oneSecondProvider = new PeriodicTickProvider1s(this.oneSecondTick)
	}

	/**
	 * Checks that the component derives periods from assigned context.
	 */
	@Test
	fn DerivesPeriodsFromAssignedContext()
	{
		assert this.oneMicrosecondProvider.GetPeriodTicks() == (50 as uint)
		assert this.oneMillisecondProvider.GetPeriodTicks() == (50000 as uint)
		assert this.oneSecondProvider.GetPeriodTicks() == (50000000 as uint)
	}
}