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 ?