• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Functional Verification
  3. Creating a Queue of Classes

Stats

  • Locked Locked
  • Replies 2
  • Subscribers 64
  • Views 14019
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Creating a Queue of Classes

archive
archive over 18 years ago

This is an example of using a queue of classes. ----file: queue_of_classes.sv---- // compile with: ncverilog queue_of_classes.sv +sv package mypack; class some_class; randc shortint myint; constraint c1 {myint inside {[1:20]}; } function void printit; $display("value= %d", myint); endfunction endclass endpackage // --------------------- // this module creates a queue of classes module queue_of_classes(); import mypack::*; logic clk = 'b1; initial forever clk = #10 ~clk; int success; some_class myQ[$]; some_class myclass; task dowrite; $display("--------Write Queue--------"); myclass = new; // create point to new class object success = myclass.randomize(); myclass.printit; myQ.push_front(myclass ); // push onto queue endtask task doread; $display("--------Read Queue---------"); if (myQ.size() > 0) begin: datainQ myclass = myQ.pop_back(); // pop queue myclass.printit; end: datainQ else $display("Queue Empty - cant read"); endtask task doQueContents; // non-destructive read $display("--------Queue Stats-------------"); $display("Que Size= %d", myQ.size() ); for (int j=0; j


Originally posted in cdnusers.org by tmackett
  • Cancel
Parents
  • archive
    archive over 18 years ago

    A queue of classes allow you to encapsulate the data and the functions that operate on it in a single class. If you compare this to just having a queue of a data structure, the you are forced to operate on ONLY that data structure. I can't populate the queue with different classes, but I can populate the queue with extended classes, which may have different/more variables, constraints, different/overloaded functions or even new functions inside the extended class. Here's my example extended to show an extended class with a different contraint block. In my extended example if you are using the extended class and call the 'printit' function, it actually calls the 'printit' function from the inherited class. package mypack; class some_class; randc shortint myint; constraint c1 {myint inside {[1:20]}; } function void printit; $display("value= %d", myint); endfunction endclass class other_class extends some_class; randc shortint myint; constraint c1 {myint inside {[75:80]}; } // Notice there is no 'printit' function here // FYI - calling 'printit' using this class will // call 'printit' from the inherited class endclass endpackage // --------------------- // this module creates a queue of classes module queue_of_classes(); import mypack::*; logic clk = 'b1; initial forever clk = #10 ~clk; int success; some_class myQ[$]; some_class myclass; other_class myotherclass; task dowrite; $display("--------Write Queue--------"); myclass = new; // create point to new class object success = myclass.randomize(); myclass.printit; myQ.push_front(myclass ); // push onto queue endtask task otherdowrite; $display("--------Other Write Queue--------"); myotherclass = new; // create point to new class object success = myotherclass.randomize(); myotherclass.printit; myQ.push_front(myotherclass ); // push onto queue endtask task doread; $display("--------Read Queue---------"); if (myQ.size() > 0) begin: datainQ myclass = myQ.pop_back(); // pop queue myclass.printit; end: datainQ else $display("Queue Empty - cant read"); endtask task doQueContents; // non-destructive read $display("--------Queue Stats-------------"); $display("Que Size= %d", myQ.size() ); for (int j=0; j < myQ.size(); j++) begin: showQ // myclass = myQ[j]; // $display("Contents %d", myclass ); // myclass.printit; $display("CONTENTS %d",j); myQ[j].printit; end: showQ endtask always @(posedge clk) begin: main for (int i=1; i <5; i++) begin: for1 randcase 1: dowrite; 1: doread; 1: otherdowrite; endcase doQueContents; end: for1 end: main endmodule


    Originally posted in cdnusers.org by tmackett
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • archive
    archive over 18 years ago

    A queue of classes allow you to encapsulate the data and the functions that operate on it in a single class. If you compare this to just having a queue of a data structure, the you are forced to operate on ONLY that data structure. I can't populate the queue with different classes, but I can populate the queue with extended classes, which may have different/more variables, constraints, different/overloaded functions or even new functions inside the extended class. Here's my example extended to show an extended class with a different contraint block. In my extended example if you are using the extended class and call the 'printit' function, it actually calls the 'printit' function from the inherited class. package mypack; class some_class; randc shortint myint; constraint c1 {myint inside {[1:20]}; } function void printit; $display("value= %d", myint); endfunction endclass class other_class extends some_class; randc shortint myint; constraint c1 {myint inside {[75:80]}; } // Notice there is no 'printit' function here // FYI - calling 'printit' using this class will // call 'printit' from the inherited class endclass endpackage // --------------------- // this module creates a queue of classes module queue_of_classes(); import mypack::*; logic clk = 'b1; initial forever clk = #10 ~clk; int success; some_class myQ[$]; some_class myclass; other_class myotherclass; task dowrite; $display("--------Write Queue--------"); myclass = new; // create point to new class object success = myclass.randomize(); myclass.printit; myQ.push_front(myclass ); // push onto queue endtask task otherdowrite; $display("--------Other Write Queue--------"); myotherclass = new; // create point to new class object success = myotherclass.randomize(); myotherclass.printit; myQ.push_front(myotherclass ); // push onto queue endtask task doread; $display("--------Read Queue---------"); if (myQ.size() > 0) begin: datainQ myclass = myQ.pop_back(); // pop queue myclass.printit; end: datainQ else $display("Queue Empty - cant read"); endtask task doQueContents; // non-destructive read $display("--------Queue Stats-------------"); $display("Que Size= %d", myQ.size() ); for (int j=0; j < myQ.size(); j++) begin: showQ // myclass = myQ[j]; // $display("Contents %d", myclass ); // myclass.printit; $display("CONTENTS %d",j); myQ[j].printit; end: showQ endtask always @(posedge clk) begin: main for (int i=1; i <5; i++) begin: for1 randcase 1: dowrite; 1: doread; 1: otherdowrite; endcase doQueContents; end: for1 end: main endmodule


    Originally posted in cdnusers.org by tmackett
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information