empty and full are declared as output, which means their implied type is wire. You can only drive wires with a continuous assign:
assign empty = some_value;
If you want to assign these signals from an always block, you should explicitly declare them as logic (or reg if you’re using Verilog):
output logic empty, full;