2015-01-25 2 views
0

Verilog에서 승수의 속도를 향상시키는 방법은 무엇입니까?Verilog에서 승수의 속도를 향상시키는 방법은 무엇입니까?

안녕

나에 대해 알고 싶은

'방법을 Verilog에 클럭 속도를 증가시키지 않고 승수의 속도를 개선?'

누구와 관련하여 알고 계십니까? 우리는 Synopsys 사의 DesignWare를 살 돈이별로 없다. 아쉽게도 승수의 속도 제한과 관련된 몇 가지 문제를 만났습니다. 그래서 나는 클럭 속도없이 승수를 향상시키는 방법을 찾고있다. 특히 ASIC은 이미 타이밍 제한에 다가 섰다. 우리는 타이밍 마진이 없습니다.하지만 승수 논리에 대해서는 변경해야합니다.

예를 들어, 우리는 이미 synthesis에서 모든 타이밍 클럭을 만났습니다. 그러나 로직과 관련하여 알고리즘을 변경할 필요가 있습니다.

+0

당신은 무엇을 시도? 승수 속도가 왜 문제가됩니까? 어떤 클럭 속도를 사용하고 있습니까? – Morgan

+0

저에게 묻습니다. 멀티 플라이어 속도는 클럭 속도를 높이 지 않고 속도를 높이고 싶을 때 중요합니다. 그래서 몇 가지 방법을 찾으려고 노력했지만 쉽지 않습니다. 우리는 거의 300 ~ 400Mhz 클럭 속도를 사용합니다. – JamJI

+0

플립 플롭으로 combinational 로직 측면을 최소화하는 것이 단순히 멀티플렉서가 아닌 전체 시스템 클럭 속도라는 것을 생각합니다. – JamJI

답변

1

주변 논리가 모두 최소화되었다고 가정하면 플립 플롭 출력은 플립 플롭으로 직접 출력됩니다. RTL에서 a*b 스타일을 갖는

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 

합성 라이브러리가 가장 승수 스타일 (속도 대 지역/전력)를 선택할 수 있습니다. 질문은 합성의 결과로 타이밍을 닫을 수 없다고 가정합니다.

승수 속도가 제한되는 이유는 무엇입니까?

입력 속도를 최소화하여 설계 속도를 높일 수 있습니다.

ASIC 설계의 경우 다음 프로세스 노드를 선택할 수 있습니다. 즉, 22nm에서 14nm로 진행할 수 있습니다. FPGA의 경우 더 빠른 승수 속도를 지원하는보다 값 비싼 칩.

다른 방법으로는 멀티 플라이어의 목표 클럭 속도를 반으로 줄이고 두 개를 병렬로 사용할 수 있습니다. 실제 클럭이 동일하게 유지되지만 다른 클럭마다 샘플링되는 경우 멀티 사이클 클럭을 합성에 사용할 수 있습니다.

( 입력 CLK가 입력 rst_n가 입력 서명

모듈 배율 (= 24 WDITH는) WIDTH-1 : 0] A, 입력 부호는 [WIDTH-1 : 0], B, 출력 로직 서명 [(폭 × 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 buiding 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 
+0

고마워, 그렇게 생각해. 어쩌면 나는 물건을 개선하는 2 가지 방법이 있다고 생각합니다. 먼저 말했듯이, 수정 된 멀티플렉서를 사용하고 더 첨단 기술을 사용하십시오. 불행히도 우리는 기술을 선택할 수는 없지만 우리는 복식 멀티플렉서를 만들 수 있습니다. – JamJI

+0

그렇다면 어떤 종류의 맞춤 멀티플렉서가 있습니까? – JamJI

+0

@JamJI, 나는 기본적으로 존재하지 않는다고 생각합니다. 작은 상태 머신을 만들어 시퀀스를 만들고 두 개의 곱셈기를 인스턴스화해야합니다. – Morgan

관련 문제