|
|
|
|
|
|
|
|
//
|
//
|
// Internal wires and regs
|
// Internal wires and regs
|
//
|
//
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
wire [2*WIDTH-1:0] mul_prod;
|
wire [2*WIDTH-1:0] mul_prod;
|
reg [1:0] mul_stall_count;
|
reg [1:0] mul_stall_count;
|
|
|
|
|
`ifndef SYNTHESYS
|
`ifndef SYNTHESIS
|
|
|
always@(posedge clk)
|
always@(posedge clk)
|
|
|
if(mul_stall_count == 2'b10)
|
if(mul_stall_count == 2'b10)
|
begin
|
begin
|
$display("%t %m mul (%x,%x,%x);",$realtime,a_in,b_in,mul_prod );
|
$display("%t %m mul (%x,%x,%x);",$realtime,a_in,b_in,mul_prod );
|
|
|
|
|
end
|
end
|
|
|
|
|
|
|
`endif
|
`endif
|
|
|
|
|
|
|
|
|
|
|
|
|
or1200_gmultp2_32x32 or1200_gmultp2_32x32(
|
or1200_gmultp2_32x32 or1200_gmultp2_32x32(
|
.X(a_in),
|
.X(a_in),
|
.Y(b_in),
|
.Y(b_in),
|
.RST(reset),
|
.RST(reset),
|
.CLK(clk),
|
.CLK(clk),
|
.P(mul_prod)
|
.P(mul_prod)
|
);
|
);
|
|
|
|
|
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;
|
end
|
end
|
else begin
|
else begin
|
mul_prod_r <= mul_prod[63:0];
|
mul_prod_r <= mul_prod[63:0];
|
end
|
end
|
|
|
//
|
//
|
// Generate stall signal during multiplication
|
// Generate stall signal during multiplication
|
//
|
//
|
always @( posedge clk)
|
always @( posedge clk)
|
if (reset)
|
if (reset)
|
mul_stall_count <= 0;
|
mul_stall_count <= 0;
|
else if (!(|mul_stall_count))
|
else if (!(|mul_stall_count))
|
mul_stall_count <= {mul_stall_count[0], alu_op_mul & !ex_freeze_r};
|
mul_stall_count <= {mul_stall_count[0], alu_op_mul & !ex_freeze_r};
|
else
|
else
|
mul_stall_count <= {mul_stall_count[0],1'b0};
|
mul_stall_count <= {mul_stall_count[0],1'b0};
|
|
|
assign mul_stall = (|mul_stall_count) |
|
assign mul_stall = (|mul_stall_count) |
|
(!(|mul_stall_count) & alu_op_mul & !ex_freeze_r);
|
(!(|mul_stall_count) & alu_op_mul & !ex_freeze_r);
|
|
|
|
|
|
|