OpenCores
URL https://opencores.org/ocsvn/socgen/socgen/trunk

Subversion Repositories socgen

[/] [socgen/] [trunk/] [common/] [opencores.org/] [cde/] [ip/] [mult/] [rtl/] [verilog/] [top.serial] - Diff between revs 131 and 135

Only display areas with differences | Details | Blame | View Log

Rev 131 Rev 135
   //
   //
   // 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);
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.