2011-04-09 12 views
0

변수 'j'가 genvar 변수가 아니지만 다음 verilog 코드가있는 genvar가 있습니다. 내가 구문을 확인하면 (자일링스 사용), if 문과 함께 라인에 "if if 문을 생성하는 중에 잘못된 조건 표현식"오류가 발생한다. 'j'를 genvar 변수로 변경해도 문제가 해결되지 않습니다. 어떻게 'j'를 올바르게 읽을 수 있습니까? 어떤 도움을 주셔서 감사합니다.변수를 사용하는 Verilog 'if'문

genvar i; 

generate 
integer j=0; 

    for(i=0; (i<10); i=i+1) begin: gen_columns 
     if (j==0) begin 
      //some code 
     end 
assign j=j+1; 
    end 

endgenerate 

답변

1

시뮬레이션이 시작되기 전에 디자인을 구체화 할 때 generate 블록을 표준 verilog 모듈 항목으로 확인해야합니다. 귀하의 예에서 도구는 상수로 if (j==0)을 평가하려고 시도 할 수 없습니다.

예를 들어 무엇을 하려는지 명확하지 않습니다. 여기에 날 위해 일하는 몇 예 : 버스의 비트 이상

wire [9:0] w; 
genvar i; 

generate 
    for(i=0; (i<10); i=i+1) begin: gen_columns 
     if (i==0) begin 
      assign w[i] = 1'b0; 
     end else begin 
      assign w[i] = 1'b1; 
     end 
    end 
endgenerate 

initial begin 
    $display ("%x", w); 
    $finish; 
end 

이 코드 반복은, 비트에 따라 다른 값을 할당합니다. 출력은 3fe입니다.

reg clk; 
integer j [0:1]; 
genvar i; 

generate 
    for(i=0; (i<2); i=i+1) begin: gen_columns 
     always @(posedge clk) begin 
      if (j[i]==0) begin 
       j[i] <= j[i] + 1; 
      end 
     end 
    end 
endgenerate 

initial clk = 1'b0; 
always #1 clk = ~clk; 

initial begin 
    $monitor ("%d: j[0]: %d, j[1]: %d", $time, j[0], j[1]); 
    repeat (2) @(posedge clk); 
    j[0] = 0; 
    j[1] = 0; 
    repeat (2) @(posedge clk); 
    $finish; 
end 

이 코드는 제로를하는 경우를 증가시키는 j[0]j[1]에 대한 동일한 로직을 생성합니다. 출력은 다음과 같습니다.

0: j[0]:   x, j[1]:   x 
3: j[0]:   0, j[1]:   0 
5: j[0]:   1, j[1]:   1 

두 번째 사례와 예가 다른 점은 if 문과 할당이 항상 블록 내에 있다는 것입니다. 설계가 정교 해지면 도구는 생성 블록을 두 개의 항상 블록으로 바꿉니다. 하나는 i=0이고 다른 하나는 i=1입니다.

스타일 참고 : 여러 개의 항상 블록에서 변수를 업데이트하는 것이 유효한 verilog이지만 좋은 연습으로 간주되지 않습니다. 다중 신호로 합성 될 가능성이 높고 시뮬레이션에서 경쟁 조건을 도입 할 수 있습니다. 두 번째 예에서 할당이 j = j + 1 ([i]없이) 인 경우 j이 여러 개의 항상 블록에 할당됩니다.

1

위의 코드 조각에서 모델화하려는 하드웨어 유형을 알 수 없습니다. 피 루프

:

생성 루프는 하나 이상의 변수 선언을 허가 : Verilog를 이어 피 루프 직선 생성-for 루프의 Verilog LRM으로부터

- iterating over a set of bits for an operation (XORing, demux, et cetera) 
- creating multiple instances of a structure using generate statements 

주로 사용 , 모듈 정의, 사용자 정의 프리미티브, 게이트 기본 요소, 연속 할당, 초기 블록 및 항상 블록 for 루프를 사용하여 인스턴스화 할 수 있습니다. for 루프 생성에 사용 된 인덱스 루프 변수
은 genvar로 선언되어야한다. for-loop의 두 genvar 지정은 루프 색인 변수 인 genvar에 할당해야합니다. for-loop의 첫 번째 genvar 할당은 의 오른쪽에 루프 인덱스 변수를 참조하지 않습니다.

코드에서 j의 목적은 무엇입니까? Verilog에서는 변수를 할당 한 다음 동일한 절차 블록에서 제어 논리로 사용하는 것은 나쁜 형식입니다. 대부분의 경우 generate 루프 외부에 j에 대한 다른 절차 블록이 필요할 것입니다. 나는 당신의 코드에서 j의 목적을 모르지만 아마도 다음과 같은 것을 할 수 있을까?

// continuously increment counter each clock cycle 
// asynchronous reset capability 
integer j; 
always @(posedge clock, posedge reset) 
    if (reset) j <= 0; 
    else j <= j + 1; 
관련 문제