Complexity studies found that SAT problems are hardest when the number of clauses (recall that a clause is an OR of three variables, each of which may be complemented) is 3 to 4 times the number of variables. Much smaller than this and the satisfiability problem becomes easy - there a many solutions, any number of which can be found quickly. Much more than this ratio and the problem is overconstrained and it is straightforward to show (using software techniques not directly related to GSAT) that there is no solution at all.
Four times as many clauses as variables would be 512 clauses. That's 1536 bytes, since each clause takes three. This means that we need 12288 bits of storage for the expression, which would be an interesting challenge with a transistor budget of 5 to 6 thousand. So the expression must be kept off chip.
External SRAM chips have been used in the past. The course web page mentions that the Dallas Semiconductor DS1230 256 kilobit non-volatile SRAM was used in 1997. That appeared to meet our needs (though it is considerably larger than 12288 bits), so we designed for that chip.
We actually included 12 bits of addressing, which actually allows for 1365 clauses (including the terminator). This is somewhat more than twice what we really need (512 clauses), but in this case using 12 bits instead of 11 didn't hurt, and 12 is a nicer number than 11.
So talking to the external memory requires 12 output pins and 8 input pins, plus a 12-bit counter to iterate through the memory, and an 8-bit register to receive the data back (the DS1230 is byte-addressable and returns 8 bits at a time). Also, a three-bit shift register will be needed to detect when we've hit the terminating clause (we call this unit ``ender'').
Bringing the randomness in from off-chip gives finer-grained control for testing, and simplifies the layout design, so we allocated one pin for randomness and hooked it up to an 8-bit shift register which shifts on every cycle (we use only the freshest randomness).
The second counter has 12-bits and is used to address the memory. The 10-bit counter was implemented as a PLA generated by meg. We attempted to implement the 12-bit counter the same way, but the tools choked on a system with 4096 states. Instead, we generated a 4-bit counter and connected three of them together.