It may not advance today's hardware technology, but understanding these sorts of things means you have a deep understanding of many, many principles.
It's common when writing threaded software for multi-core systems to have an ""edge-race," where correct behavior can depend on exact ordering of earlier processing. Most of the people I know who have never had a software edge-race are people with significant hardware knowledge. They know what it's like to have many things going on simultaneously, and have the experience to reason about it more easily than those with a pure software background
With aggressively multi-core systems becoming more common (we are routinely using systems with 32 cores, and then we use 30 or more of them) material like this is becoming more relevant.
As part of the computer science/engineering program I went to at university, we had courses spanning the entire stack. Intro courses were in Scheme and C, and later courses went on to higher-level OO and relational databases and other paradigms. But we also had a short course in analogue electronics, followed by one in digital electronics, both of which were extremely hands-on, requiring us to construct simple circuits in the analogue course, but eventually progressing up to making our own simple CPU in the digital one, including making the microcode for it, and programming it in our own machine code.
That was a real eye-opening moment for me when I realized I had actually been all over the stack and had some sort of understanding of how a high-level program gets compiled and executed and what actually happens at the lowest level, and that that was useful for understanding the high level better.
I second this. One of the most eye opening and impactful classes I took in my undergrad was the digital circuits class. It finally made it click. Breadboarding a simple ALU at a workbench out of simple logic components, making them work off of a clock (seeing how the clock was just a final input that forced the operation to occur blew my mind), etc. etc. then doing it again in an FPGA was awesome. Suddenly all of the stack made sense, my compiler class made sense (when we wrote an emulator for a fictional target system to compile to, I kept thinking about how that system would work as a logic diagram), the OS class made sense (thinking about how the contents of an instruction could be swapped out for context switches in a multi-tasking system)...
I wish that the curriculum at my school had started with that class. It would have been a much better foundation to start off of than C++ and Prolog.
Sure... If you want to learn about that you could practice writing code for a low level emulator (loads are available). No need to actually build your own CPU.
It's common when writing threaded software for multi-core systems to have an ""edge-race," where correct behavior can depend on exact ordering of earlier processing. Most of the people I know who have never had a software edge-race are people with significant hardware knowledge. They know what it's like to have many things going on simultaneously, and have the experience to reason about it more easily than those with a pure software background
With aggressively multi-core systems becoming more common (we are routinely using systems with 32 cores, and then we use 30 or more of them) material like this is becoming more relevant.