// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2012 Iztok Jeras
// SPDX-License-Identifier: CC0-1.0

// verilog_format: off
module t (
    input clk
);

  integer cnt = 0;
  integer mod = 0;

  // event counter
  always @ (posedge clk)
  if (cnt==20) begin
    cnt <= 0;
    mod <= mod + 1;
  end else begin
    cnt <= cnt + 1;
  end

  // finish report
  always @ (posedge clk)
  if (mod==3) begin
    $write("*-* All Finished *-*\n");
    $finish;
  end

  // anonymous type variable declaration
  enum logic [2:0] {red=1, orange, yellow, green, blue, indigo, violet} rainbow7;

  // named type
  typedef enum logic {OFF, ON} t_switch;
  t_switch switch;

  // numbering examples
  enum integer {father, mother, son[2], daughter, gerbil, dog[3]=10, cat[3:5]=20, car[3:1]=30} family;

  // test of raibow7 type
  always @ (posedge clk)
  if (mod==0) begin
    // write value to array
    if      (cnt== 0)  begin
      rainbow7 <= rainbow7.first();
      // check number
      if (rainbow7.num()  !== 7      ) begin $display("%d", rainbow7.num() ); $stop(); end
      // if (rainbow7        !== 3'bxxx ) begin $display("%b", rainbow7       ); $stop(); end
    end
    else if (cnt== 1)  begin
      if (rainbow7        !== 3'd1   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== red    ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 2)  begin
      if (rainbow7        !== 3'd2   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== orange ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 3)  begin
      if (rainbow7        !== 3'd3   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== yellow ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 4)  begin
      if (rainbow7        !== 3'd4   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== green  ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 5)  begin
      if (rainbow7        !== 3'd5   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== blue   ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 6)  begin
      if (rainbow7        !== 3'd6   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== indigo ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 7)  begin
      if (rainbow7        !== 3'd7   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== violet ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
    else if (cnt== 8)  begin
      if (rainbow7        !== 3'd1   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== red    ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.next();
    end
  end else if (mod==1) begin
    // write value to array
    if      (cnt== 0)  begin
      rainbow7 <= rainbow7.last();
      // check number
      if (rainbow7.num()  !== 7      ) begin $display("%d", rainbow7.num() ); $stop(); end
    end
    else if (cnt== 1)  begin
      if (rainbow7        !== 3'd7   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== violet ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 2)  begin
      if (rainbow7        !== 3'd6   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== indigo ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 3)  begin
      if (rainbow7        !== 3'd5   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== blue   ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 4)  begin
      if (rainbow7        !== 3'd4   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== green  ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 5)  begin
      if (rainbow7        !== 3'd3   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== yellow ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 6)  begin
      if (rainbow7        !== 3'd2   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== orange ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 7)  begin
      if (rainbow7        !== 3'd1   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== red    ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
    else if (cnt== 8)  begin
      if (rainbow7        !== 3'd7   ) begin $display("%b", rainbow7       ); $stop(); end
      if (rainbow7        !== violet ) begin $display("%b", rainbow7       ); $stop(); end
      rainbow7 <= rainbow7.prev();
    end
  end

  // test of t_switch type
  always @ (posedge clk)
  if (mod==0) begin
    // write value to array
    if      (cnt== 0)  begin
      switch <= switch.first();
      // check number
      if (switch.num()  !== 2   ) begin $display("%d", switch.num() ); $stop(); end
      // if (switch        !== 1'bx) begin $display("%b", switch       ); $stop(); end
    end
    else if (cnt== 1)  begin
      if (switch        !== 1'b0) begin $display("%b", switch       ); $stop(); end
      if (switch        !== OFF ) begin $display("%b", switch       ); $stop(); end
      switch <= switch.next();
    end
    else if (cnt== 2)  begin
      if (switch        !== 1'b1) begin $display("%b", switch       ); $stop(); end
      if (switch        !== ON  ) begin $display("%b", switch       ); $stop(); end
      switch <= switch.next();
    end
    else if (cnt== 3)  begin
      if (switch        !== 1'b0) begin $display("%b", switch       ); $stop(); end
      if (switch        !== OFF ) begin $display("%b", switch       ); $stop(); end
      switch <= switch.next();
    end
  end else if (mod==1) begin
    // write value to array
    if      (cnt== 0)  begin
      rainbow7 <= rainbow7.last();
      // check number
      if (switch.num()  !== 2   ) begin $display("%d", switch.num() ); $stop(); end
    end
    else if (cnt== 1)  begin
      if (switch        !== 1'b1) begin $display("%b", switch       ); $stop(); end
      if (switch        !== ON  ) begin $display("%b", switch       ); $stop(); end
      switch <= switch.prev();
    end
    else if (cnt== 2)  begin
      if (switch        !== 1'b0) begin $display("%b", switch       ); $stop(); end
      if (switch        !== OFF ) begin $display("%b", switch       ); $stop(); end
      switch <= switch.prev();
    end
    else if (cnt== 3)  begin
      if (switch        !== 1'b1) begin $display("%b", switch       ); $stop(); end
      if (switch        !== ON  ) begin $display("%b", switch       ); $stop(); end
      switch <= switch.prev();
    end
  end

  // test of raibow7 type
  always @ (posedge clk)
  if (mod==0) begin
    // write value to array
    if      (cnt== 0)  begin
      family <= family.first();
      // check number
      if (family.num()  !== 15       ) begin $display("%d", family.num() ); $stop(); end
      // if (family        !== 32'dx    ) begin $display("%b", family       ); $stop(); end
    end
    else if (cnt== 1)  begin
      if (family        !== 0        ) begin $display("%b", family       ); $stop(); end
      if (family        !== father   ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 2)  begin
      if (family        !== 1        ) begin $display("%b", family       ); $stop(); end
      if (family        !== mother   ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 3)  begin
      if (family        !== 2        ) begin $display("%b", family       ); $stop(); end
      if (family        !== son0     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 4)  begin
      if (family        !== 3        ) begin $display("%b", family       ); $stop(); end
      if (family        !== son1     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 5)  begin
      if (family        !== 4        ) begin $display("%b", family       ); $stop(); end
      if (family        !== daughter ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 6)  begin
      if (family        !== 5        ) begin $display("%b", family       ); $stop(); end
      if (family        !== gerbil   ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 7)  begin
      if (family        !== 10       ) begin $display("%b", family       ); $stop(); end
      if (family        !== dog0     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 8)  begin
      if (family        !== 11       ) begin $display("%b", family       ); $stop(); end
      if (family        !== dog1     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 9)  begin
      if (family        !== 12       ) begin $display("%b", family       ); $stop(); end
      if (family        !== dog2     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 10)  begin
      if (family        !== 20       ) begin $display("%b", family       ); $stop(); end
      if (family        !== cat3     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 11)  begin
      if (family        !== 21       ) begin $display("%b", family       ); $stop(); end
      if (family        !== cat4     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 12)  begin
      if (family        !== 22       ) begin $display("%b", family       ); $stop(); end
      if (family        !== cat5     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 13)  begin
      if (family        !== 30       ) begin $display("%b", family       ); $stop(); end
      if (family        !== car3     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 14)  begin
      if (family        !== 31       ) begin $display("%b", family       ); $stop(); end
      if (family        !== car2     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
    else if (cnt== 15)  begin
      if (family        !== 32       ) begin $display("%b", family       ); $stop(); end
      if (family        !== car1     ) begin $display("%b", family       ); $stop(); end
      family <= family.next();
    end
  end
endmodule
