DataIn is the incoming data. It is visible for all the registers.
WriteAddr determines which register can be write. It is first decoded by the decoder. The output from the decoder will AND with clock and then connected to clk port of each register. By doing this, only the active register (destination register) can be written. Other registers are disabled (because decoder output for that register is low).
ReadAddrA and ReadAddrB control two multiplexers to select which register will be read. There are two multiplexers because we want to read two values at a time as operands in order to perform infix operations.