2013-08-02 2 views
4

나는이 질문에 대해 내가 원하는 바를 요약한다 : 변수의 값을 SystemVerilog의 매크로에 전달한다. 내가 원하는 예를 들어SystemVerilog에서 매크로에 변수 값을 전달하는 방법은 무엇입니까?

: 말을, 매크로없이,이 abc_X_def의 이름으로 4 개 신호는 내가 0 그래서 그들 모두를 초기화 할 :

abc_0_def = 4'b0000; 
abc_1_def = 4'b0000; 
abc_2_def = 4'b0000; 
abc_3_def = 4'b0000; 

자, 나는 문제가있는 작성한 코드 :

`define set_value(bit) abc_``bit``_def = 4'b0000 

for (int i = 0; i < 4; i++) begin 
    `set_value(i); 
end 

오류가있는 abc_i_def 분명히 잘못된 신호를 발견하려고한다는 것입니다. 변수 'i'의 실제 값을 매크로에 전달할 수 있는지 궁금합니다.

답변

3

전 처리기 지시문은 전처리기에 의해 평가되고 컴파일러에 제공되는 코드를 수정합니다.

for 루프는 컴파일러에서 평가하는 verilog 구조입니다.

그래서 전처리 기가 for 루프를 평가하지 않습니다. 보는 사람 :

`define `set_value(bit) abc_``bit``_def = 4'b0000 

[some verilog] 
    `set_value(i); 
[some verilog] 

'i'는 i입니다. 편집 전까지는 숫자가되지 않습니다.

왜 로컬 매개 변수를 generate와 함께 사용하지 않으므로 for 루프가 전개 될 때 로컬 매개 변수가 루프에서 작성됩니다.

매크로가 문제가되는 곳 중 하나입니다. 생성은 포트 목록을 제어하려는 경우와 같이 다른 장소에서 문제가됩니다.


나는 이것을 조금 더 파헤 쳤다. generate 내부의 매개 변수 및 로컬 매개 변수는 생성 범위에 localparams로 작성됩니다. 여기를 참조하십시오 : System Verilog parameters in generate block. 나는 그것을 시험 할 수 있기 전에 다시 일해야했다.

코드를 사용하고 배열을 채울 것입니다. 이 VCS에서 컴파일 :

module veritest 
    #( 
    parameter MAX_X = 5, 
       MAX_Y = 3, 
       MAX_Z = 2 
    ) 
    (); // empty port list 

logic [4:0] abc_def[1:MAX_X][1:MAX_Y][1:MAX_Z]; 

always @* 
begin 
for (integer z=1; z<(MAX_X+1);z=z+1) 
    for (integer y=1; y<(MAX_Y+1);y=y+1) 
     for (integer x=1; x<(MAX_X+1);x=x+1) 
     begin 
      abc_def[x][y][z] = 4'b0000; 
     end 
end 
endmodule 
+0

'매크로 메타 프로그래밍 사용'과 동일한 작업을 수행하는 방법은 18 페이지를 참조하십시오. 나는 이것이 끔찍하다고 생각하지만 그것은 그것이 무엇인가 : http : //www.veripool.org/papers/Preproc_Good_Evil_SNUGBos10_paper.pdf –

+0

David에게 감사드립니다. 매크로가 나를 위해 일할 수없는 이유를 적어도 이해했습니다. 당신은 당신이 localparam에 대해 말하고자하는 것을 기술하고 문장을 생성하는 예제를 줄 수 있습니까? 죄송합니다. 저는 System Verilog를 처음 접했습니다. – user2644151

+0

또한 게시 한 문서와 관련하여 내가 알고 싶은 것은 좋았으며 정확하게하고 싶었지만 사용하지 못했습니다. 내 질문에서 언급 한 것보다 더 많은 비트로 사용하려고하기 때문에 사용할 수 없습니다. abc_X_def_Y_ghi_Z와 같은 변수가 더 많습니다. 여기서 X, Y 및 Z는 크기가 다른 변수입니다. 한계를 하드 코딩하는 것은 과도한 행동입니다. – user2644151

1

당신이 명명 규칙이 통제 불능 말했다 때문에, 당신은 당신을위한 Verilog에를 생성하기 위해 다른 도구를 사용하는 것이 좋습니다.

원하는 프로그래밍으로 코드를 생성 한 다음 verilog 파일에 `include 문을 사용할 수 있습니다. 또는 임베디드 경로를 사용할 수 있습니다. http://search.cpan.org/~gspivey/Text-EP3-Verilog-1.00/Verilog.pm

  • 루비 eRuby에게 있습니다 : 그것은 다른 언어로 존재처럼 http://www.tutorialspoint.com/ruby/eruby.htm
  • 나는 확실히 뭔가있어

    • 는 펄은 EP3했다. 파이썬, Tcl, 자바 스크립트 등

    개념은 동일하지만 변환에 사용되는 임베디드 언어와 도구의 차이점 만 있습니다.

  • +1

    Python 사용자는 prepro을 가지고 있습니다 : http://corner-case.com/indproj/prepro.html –

    +0

    도와 주셔서 감사합니다! 나는 Perl을 사용하여 끝냈다. 매우 빨리 완료되었습니다 .. – user2644151

    관련 문제