16 read -sv autotune_div.sv
19 [file autotune_div.sv]
21 parameter WIDTH = 4 // Reduce this if it takes too long on CI
27 output reg [WIDTH-1:0] q,
28 output reg [WIDTH-1:0] r,
32 reg [WIDTH-1:0] a_reg = 0;
33 reg [WIDTH-1:0] b_reg = 1;
41 reg [WIDTH-1:0] q_step = 1;
42 reg [WIDTH-1:0] r_step = 1;
44 // This is not how you design a good divider circuit!
45 always @(posedge clk) begin
55 if (r_step <= r) begin
59 if (!r_step[WIDTH-1]) begin
60 r_step <= r_step << 1;
61 q_step <= q_step << 1;
65 r_step <= r_step >> 1;
66 q_step <= q_step >> 1;
74 always @(posedge clk) begin
75 assert (r_step == b_reg * q_step); // Helper invariant
77 assert (q * b_reg + r == a_reg); // Main invariant & correct output relationship
78 if (done) assert (r <= b_reg - 1); // Output range
81 cover (done && b_reg == 0);