Files
simulation_core/tests/peripherals/AndesATCWDT200_Watchdog.robot

413 lines
17 KiB
Plaintext

*** Settings ***
Test Setup Create Machine
Library ${CURDIR}/AndesATCWDT200_Watchdog-helpers.py
*** Variables ***
${PLATFORM_PATH} @platforms/cpus/egis_et171.repl
${CORE_0_PC} 0x80000000
# Register offsets
${IdAndRevision} 0x00
${Reserved} 0x04
${Control} 0x10
${Restart} 0x14
${WriteEnable} 0x18
${Status} 0x1C
# Control register flags
${SystemResetEnableBit} 3
${InterruptEnableBit} 2
${EnableBit} 0
# Status register flags
${InterruptExpired} 0
# Magic numbers
${ATCWDT200_WP_NUM} 0x5AA5 # for Write Protection
${ATCWDT200_RESTART_NUM} 0xCAFE # for restarting the watchdog timer
*** Keywords ***
Create Machine
Execute Command mach create
Execute Command machine LoadPlatformDescription ${PLATFORM_PATH}
# Have the core stuck in an infinite loop.
Execute Command cpu0 PC ${CORE_0_PC}
Execute Command cpu0 AssembleBlock ${CORE_0_PC} "j 0"
Create Log Tester timeout=0 defaultPauseEmulation=True
Execute Command logLevel 0 watchdog
Read Watchdog Byte At ${offset}
${value}= Execute Command watchdog ReadByteUsingDoubleWord ${offset}
[return] ${value.strip()}
Write Watchdog Word ${value} To ${offset}
Execute Command watchdog WriteWordUsingDoubleWord ${offset} ${value}
Write To ${offset} Is ${result:(Ignored|Allowed)}
[Arguments] ${value}=0xAD
${initial_value}= Read Watchdog Byte At ${offset}
Execute Command watchdog WriteByteUsingDoubleWord ${offset} ${value}
${value}= Read Watchdog Byte At ${offset}
IF '${result}' == 'Ignored'
Should Be Equal As Integers
... ${value}
... ${initial_value}
... Register should remain unchanged, but it changed from ${initial_value} to ${value}
ELSE
Should Not Be Equal As Integers
... ${value}
... ${initial_value}
... Register should change, but it did not: ${value}
END
Set Watchdog Flag At Bit ${bit} In ${offset} To ${value:(0|1)}
${current_value}= Execute Command watchdog ReadDoubleWord ${offset}
${mask}= Set Variable ${{ 1 << ${bit} }}
IF '${value}' == '0'
${negated_mask}= Set Variable ${{ ~${mask} }}
${new_value}= Set Variable ${{ ${current_value.strip()} & ${negated_mask} }}
ELSE
${new_value}= Set Variable ${{ ${current_value.strip()} | ${mask} }}
END
Execute Command watchdog WriteDoubleWord ${offset} ${new_value}
Read Watchdog Flag At Bit ${bit} In ${offset}
${current_value}= Execute Command watchdog ReadDoubleWord ${offset}
${mask}= Set Variable ${{ 1 << ${bit} }}
${flag_value}= Set Variable ${{ ${current_value.strip()} & ${mask} }}
[return] ${flag_value}
Enable Watchdog Timer
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Set Watchdog Flag At Bit ${EnableBit} In ${Control} To 1
Enable Watchdog Interrupt
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Set Watchdog Flag At Bit ${InterruptEnableBit} In ${Control} To 1
Disable Watchdog Interrupt
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Set Watchdog Flag At Bit ${InterruptEnableBit} In ${Control} To 0
Enable Watchdog System Reset
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Set Watchdog Flag At Bit ${SystemResetEnableBit} In ${Control} To 1
Restart Watchdog
[Arguments] ${restart_value}=${ATCWDT200_RESTART_NUM}
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Write Watchdog Word ${restart_value} To ${Restart}
Watchdog IRQ Should Be ${expected_state:(High|Low)}
[Arguments] ${message}=
${is_signal_set}= Execute Command watchdog IRQ IsSet
${actual_state}= Set Variable If '${is_signal_set.strip()}' == 'True'
... High
... Low
Should Be Equal
... ${actual_state}
... ${expected_state}
... ${message} IRQ should be ${expected_state}, but it was ${actual_state}
Get Interrupt Timeout
${control}= Execute Command watchdog ReadDoubleWord ${Control}
${frequency}= Execute Command syscon APBClockFrequency
${seconds}= Get Interrupt Timeout Seconds ${control} ${frequency}
Log To Console interrupt timeout is ${seconds}s
[return] ${seconds}
Wait For Interrupt Timeout
${seconds}= Get Interrupt Timeout
Execute Command emulation RunFor "${seconds}s"
Wait For Reset Timeout
${control}= Execute Command watchdog ReadDoubleWord ${Control}
${frequency}= Execute Command syscon APBClockFrequency
${seconds}= Get Reset Timeout Seconds ${control} ${frequency}
Log To Console reset timeout is ${seconds}s
Execute Command emulation RunFor "${seconds}s"
Watchdog IRQ Should Initially Be ${initial_value:(High|Low)} And After Timeout Be ${final_value:(High|Low)}
Watchdog IRQ Should Be ${initial_value} Initially,
Wait For Interrupt Timeout
Watchdog IRQ Should Be ${final_value} After timeout,
Watchdog System Reset Should ${triggered:(Be|Not Be)} Triggered
IF '${triggered}' == 'Be'
Wait For Log Entry Reset timer elapsed
ELSE
Should Not Be In Log Reset timer elapsed
END
Watchdog System Reset Should Initially ${initial_value:(Be|Not Be)} Triggered And After Timeout ${final_value:(Be|Not Be)} Triggered
Watchdog System Reset Should ${initial_value} Triggered
Wait For Reset Timeout
Watchdog System Reset Should ${final_value} Triggered
Write ${value} To Restart Register Periodically
# Watchdog interrupt is disabled by default, so we have to enable it.
Enable Watchdog Interrupt
# Watchdog timer is disabled by default, so enable it.
Enable Watchdog Timer
# Watchdog interrupt should not be high initially.
Watchdog IRQ Should Be Low
${interrupt_timeout_seconds}= Get Interrupt Timeout
# A duration that's small enough to not elapse the timer,
# but big enough that several steps of this size _will_ elapse the timer.
${small_step}= Evaluate ${interrupt_timeout_seconds}/3
# Round it to avoid infinite decimals.
${small_step_rounded}= Round To N Significant Digits ${small_step} 3
# Restart the watchdog periodically, so as to not trigger the interrupt.
Execute Command emulation RunFor "${small_step_rounded}s"
Restart Watchdog ${value}
Execute Command emulation RunFor "${small_step_rounded}s"
Restart Watchdog ${value}
Execute Command emulation RunFor "${small_step_rounded}s"
Interrupt Status Register Flag Matches IRQ Signal
${interrupt_flag_value}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
${interrupt_flag}= Set Variable If '${interrupt_flag_value}' == '0'
... Low
... High
${is_signal_set}= Execute Command watchdog IRQ IsSet
${interrupt_signal}= Set Variable If '${is_signal_set.strip()}' == 'False'
... Low
... High
Should Be Equal ${interrupt_flag} ${interrupt_signal} Expected interrupt flag (${interrupt_flag}) and signal (${interrupt_signal}) to match
*** Test Cases ***
Write To Read-Only ID And Revision Register Is Ignored
Write To ${IdAndRevision} Is Ignored
Write To Write-Protected Control Register Is Ignored
Write To ${Control} Is Ignored
Write To Write-Protected Restart Register Is Ignored
Write To ${Restart} Is Ignored
Write To Write-Protected Control Register Is Allowed After Write-Enable
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Write To ${Control} Is Allowed
Consecutive Writes To Write-Protected Control Register Is Ignored After Write-Enable
Write Watchdog Word ${ATCWDT200_WP_NUM} To ${WriteEnable}
Write To ${Control} Is Allowed
Write To ${Control} Is Ignored value=0xDE
Write To ${Control} Is Ignored value=0xFA
Interrupt Timer Fires After Default Interval
# Watchdog interrupt is disabled by default, so we have to enable it.
Enable Watchdog Interrupt
# Watchdog timer is disabled by default, so enable it.
Enable Watchdog Timer
Watchdog IRQ Should Initially Be Low And After Timeout Be High
Interrupt Timer Only Fires Once
# Watchdog interrupt is disabled by default, so we have to enable it.
Enable Watchdog Interrupt
# Watchdog timer is disabled by default, so enable it.
Enable Watchdog Timer
# Timer should fire once.
Wait For Interrupt Timeout
Wait For Log Entry Interrupt timer elapsed
# Timer should not fire again.
Wait For Interrupt Timeout
Should Not Be In Log Interrupt timer elapsed
Interrupt Signal Does Not Fire When Interrupt Disabled
# Watchdog interrupt is disabled by default, so we don't have to disable it.
# Watchdog timer is disabled by default, so enable it.
Enable Watchdog Timer
Watchdog IRQ Should Initially Be Low And After Timeout Be Low
Interrupt Timer Does Not Fire When Watchdog Disabled
# Watchdog interrupt is disabled by default, so we have to enable it.
Enable Watchdog Interrupt
# Watchdog timer is disabled by default, so we don't have to disable it.
Watchdog IRQ Should Initially Be Low And After Timeout Be Low
Reset Timer Does Not Fire When Watchdog Disabled
Enable Watchdog Interrupt
Enable Watchdog System Reset
# Watchdog timer is disabled by default, so we don't have to disable it.
Watchdog IRQ Should Initially Be Low And After Timeout Be Low
Watchdog System Reset Should Initially Not Be Triggered And After Timeout Not Be Triggered
Reset Timer Fires When Interrupt Signal Disabled
# Watchdog interrupt is disabled by default, so we don't have to disable it.
Enable Watchdog System Reset
Enable Watchdog Timer
Watchdog IRQ Should Initially Be Low And After Timeout Be Low
Watchdog System Reset Should Initially Not Be Triggered And After Timeout Be Triggered
Reset Timer Does Not Fire When Reset Signal Disabled
# Watchdog reset signal is disabled by default, so we don't have to disable it.
Enable Watchdog Timer
Watchdog IRQ Should Initially Be Low And After Timeout Be Low
Watchdog System Reset Should Initially Not Be Triggered And After Timeout Not Be Triggered
Write To Restart Register Restarts Interrupt Timer
Write ${ATCWDT200_RESTART_NUM} To Restart Register Periodically
# Watchdog interrupt should not have been triggered, due to the restarting.
Watchdog IRQ Should Be Low
Writing Invalid Value To Restart Register Does Not Restart Interrupt Timer
Write 0xdead To Restart Register Periodically
# Watchdog interrupt should still have been triggered, as the restarting was invalidly done.
Watchdog IRQ Should Be High
Write To Restart Register Cancels System Reset Timer
# Watchdog interrupt is disabled by default, so we have to enable it.
Enable Watchdog Interrupt
# Watchdog timer is disabled by default, so enable it.
Enable Watchdog Timer
# Let the interrupt timer elapse, in order to start the reset timer.
# But don't wait long enough that the reset timer elapses.
Wait For Interrupt Timeout
# Interrupt should have now been triggered, starting the reset timer.
Watchdog IRQ Should Be High
# Disable the interrupt timer. We don't want it to elapse again,
# we're just interested in the reset timer.
Disable Watchdog Interrupt
# Reset timer should not have elapsed yet.
Watchdog System Reset Should Not Be Triggered
# Now, send restart signal in order to cancel the reset timer.
Restart Watchdog
# Let enough time pass for the reset timer to elapse, if it wasn't cancelled as it should have been.
Wait For Reset Timeout
# Watchdog system reset should not have been triggered, due to the restarting cancelling the timer.
Watchdog System Reset Should Not Be Triggered
Reset Signal Activates After Interrupt Activates
Enable Watchdog Interrupt
Enable Watchdog System Reset
Enable Watchdog Timer
# Let the interrupt timer elapse first.
Watchdog IRQ Should Initially Be Low And After Timeout Be High
# Then, let the system reset timer elapse.
Watchdog System Reset Should Initially Not Be Triggered And After Timeout Be Triggered
Reset Does Not Trigger When Disabled
Enable Watchdog Interrupt
Enable Watchdog Timer
# Let the interrupt timer elapse.
Watchdog IRQ Should Initially Be Low And After Timeout Be High
# Reset timer shouldn't elapse.
Watchdog System Reset Should Initially Not Be Triggered And After Timeout Not Be Triggered
Interrupt Status Register Flag Should Always Match Interrupt Signal
Enable Watchdog Interrupt
Enable Watchdog Timer
# Initially, both should be low.
Interrupt Status Register Flag Matches IRQ Signal
# Let interrupt timer elapse...
Wait For Interrupt Timeout
# After the timeout, they should both be high.
Interrupt Status Register Flag Matches IRQ Signal
Writing 1 To Interrupt Status Register Flag Should Clear It
Enable Watchdog Interrupt
Enable Watchdog Timer
# Flag should initially be unset.
${interrupt_flag}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
Should Be Equal As Integers ${interrupt_flag} 0 Interrupt flag should be unset initially
# Let interrupt timer elapse...
Wait For Interrupt Timeout
# Flag should now be set.
${interrupt_flag}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
Should Be Equal As Integers ${interrupt_flag} 1 Interrupt flag should be unset initially
# Write 1 to the flag to clear it.
Set Watchdog Flag At Bit ${InterruptExpired} In ${Status} To 1
# Flag should now be unset.
${interrupt_flag}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
Should Be Equal As Integers ${interrupt_flag} 0 Interrupt flag should have been unset by the write
Writing 0 To Interrupt Status Register Flag Should Do Nothing
Enable Watchdog Interrupt
Enable Watchdog Timer
# Flag should initially be unset.
${interrupt_flag}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
Should Be Equal As Integers ${interrupt_flag} 0 Interrupt flag should be unset initially
# Let interrupt timer elapse...
Wait For Interrupt Timeout
# Flag should now be set.
${interrupt_flag}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
Should Be Equal As Integers ${interrupt_flag} 1 Interrupt flag should be unset initially
# Write 0 to the flag.
Set Watchdog Flag At Bit ${InterruptExpired} In ${Status} To 0
# Flag should still be set.
${interrupt_flag}= Read Watchdog Flag At Bit ${InterruptExpired} In ${Status}
Should Be Equal As Integers ${interrupt_flag} 1 Interrupt flag should remain unchanged after the write
Interrupt Timer Fires Again After Status Is Cleared
# Watchdog interrupt is disabled by default, so we have to enable it.
Enable Watchdog Interrupt
# Watchdog timer is disabled by default, so enable it.
Enable Watchdog Timer
# Timer should fire once.
Wait For Interrupt Timeout
Wait For Log Entry Interrupt timer elapsed
# Clear the status.
Set Watchdog Flag At Bit ${InterruptExpired} In ${Status} To 1
# Timer should fire again.
Wait For Interrupt Timeout
Wait For Log Entry Interrupt timer elapsed