2012-11-11 1 views
-1

아래 코드를 작성했습니다.Verilog 'for'-loop 반환 값

내 문제는 : 인덱스 1

에서

그것은 몇 가지 값으로 for 루프에 들어갑니다. 그것은 'if'문에 들어가며 모든 'if'의 마지막 명령을 'P = ....'와 같이 볼 수 있습니다. 인덱스 2에서는

(다음 단계)

그것은 '가'문에 입사하지만, P의 값을 1 단계에서 아니라, 초기 값이다.

다음 단계에서 'P'의 마지막 값을 어떻게 사용할 수 있습니까? 당신이 합성 Shift 키를 생성하고 곱셈 값이 9 클록 사이클 계산됩니다 승수 아키텍처를 추가하려고처럼 (인덱스 + 1)

module multiplier(prod, a, b, wireP, wireA, wireS); 
    output [15:0] prod; 
    output [16:0] wireA; 
    output [16:0] wireS; 
    output [16:0] wireP; 
    reg [15:0] prod; 

    input [7:0] a; 
    input [7:0] b; 
    reg [16:0] P; 
    reg [16:0] S; 
    reg [16:0] A; 

    wire [16:0] tempshift; 
    reg [16:0] tempoutshift; 

    arithmeticShift shiftP(tempshift,P); 

    wire [16:0] tempPS; 
    reg [16:0] tempoutPS; 

    carryForPbooth sumPS(coutPS,tempPS,P,S,0); 


    wire [16:0]tempPA; 
    reg [16:0]tempoutPA; 
    carryForPbooth sumPA(coutPA,tempPA,P,A,0); 

    reg [16:0] regP; 
    reg [16:0] regA; 
    reg [16:0] regS; 
    integer index; 

    always @(*) begin 

    A[16:9] = a[7:0]; 
    A[8:0] = 9'b000000000; 
    S[16:9] = ~a[7:0]+1'b1; 
    S[8:0] = 9'b000000000; 
    P[16:9] = 8'b00000000; 
    P[8:1] = b[7:0]; 
    P[0] = 1'b0; 

    #1 tempoutPS = tempPS; 
    #1 tempoutPA = tempPA; 
    #1 tempoutshift = tempshift; 

    for(index = 1; index < 9; index = index + 1) begin 
     if((P[1:0] == 2'b00) | (P[1:0] == 2'b11)) begin 
     #1 tempoutshift = tempshift; 
     #1 P   = tempoutshift; 
     end 
     if(P[1:0] == 2'b01) begin 
     #1 tempoutPA = tempPA; 
     #1 P   = tempoutPA; 
     #1 tempoutshift = tempshift; 
     #1 P   = tempoutshift; 
     end 
     if(P[1:0] == 2'b10) begin 
     #1 tempoutPS = tempPS; 
     #1 P   = tempoutPS; 
     #1 tempoutshift = tempshift; 
     #1 P   = tempoutshift; 
     end 
    end 

    #1 prod=P[16:1]; 
    end 

    assign wireP = P; 
    assign wireS = S; 
    assign wireA = A; 
endmodule 
+0

사용자는 '입력을 [7 : 0],'와 '레지 [16 : 0]는,'전용 케이스에 의해 구별 변수를 갖는 것은 종종있다 나쁜 생각. 일부 시뮬레이터는 대소 문자를 구분하지 않습니다. – Morgan

+0

이것은 Testbench 구성 요소 또는 RTL입니까? '# 1'은 합성 할 수 없습니다. – Morgan

+0

이것이 교대조가되고 9 클록주기에 곱셈이 추가됩니까? – Morgan

답변

0

것 같습니다.

코드를 통해 찾고 내가 그것을 아래로 감소 일부 임시 변수 제거 : 나는 당신이 #1를 사용하여 클럭 사이클을 날조 생각

module multiplier(
    input  [7:0] a, 
    input  [7:0] b, 

    output  [15:0] prod, 
    output reg [16:0] A, 
    output reg [16:0] S, 
    output reg [16:0] P 
); 

    wire [16:0] tempshift; 
    arithmeticShift shiftP(tempshift,P); 

    wire [16:0] tempPS; 
    carryForPbooth sumPS(coutPS,tempPS,P,S,0); 


    wire [16:0] tempPA; 
    carryForPbooth sumPA(coutPA,tempPA,P,A,0); 

    reg [3:0] index; 

    always @(*) begin 
    A = { a, 9'b000000000}; 
    S = { -a, 9'b000000000} ;// -x => ~x+1 
    P = {8'b00000000, b, 1'b0}; 

    for(index = 1; index < 9; index = index + 1) begin 
     if((P[1:0] == 2'b00) | (P[1:0] == 2'b11)) begin 
     #1 P   = tempshift; 
     end 
     if(P[1:0] == 2'b01) begin 
     #1 P   = tempPA; 
     #1 P   = tempshift; 
     end 
     if(P[1:0] == 2'b10) begin 
     #1 P   = tempPS; 
     #1 P   = tempshift; 
     end 
    end 
    end 

    assign prod = P[16:1]; 
endmodule 

을, 이것은 단지 하나의 합성을 또는 유일한되지 않습니다 시뮬레이터에서 작동합니다 마지막 임무가 적용됩니다.

9 클럭주기 동안 분할하려는 경우, for 루프가 아닌 시프트 값에 연결된 카운터가 있어야합니다. Verilog for 루프는 컴파일 시간에 언 롤링되며 테스트 벤치의 일부로 사용되지 않는 한 제로 시간에 실행 가능해야합니다.

다음과 유사한 코드 섹션이 여러 번 나타납니다.

#1 P   = tempPA; 
#1 P   = tempshift; 

난 당신이 다음 같은 변수를 사용하여 출력을 캡처 모듈에 값을 적용하려고하는 생각이 난 당신이 인스턴스화 한 블록에 대한 인터페이스를 가지고 있지 않기 때문에 알고 어렵다. 코드를 합성하려면 Verilog에서이 작업을 수행 할 수 없습니다. 다른 중간 변수를 사용하여 연결해야합니다.

always @* begin ... end은 조합 논리이며 응답 계산에 포함 된 리플을 제외하고는 타이밍이 없다는 것을 기억하십시오. D 형 플립 플롭을 암시 위해 우리가 사용

always @(posedge clk or negedge rst_n) begin 
    if (~rst_n) begin 
    // Reset conditions 
    end 
    else begin 
    // Next clock conditions 
    end 
end