如何提高verilog中乘数的速度?
您好
我想了解'如何在不增加verilog时钟速度的情况下提高乘法器的速度?'
有人知道这个吗? 我们没有多少钱购买Synopsys的DesignWare。 不幸的是,我们也遇到了一些关于乘数速度限制的问题。所以我试图在没有时钟加速的情况下找到提高乘数的方法。特别是,我们的ASIC已经接近时限。我们没有时间限制。但我们必须改变乘数逻辑。
例如,我们已经在综合中遇到了所有的定时时钟。但是我们需要将算法改为逻辑上的一些乘法器。
答案 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_i
和mul2_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