aboutsummaryrefslogtreecommitdiffstats
path: root/example/main.sv
blob: 8e97a4364113c1b8ff2ed3ffd4e476f390ff6295 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
module main(input start, reset, clk,
            output finished, output [31:0] return_val);

   reg [31:0]      x;
   reg [31:0]      y;
   reg [31:0]      z;
   reg [2:0]       state;

   reg [31:0]     return_val_w;
   reg            finished_w;

   localparam [2:0] START_STATE = 0;
   localparam [2:0] MAIN_STATE_0 = 1;
   localparam [2:0] MAIN_STATE_1 = 2;
   localparam [2:0] MAIN_STATE_2 = 3;
   localparam [2:0] MAIN_STATE_3 = 4;
   localparam [2:0] MAIN_STATE_4 = 5;
   localparam [2:0] FINISHED_STATE = 6;

   assign return_val = return_val_w;
   assign finished = finished_w;

   always @(posedge clk)
     if (reset) begin
        state <= START_STATE;
        return_val_w <= 0;
        finished_w <= 0;
     end
     else
       case (state)
         START_STATE: x <= 0;
         MAIN_STATE_0: y <= 0;
         MAIN_STATE_1: z <= 0;
         MAIN_STATE_2: y <= 2;
         MAIN_STATE_3: z <= 3;
         MAIN_STATE_4: x <= y * z;
         FINISHED_STATE: begin 
            return_val_w <= x;
            finished_w <= 1;
         end
         default: state <= START_STATE;
       endcase

   always @(posedge clk)
     if (state != FINISHED_STATE)
       state <= state + 1;

endmodule

module testbench;
   reg start, reset, clk;
   wire finished;
   wire [31:0] return_val;
   
   main main(start, reset, clk, finished, return_val);

   initial begin
      $dumpvars;
      start = 0;
      reset = 1;
      clk = 0;

      @(posedge clk) begin
         reset = 0;
         start = 1;
      end
      @(posedge clk) start = 0;

      #100;

      $display("Result: %d", return_val);
      $finish;
   end

   always #5 clk = ~clk;

endmodule