如何提高verilog中乘数的速度?

时间:2015-01-25 08:07:40

标签: verilog

如何提高verilog中乘数的速度?

您好

我想了解'如何在不增加verilog时钟速度的情况下提高乘法器的速度?'

有人知道这个吗? 我们没有多少钱购买Synopsys的DesignWare。 不幸的是,我们也遇到了一些关于乘数速度限制的问题。所以我试图在没有时钟加速的情况下找到提高乘数的方法。特别是,我们的ASIC已经接近时限。我们没有时间限制。但我们必须改变乘数逻辑。

例如,我们已经在综合中遇到了所有的定时时钟。但是我们需要将算法改为逻辑上的一些乘法器。

1 个答案:

答案 0 :(得分:2)

假设所有周围的逻辑都已被最小化,触发器的输入直接输出到触发器。

module multiplier(
  WDITH = 24
)(
  input                                clk,
  input        signed      [WIDTH-1:0] a,
  input        signed      [WIDTH-1:0] b,
  output logic signed [(WIDTH*2) -1:0] mul
);

logic          signed      [WIDTH-1:0] a_i;
logic          signed      [WIDTH-1:0] b_i;

always @(posedge clk) begin
  a_i <= a;
  b_i <= b;
  mul <= a_i * b_i;
end

endmodule

在RTL中具有a*b样式允许合成库选择最佳乘数样式(面积/功率与速度)。假设问题是综合的结果无法关闭时间。

乘数速度有什么限制?

可以最小化输入宽度以加速设计。

对于ASIC设计,可以选择下一个工艺节点,即从22nm到14nm。对于FPGA来说,更昂贵的芯片支持更快的乘法器速度。

或者,乘法器的目标时钟速度可以减半并且两个并联使用。如果实际时钟要保持相同但结果每隔一个时钟采样,则可以在综合中使用多周期时钟。

module multiplier(
  WDITH = 24
)(
  input                              clk,
  input                            rst_n,
  input        signed      [WIDTH-1:0] a,
  input        signed      [WIDTH-1:0] b,
  output logic signed [(WIDTH*2) -1:0] mul
);

logic          signed      [WIDTH-1:0] a1_i;
logic          signed      [WIDTH-1:0] b1_i;
logic          signed      [WIDTH-1:0] a2_i;
logic          signed      [WIDTH-1:0] b2_i;
logic          signed [(WIDTH*2) -1:0] mul1;
logic          signed [(WIDTH*2) -1:0] mul2;

logic state;
always @(posedge clk, negedge rst_n) begin
  if (~rst_n) begin
    state <= 'b0;
  end
  else begin
    state <= ~state;
  end
end

always @* begin
 mul1_i = a1_i * b1_i;
 mul2_i = a2_i * b2_i;
end

always @(posedge clk, negedge rst_n) begin
  if (~rst_n) begin
    a1_i <= 'b0;
    b1_i <= 'b0;
    a2_i <= 'b0;
    b2_i <= 'b0;
    mul  <= 'b0
  end
  else begin
    if (state) begin
      a1_i <= a;
      b1_i <= b;
      mul  <= mul2_i;
    end
    else begin
      a2_i <= a;
      b2_i <= b;
      mul  <= mul1_i;
    end 
  end
end

endmodule

mul1_imul2_i的位置;在合成中给出多周期属性,因此它们有两倍的时钟周期来解决。

另一种可能性是实例化多周期设计器皿乘数using the designware Datapath and building block IP。他们有2,3,4,5和6个周期乘数。

2-Stage Multiplier的一个例子:

module DW02_mult_2_stage_inst( inst_A, inst_B, inst_TC, 
                               inst_CLK, PRODUCT_inst );

  parameter A_width = 8;
  parameter B_width = 8;

  input [A_width-1 : 0] inst_A;
  input [B_width-1 : 0] inst_B;
  input inst_TC;
  input inst_CLK;
  output [A_width+B_width-1 : 0] PRODUCT_inst;

  // Instance of DW02_mult_2_stage
  DW02_mult_2_stage #(A_width, B_width)
    U1 ( .A(inst_A),   .B(inst_B),   .TC(inst_TC), 
         .CLK(inst_CLK),   .PRODUCT(PRODUCT_inst) );

endmodule