Advertisement
punjusquad

question_8

Dec 17th, 2023
1,310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //interface to group signals
  2.  
  3. timeunit 1ns;
  4. timeprecision 1ns;
  5.  
  6.  
  7. interface candy_vending_intf(input bit clk);
  8. logic rst;
  9. logic n;
  10. logic d;
  11. logic q;
  12. logic dispense;
  13. logic rn;
  14. logic rd;
  15.  
  16. modport DUT(
  17.         input n,d,q,rst,clk,
  18.         output dispense,rn,rd
  19. );
  20.  
  21. modport TEST(
  22.         input dispense,rn,rd,clk,
  23.         output n,d,q,rst
  24. );
  25.  
  26. endinterface:candy_vending_intf
  27.  
  28.  
  29. class Transaction;
  30.         rand bit n;
  31.         rand bit d;
  32.         rand bit q;
  33.  
  34.         constraint C1{{n,d,q} dist{3'b100:=120,3'b010:=50,3'b001:=20};}
  35. endclass:Transaction
  36.  
  37. class Generator;
  38.       //declare handles
  39.       Transaction trans;
  40.       mailbox drv_mb;//mailbox is an sv builtin unit
  41.  
  42.       //constructor function
  43.       function  new(mailbox aa);
  44.              drv_mb =aa;
  45.       endfunction
  46.  
  47.       task main(int count);
  48.           repeat (count) begin
  49.                 trans= new();
  50.         if(!trans.randomize)
  51.             $fatal (0,"............Randomisation Failed!!!..........");
  52.         drv_mb.put(trans);
  53.           end
  54.       endtask
  55. endclass:Generator
  56.  
  57. class Driver;
  58.       //declare handles
  59.       Transaction trans;
  60.       mailbox gen2drv;
  61.       virtual candy_vending_intf.TEST h_tb_port;//h_tb_port is an handle to interface candy_vending_intf
  62.  
  63.       shortint nickels,dimes,quarters;
  64.       bit done;
  65.  
  66.       function new(virtual candy_vending_intf.TEST h_tb_port, mailbox bb);
  67.           this.h_tb_port=h_tb_port;
  68.           gen2drv=bb;
  69.       endfunction
  70.  
  71.       task reset();
  72.           @(posedge h_tb_port.clk);
  73.           h_tb_port.rst<=0;
  74.           $display("REST Started...@%0t",$time);
  75.           h_tb_port.n<=0;
  76.           h_tb_port.d<=0;
  77.           h_tb_port.q<=0;
  78.           #12ns;
  79.           h_tb_port.rst<=1;
  80.           $display("RESET Ended...@%0t",$time);
  81.       endtask
  82.  
  83.  
  84.       task drive(int count);
  85.           repeat (count) begin:loop
  86.               gen2drv.get(trans);
  87.               //count coins
  88.               nickels  += trans.n;
  89.               dimes    += trans.d;
  90.               quarters += trans.q;
  91.  
  92.               @(posedge h_tb_port.clk);
  93.               h_tb_port.n<=trans.n;
  94.               h_tb_port.d<=trans.d;
  95.               h_tb_port.q<=trans.q;
  96.  
  97.                @(posedge h_tb_port.clk);
  98.               h_tb_port.n<=0;
  99.               h_tb_port.d<=0;
  100.               h_tb_port.q<=0;
  101.  
  102.               @(negedge h_tb_port.clk);
  103.               if(h_tb_port.dispense)
  104.                   repeat (20) @(posedge h_tb_port.clk);
  105.           end:loop
  106.           done=1'b1; //all transactions done..
  107.  
  108.           $display("DRIVER::\t nickels =%0d, DIMES = %0d ,QUARTERS = %0d\n",nickels,dimes,quarters);
  109.       endtask          
  110. endclass:Driver
  111.  
  112.  
  113. program automatic tb_candy_vending(tb_port);
  114.     candy_vending_intf.TEST tb_port;
  115.     //declare all handles
  116.     Transaction trans;
  117.     mailbox     drv_mb;
  118.     Generator   gen;
  119.         Driver      drv;
  120.  
  121.     int  rpt_count=400;
  122.  
  123.     virtual candy_vending_intf.TEST h_tb_port=tb_port;//declare and initilaise theinterface handle
  124.     //apply inputs 
  125.     initial begin
  126.          drv_mb=new(1);//depth-1
  127.      gen =new(drv_mb);
  128.      drv = new(h_tb_port,drv_mb);
  129.  
  130.      drv.reset();//reset dut
  131.      repeat (5) @(posedge tb_port.clk);
  132.      fork:fj1
  133.          gen.main(rpt_count);
  134.          drv.drive(rpt_count);
  135.      join:fj1
  136.  end
  137.  initial
  138.     begin
  139.         $recordfile("candy_vending_ver2.trn");
  140.         $recordvars();
  141.     end
  142.  
  143. endprogram
  144.  
  145.        
  146.  
  147. module top_candy_vending_ver2;
  148. bit clk;
  149. initial
  150. begin
  151.         clk=1'b1;
  152.         forever #5 clk++;
  153. end
  154.  
  155. candy_vending_intf IF1(.clk(clk));
  156.  
  157.  
  158. candy_vending_ver2 DES(
  159.         .cv_ifc(IF1.DUT)
  160. );
  161.  
  162.  
  163. tb_candy_vending TESTBLK(
  164.         .tb_port(IF1.TEST)
  165. );
  166. endmodule
  167.  
  168.  
  169. module candy_vending_ver2(cv_ifc);
  170. candy_vending_intf.DUT cv_ifc;
  171.  
  172. localparam[3:0]
  173.     S0=0,
  174.     S5=1,
  175.     S10=2,
  176.     S15=3,
  177.     S20=4,
  178.     S25=5,
  179.     S30=6,
  180.     S35=7,
  181.     S40=8,
  182.     S45=9,
  183.     DUM=10,
  184.     RD2=11;
  185.  
  186. reg[3:0] cst,nst;
  187.  
  188. always@(posedge cv_ifc.clk or negedge cv_ifc.rst)
  189. begin
  190.     if(!cv_ifc.rst)
  191.         cst<=S0;
  192.     else
  193.         cst<=nst;
  194. end
  195.  
  196. always@(*)
  197. begin
  198.     case(cst)
  199.         S0:if(cv_ifc.n) nst=S5;
  200.         else if(cv_ifc.d) nst=S10;
  201.         else if(cv_ifc.q) nst=S25;
  202.         else nst=cst;
  203.        
  204.         S5:if(cv_ifc.n) nst=S10;
  205.         else if(cv_ifc.d) nst=S15;
  206.         else if(cv_ifc.q) nst=S30;
  207.         else nst=cst;
  208.        
  209.         S10:if(cv_ifc.n) nst=S15;
  210.         else if(cv_ifc.d) nst=S20;
  211.         else if(cv_ifc.q) nst=S35;
  212.         else nst=cst;
  213.        
  214.         S15:if(cv_ifc.n) nst=S20;
  215.         else if(cv_ifc.d) nst=S25;
  216.         else if(cv_ifc.q) nst=S40;
  217.         else nst=cst;
  218.        
  219.         S20:if(cv_ifc.n) nst=S25;
  220.         else if(cv_ifc.d) nst=S30;
  221.         else if(cv_ifc.q) nst=S45;
  222.         else nst=cst;
  223.  
  224.         S25,S30,S35,S40,RD2:nst=S0;
  225.        
  226.         S45:nst=DUM;
  227.        
  228.         DUM:nst=RD2;
  229.        
  230.     endcase
  231. end
  232.  
  233. assign cv_ifc.dispense=(cst==S25)|(cst==S30)|(cst==S35)|(cst==S40)|(cst==S45);
  234.  
  235. assign cv_ifc.rd=(cst==S35)|(cst==S40)|(cst==S45)|(cst==RD2);
  236.  
  237. assign cv_ifc.rn=(cst==S30)|(cst==S40);
  238.  
  239. endmodule
  240.  
  241.  
  242.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement