2017-03-03 8 views
1

합성 가능 Verilog 모듈을 구현하려고합니다.이 모듈은 2 개의 벡터/배열로 구성된 벡터 제품을 생성합니다. 각 제품에는 8 개의 16 비트 부호없는 정수가 들어 있습니다. 디자인 컴파일러가 symbol i must be a constant or parameter 오류를보고했습니다. 나는 그것을 고치는 법을 모른다. 여기 내 코드가있다.Verilog 벡터 내부 제품

module VecMul16bit (a, b, c, clk, rst); 
// Two vector inner product, each has 8 elements 
// Each element is 16 bits 
// So the Output should be at least 2^32*2^3 = 2^35 in order to 
// prevent overflow 
// Output is 35 bits 
input clk; 
input rst; 
input [127:0] a,b; 
output [35:0] c; 
reg [15:0] a_cp [0:7]; 
reg [15:0] b_cp [0:7]; 
reg [35:0] c_reg; 
reg k,c_done; 

integer i; 
always @ (a) 
begin 
    for (i=0; i<=7; i=i+1) begin 
     a_cp[i] = a[i*15:i*15+15]; 
    end 
end 

always @ (b) 
begin 
    for (i=0; i<=7; i=i+1) begin 
     b_cp[i] = b[i*15:i*15+15]; 
    end 

end 

assign c = c_reg; 

always @(posedge clk or posedge rst) 
begin 
    if (rst) begin 
     c_reg <= 0; 
     k <= 0; 
     c_done <= 0; 
    end else begin 
     c_reg <= c_done ? c_reg : (c_reg + a_cp[k]*b_cp[k]); 
     k   <= c_done ?   k : k + 1; 
     c_done  <= c_done ?   1 : (k == 7); 
    end 
end 

endmodule 

당신이 볼 수 있듯이, 나는 루프를 통해 a_cp-a을 복사하기 위해 노력하고있어,이 할 수있는 올바른 방법인가?

그렇다면 어떻게 정의해야합니까? i 및 for 루프에서 스테퍼로 사용할 수 있습니까?

답변

1

부분 선택은 verilog에서 일정한 경계를 가져야합니다. 그래서이 허용되지 않습니다 :

a_cp[i] = a[i*15:i*15+15]; 

의 Verilog-2001의 새로운 인덱스 부분은 당신이 시작 위치와 비트의 선택된 그룹의 너비를 지정 구문을 선택 소개했다. 그래서, 당신은에 의해 위의 라인을 교체해야합니다

a_cp[i] = a[i*15+:16]; 

이 오른쪽으로 계산 비트 i*15에서 시작 a의 16 비트 폭 슬라이스를합니다. +: 대신 -:을 사용할 수 있습니다.이 경우 왼쪽으로 계산됩니다.

주의 : +: 대신 :+을 입력하는 것이 매우 쉽고 :+은 유효한 구문이므로 컴파일러에서 발견 할 수는 없지만 여전히 버그 일 수 있습니다. 사실,이 경우 EDA Playground example을 타이핑 할 때 필자는 정확히했는데, 필자의 오타가이 경우 컴파일러에 의해 잡혔다.

+1

색인은 아마도 'i * 16'만큼 이동해야합니다. 그렇지 않으면 슬라이스 사이에 겹침이 있습니다. '+ :'의 앞뒤에 공백을 추가하여 두드러지게 만듭니다.'a [i * 15 + : 16]; – Greg