Vending Machine in System Verilog

Model a Vending Machine using OOP concepts like Inheritance and Polymorphism
The vending machine can contain multiple Items
Items have 2 properties: id and price
Id and price could be arbitrary, they do not indicate if the item is a drink or snack
Classes of Items: Drinks and Snacks
If user selects id and provides enough coins to match price, item dispenses
If item is Drink, it dispenses to slot 1, else slot 2

//Charchica Agrawal:07/01/2025

class vmitem;
rand int idd[$], prc[$];
endclass

class drinks extends vmitem;

  constraint size_id {soft idd.size()==8;};
  constraint size_prc {prc.size()==idd.size();
                     solve idd.size() before prc.size();};

  constraint id { foreach(idd[i]) {
                   unique {idd[i]}; 
                   idd[i] inside {[20:30]};
                   prc[i] == idd[i];}
                }

endclass

class snacks extends vmitem;

  constraint size_id {soft idd.size()==10;};
  constraint size_prc {prc.size()==idd.size();
                     solve idd.size() before prc.size();};

  constraint id { foreach(idd[i]) {
                   unique {idd[i]};
                   idd[i] inside {[40:50]};
                   prc[i] == idd[i]; }
                 }

endclass

class vending_mc;
 drinks D;
 snacks S;
 int slot1=0, slot2=0;
 //int selid=0, coins=0;

function void Drinks_Snacks(int id=0, int pay=0);
 int vitem=0;

 D=new();
 S=new();

  D.randomize() with {idd.size()==10; idd[0]==20;};
  S.randomize() with {idd.size()==6;};

 //slot1=vm_out(selid, coins);
 //slot2=vm_out(selid, coins);

  foreach (D.idd[i]) begin
    if (id==D.idd[i] && pay==D.prc[i]) begin
     vitem=D.idd[i];
     slot1=vitem; 
    end
   end

  foreach (S.idd[i]) begin
    if (id==S.idd[i] && pay==S.prc[i]) begin
    vitem=S.idd[i];
    slot2=vitem; 
   end
  end
 endfunction

 function void printitems();
    foreach (D.idd[i]) begin
      $display("Drink id[%0d]=%0d\n", i, D.idd[i]);
  end

    foreach (S.idd[i]) begin
      $display("Snacks id[%0d]=%0d\n", i, S.idd[i]);
  end
  endfunction
   
endclass


module vmtest;

 vending_mc VM;
 int userid=20, usercoins=20; //Add Initialise for all items also. TODO
 
 initial begin
  VM = new();

   VM.Drinks_Snacks(userid, usercoins);
  VM.printitems();

   $display("Slot1 Drink=%0d", VM.slot1);
   $display("Slot2 Snacks=%0d", VM.slot2);
   
 end

endmodule

EDA: EDA Playground

  1. Please follow the code formatting guidelines
  2. Do you have any question with your vending machine code ?

How would you redesign this using a single item list instead of separate drink and snack lists?