2017-05-04 4 views
1

표준 양식 (64 비트 숫자의 경우 IEEE 754 부동 소수점 표준)으로 제공해야하는 52 비트 승수에 대한 코드를 작성했습니다. 그래서 나중에 나는 얼마나 많은 비트가 64를 초과했는지를 검사하고 있습니다. 그래서 그 수를 지수로 넣을 것입니다.Verilog 코드 오류 : 범위는 상수 식으로 제한되어야합니다.

module mul1(output reg [103:0] p, 
     output reg [51:0] c, 
     input [51:0] x, 
     input [51:0] y); 


reg [103:0]a; 
integer i; 

always @(x , y) 
begin 
    a=x; 
    p=0; // needs to zeroed 
    for(i=0;i<104;i=i+1) 
    begin 
    if(y[i]) 
     p=p+a; // must be a blocking assignment 
    a=a<<1; 
    end 

    for(i=103;i>=0;i=i-1) 
    begin 
    if (p[i]) 
     c=p[i:i-51]; 
     break; 
    end 

    end 
endmodule 

가 에러를 제공한다 : 범위 선의 상수 식에 의해 제한되어야한다 : C = P [I : I-51]; 어떻게 해결할 수 있습니까?

+0

가능한 중복 [Verilog : "... is not a constant"] (http://stackoverflow.com/questions/29815974/verilog-is-not-a-constant) – Qiu

답변

0

가변 부분/슬라이스 선택 (가변 너비)을 가질 수 없습니다. 변수 c의 관점에서 할당을 생각하십시오. c는 52 비트 폭이므로 52 비트로 지정해야합니다. 루프는 어느 52 비트를 선택해야합니다. 이것이 가변 부분 선택 연산자입니다. 그것은처럼 보이는 Indexing vectors and arrays with +:

: 여기 좋은 설명이있다

의미
c=p[i+:52] 

, (낮은 비트) 내가 + (52-1)까지가는 시작 페이지에서 선택하고 C에 할당합니다.

module mul1(output reg [103:0] p, 
     output reg [51:0] c, 
     input [51:0] x, 
     input [51:0] y); 


reg [103:0]a; 
integer i; 

always @(x , y) begin 
    a=x; 
    p=0; // needs to zeroed 
    for(i=0;i<104;i=i+1) begin 
    if(y[i]) begin 
     p=p+a; // must be a blocking assignment 
    end 
    a=a<<1; 
    end 

    for(i=103;i>=0;i=i-1) begin 
    if (p[i]) begin 
     c=p[i+:52]; 
     break; 
    end 
    end 
end 
endmodule 

또한, 당신은이 2 루프와 '말'에서 항상을 닫습니다 '가'블록 후 '시작'이 필요합니다. 위의 코드는 나를 위해 컴파일됩니다.