|
|
//
|
//
|
// Internal wires and regs
|
// Internal wires and regs
|
//
|
//
|
|
|
|
|
reg [5:0] serial_mul_cnt;
|
reg [5:0] serial_mul_cnt;
|
reg mul_free;
|
reg mul_free;
|
|
|
|
|
wire [WIDTH-1:0] x;
|
wire [WIDTH-1:0] x;
|
wire [WIDTH-1:0] y;
|
wire [WIDTH-1:0] y;
|
|
|
reg ex_freeze_r;
|
reg ex_freeze_r;
|
|
|
|
|
always @( posedge clk)
|
always @( posedge clk)
|
if (reset) ex_freeze_r <= 1'b1;
|
if (reset) ex_freeze_r <= 1'b1;
|
else ex_freeze_r <= ex_freeze;
|
else ex_freeze_r <= ex_freeze;
|
|
|
|
|
//
|
//
|
// Combinatorial logic
|
// Combinatorial logic
|
//
|
//
|
|
|
|
|
assign x = a_in;
|
assign x = a_in;
|
|
|
assign y = b_in;
|
assign y = b_in;
|
|
|
|
|
`ifndef SYNTHESYS
|
`ifndef SYNTHESIS
|
|
|
|
|
always@(posedge clk)
|
always@(posedge clk)
|
if((serial_mul_cnt == 6'b000000) && ex_freeze && ex_freeze_r)
|
if((serial_mul_cnt == 6'b000000) && ex_freeze && ex_freeze_r)
|
begin
|
begin
|
$display("%t %m mul (%x,%x,%x);",$realtime,a_in,b_in,mul_prod_r );
|
$display("%t %m mul (%x,%x,%x);",$realtime,a_in,b_in,mul_prod_r );
|
end
|
end
|
|
|
|
|
|
|
|
|
`endif
|
`endif
|
|
|
|
|
|
|
|
|
|
|
|
|
always @( posedge clk)
|
always @( posedge clk)
|
if (reset) begin
|
if (reset) begin
|
mul_prod_r <= 64'h0000_0000_0000_0000;
|
mul_prod_r <= 64'h0000_0000_0000_0000;
|
serial_mul_cnt <= 6'd0;
|
serial_mul_cnt <= 6'd0;
|
mul_free <= 1'b1;
|
mul_free <= 1'b1;
|
|
|
end
|
end
|
else if (|serial_mul_cnt) begin
|
else if (|serial_mul_cnt) begin
|
serial_mul_cnt <= serial_mul_cnt - 6'd1;
|
serial_mul_cnt <= serial_mul_cnt - 6'd1;
|
if (mul_prod_r[0])
|
if (mul_prod_r[0])
|
mul_prod_r[(WIDTH*2)-1:WIDTH-1] <= mul_prod_r[(WIDTH*2)-1:WIDTH] + x;
|
mul_prod_r[(WIDTH*2)-1:WIDTH-1] <= mul_prod_r[(WIDTH*2)-1:WIDTH] + x;
|
else
|
else
|
mul_prod_r[(WIDTH*2)-1:WIDTH-1] <= {1'b0,mul_prod_r[(WIDTH*2)-1: WIDTH]};
|
mul_prod_r[(WIDTH*2)-1:WIDTH-1] <= {1'b0,mul_prod_r[(WIDTH*2)-1: WIDTH]};
|
mul_prod_r[WIDTH-2:0] <= mul_prod_r[WIDTH-1:1];
|
mul_prod_r[WIDTH-2:0] <= mul_prod_r[WIDTH-1:1];
|
|
|
end
|
end
|
else if (alu_op_mul && mul_free) begin
|
else if (alu_op_mul && mul_free) begin
|
mul_prod_r <= {32'd0, y};
|
mul_prod_r <= {32'd0, y};
|
mul_free <= 0;
|
mul_free <= 0;
|
serial_mul_cnt <= 6'b10_0000;
|
serial_mul_cnt <= 6'b10_0000;
|
end
|
end
|
else if (!ex_freeze | mul_free) begin
|
else if (!ex_freeze | mul_free) begin
|
mul_free <= 1'b1;
|
mul_free <= 1'b1;
|
end
|
end
|
|
|
assign mul_stall = (|serial_mul_cnt) | (alu_op_mul & !ex_freeze_r);
|
assign mul_stall = (|serial_mul_cnt) | (alu_op_mul & !ex_freeze_r);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|