Arm
Cambridge
During my placement at Arm, I worked in a team that verifies CPU processor designs. My main project focused on the Performance Monitoring Unit (PMU) decoder, which is responsible for generating PMU events which are used for performance analysis. I used formal verification, a technique that exhaustively checks a design against its requirements, to identify differences between intended and implemented behaviour. I integrated an existing checking process into the processor project and developed it from a partially working setup into a repeatable flow used by the team. I then investigated failures, distinguished design issues from modelling or setup problems, worked with designers to resolve them, and reran checks to confirm that fixes behaved as expected. The completed flow was then included in regular project regressions.
My main contribution was writing the project-specific wrapper, i.e. control scripts that connected an existing checking process to the processor project, together with the necessary configuration and verification setup. I also added validation, testing and documentation so other engineers could run and maintain the flow. The checks produced many counterexamples, cases where the design differed from the expected result. I grouped related failures and investigated whether each was caused by the design, the expected model or the verification setup. This required comparing evidence with the requirements and discussing unclear cases with designers. I reported genuine design issues, tested the fixes and corrected the model when necessary. I also developed an additional check to ensure relevant cases were not missed, sharing findings with teams across different sites and presented the completed project to the wider formal verification team.
I developed skills in formal verification, digital hardware design and systematic problem solving. I used Python and Tcl to automate the verification process, SystemVerilog to write RTL and formal properties, and YAML and JSON to manage configuration. I became more confident in reading processor design code, analysing failure traces and following evidence through the design to identify the root cause. I also learnt to distinguish design problems from expected model or verification setup issues. I also gained experience using version control, code review and scheduled regression testing. These practices ensured that my work continued to operate as the wider project changed and could be easily reviewed, reproduced and maintained by other engineers.
The placement helped me become a more independent and confident engineer. Investigating a large set of failures required me to organise my work, identify patterns and prioritise cases most likely to provide useful information. I learnt to communicate findings clearly by separating evidence from assumptions, and explained how the flow worked to designers and other verification teams. Discussions about unclear requirements and specifications improved my confidence in asking precise questions, listening to alternative views and reaching decisions collaboratively. Working with teams across different sites on related processor projects also highlighted to me the importance of sharing useful findings beyond my immediate team. Finally, writing documentation and presenting my project improved my ability to make technical work understandable to people with different backgrounds and levels of experience.