From fb42c6f69b1f3e5d5362fcb483dc195201a63fbd Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Wed, 14 Apr 2021 11:53:23 +0100 Subject: Fix main diagram --- data/accumulator.v | 108 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 43 deletions(-) (limited to 'data/accumulator.v') 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 -- cgit