aboutsummaryrefslogtreecommitdiff
path: root/rtl/modexpng_recombinator_block.v
blob: efe0ac50b558e80265507f37a022c154962e81d0 (plain) (blame)
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
module modexpng_recombinator_block
(
    clk,
    ce, clr,
    din, dout
);

    input         clk;
    input         ce;
    input         clr;
    input  [46:0] din;
    output [15:0] dout;

    reg [14:0] z;
    reg [16:0] y;
    reg [17:0] x;
    //reg [15:0] w;

    //assign dout = w;
    assign dout = x[15:0];
    
    wire [14:0] din_z = din[46:32]; // TODO: maybe determine more precise bound here
    wire [15:0] din_y = din[31:16];
    wire [15:0] din_x = din[15: 0];
    
    always @(posedge clk)
        //
        if (ce) begin
            z <= din_z;
            y <= clr ? {1'b0, din_y}  : {1'b0, din_y} + {2'b00, z};
            x <= clr ? {2'b00, din_x} : {2'b00, din_x} + {1'b0, y} + {{16{1'b0}}, x[17:16]};
            //w <= clr ? {16{1'bX}}     : x[15:0];        
        end
    
endmodule