summaryrefslogtreecommitdiffstats
path: root/data/accumulator.v
diff options
context:
space:
mode:
Diffstat (limited to 'data/accumulator.v')
-rw-r--r--data/accumulator.v108
1 files changed, 65 insertions, 43 deletions
diff --git a/data/accumulator.v b/data/accumulator.v
index aaed3da..f0057b5 100644
--- a/data/accumulator.v
+++ b/data/accumulator.v
@@ -1,46 +1,68 @@
+
module main(reset, clk, finish, return_val);
- input [0:0] clk, reset;
- output reg [31:0] return_val = 0;
- output reg [0:0] finish = 0;
- reg [0:0] en = 0, wr_en = 0, u_en = 0;
- reg [31:0] state = 0, d_out = 0, d_in = 0;
- reg [31:0] reg_1 = 0, addr = 0, reg_2 = 0;
- reg [31:0] stack [0:0];
- always @(negedge clk)
- if ({u_en != en}) begin
- if (wr_en) stack[addr] <= d_in;
- else d_out <= stack[addr];
- en <= u_en;
- end
- always @(posedge clk)
- case (state)
- 32'd6: reg_1 <= d_out;
- 32'd4: reg_2 <= 32'd3;
- 32'd3: begin
- u_en <= ( ! u_en);
- wr_en <= 32'd1;
- d_in <= reg_2;
- addr <= 32'd0;
+input [0:0] reset, clk;
+output reg [0:0] finish = 0;
+output reg [31:0] return_val = 0;
+reg [31:0] reg_3 = 0, addr = 0, d_in = 0, reg_5 = 0, wr_en = 0;
+reg [0:0] en = 0, u_en = 0;
+reg [31:0] state = 0, reg_2 = 0, reg_4 = 0, d_out = 0, reg_1 = 0;
+reg [31:0] stack [1:0];
+always @(negedge clk)
+if ({u_en != en}) begin
+if (wr_en) stack[addr] <= d_in; else d_out <= stack[addr];
+en <= u_en;
+end
+always @(posedge clk)
+case (state)
+32'd11: reg_2 <= d_out;
+32'd8: reg_5 <= 32'd3;
+32'd7: begin u_en <= ( ! u_en); wr_en <= 32'd1;
+d_in <= reg_5; addr <= 32'd0; end
+32'd6: reg_4 <= 32'd6;
+32'd5: begin u_en <= ( ! u_en); wr_en <= 32'd1;
+d_in <= reg_4; addr <= 32'd1; end
+32'd4: reg_1 <= 32'd1;
+32'd3: reg_3 <= 32'd0;
+32'd2: begin u_en <= ( ! u_en); wr_en <= 32'd0;
+addr <= {{{reg_3 + 32'd0} + {reg_1 * 32'd4}} / 32'd4}; end
+32'd1: begin finish = 32'd1; return_val = reg_2; end
+default: ;
+endcase
+always @(posedge clk)
+if ({reset == 32'd1}) state <= 32'd8;
+else case (state)
+32'd11: state <= 32'd1;
+32'd4: state <= 32'd3;
+32'd8: state <= 32'd7;
+32'd3: state <= 32'd2;
+32'd7: state <= 32'd6;
+32'd2: state <= 32'd11;
+
+module testbench;
+ reg start, reset, clk;
+ wire finish;
+ wire [31:0] return_val;
+ reg [31:0] cycles;
+
+ main m(reset, clk, finish, return_val);
+
+ initial begin
+ clk = 0;
+ start = 0;
+ reset = 0;
+ @(posedge clk) reset = 1;
+ @(posedge clk) reset = 0;
+ cycles = 0;
+ end
+
+ always #5 clk = ~clk;
+
+ always @(posedge clk) begin
+ if (finish == 1) begin
+ $display("cycles: %0d", cycles);
+ $display("finished: %0d", return_val);
+ $finish;
end
- 32'd2: begin
- u_en <= ( ! u_en);
- wr_en <= 32'd0;
- addr <= 32'd0;
- end
- 32'd1: begin
- finish = 32'd1;
- return_val = reg_1;
- end
- default:;
- endcase
- always @(posedge clk)
- if ({reset == 32'd1}) state <= 32'd4;
- else case (state)
- 32'd6: state <= 32'd1;
- 32'd4: state <= 32'd3;
- 32'd3: state <= 32'd2;
- 32'd2: state <= 32'd6;
- 32'd1: ;
- default:;
- endcase
+ cycles <= cycles + 1;
+ end
endmodule