3
0
Fork 0
mirror of https://github.com/YosysHQ/sby.git synced 2025-04-07 06:44:06 +00:00
sby/docs/examples/puzzles/wolf_goat_cabbage.sv
Claire Wolf b26d4e6362 Update wolf_goat_cabbage.sv
Signed-off-by: Claire Wolf <claire@symbioticeda.com>
2020-04-22 19:21:15 +02:00

39 lines
1.3 KiB
Systemverilog

// A person needs to cross a river with a wolf, a goat and a cabbage. Their boat is only large
// enough to carry themselves and one of their three possessions, so they must transport these
// items one at a time. However, if they leave the wolf and the goat together unattended,
// then the wolf will eat the goat; similarly, if they leave the goat and the cabbage together
// unattended, then the goat will eat the cabbage. How can the person get across safely with
// their three items?
module wolf_goat_cabbage (input clk, input w, g, c);
// everyone starts at the 1st river bank
reg bank_w = 0; // wolf
reg bank_g = 0; // goat
reg bank_c = 0; // cabbage
reg bank_p = 0; // person
always @(posedge clk) begin
// person travels and takes the selected item with them
bank_p <= !bank_p;
if (w && (bank_w == bank_p)) bank_w <= !bank_p;
if (g && (bank_g == bank_p)) bank_g <= !bank_p;
if (c && (bank_c == bank_p)) bank_c <= !bank_p;
// maximum one of the control signals must be high
assume (w+g+c <= 1);
// we want wolf, goat, and cabbage on the 2nd river bank
cover(bank_w == 1 && bank_g == 1 && bank_c == 1);
// don't leave wolf and goat unattended
if (bank_w != bank_p) begin
assume (bank_w != bank_g);
end
// don't leave goat and cabbage unattended
if (bank_g != bank_p) begin
assume (bank_g != bank_c);
end
end
endmodule