2014-10-09 6 views
2

변수 이름 안에 매개 변수 값을 사용해야하는 Altera Quartus에서 Verilog 전 처리기 매크로를 사용하려고합니다.Verilog 전 처리기 문자열 연결

예 :

`define INCREMENT_COUNTER(parsername) \ 
__parsername_counter <= __parsername_counter + 4'h1; 

그래서 `INCREMENT_COUNTER(p1)를 사용하여

__p1_counter <= __p1_counter + 4'h1; 

을 주어야한다 그러나 parsername가 제대로 교체되지 않고 반환

__parsername_counter <= __parsername_counter + 4'h1; 

나는 또한

012를 사용하여 시도

역시 작동하지 않습니다. 도움이 될 것입니다.

+0

또한 새로운'reg'를 선언해야하고, 너무 어딘가에을 사용해야합니다. 그것들은 모두 매크로의 일부가 될 필요가 있습니다. – toolic

답변

2

`VCS와 예리한에`작품,하지만 난의 Quartus 모르는이 :

module tb; 

reg clk = 0; 
always #5 clk = ~clk; 

reg [3:0] __foo_counter = 0; 

`define INC_CNT(name) __``name``_counter <= __``name``_counter + 1; 

always @(posedge clk) `INC_CNT(foo) 

initial begin 
    $monitor($time, " clk=%b cnt=%d", clk, __foo_counter); 
    #55 $finish; 
end 

endmodule 

/* 

Outputs: 

        0 clk=0 cnt= 0 
        5 clk=1 cnt= 1 
        10 clk=0 cnt= 1 
        15 clk=1 cnt= 2 
        20 clk=0 cnt= 2 
        25 clk=1 cnt= 3 
        30 clk=0 cnt= 3 
        35 clk=1 cnt= 4 
        40 clk=0 cnt= 4 
        45 clk=1 cnt= 5 
        50 clk=0 cnt= 5 
*/ 
0

나는이 조금 오래 알고 있지만 정답은 연결이 SystemVerilog를 때까지 사용할 수 있습니다. 누군가가 사용하고 싶어 그렇다면

:

이 시뮬레이터의 일부는 (이카루스처럼)은 선택된 표준에 관계없이 사용할 수 있습니다 SystemVerilog 기술을 설정 -> 어낼 & 합성 설정 ->의 Verilog HDL을 체크, 수도 조금 혼란스러워.

0

{"a","b"} 구문을 사용하여 params 매크로와 연결할 수있었습니다. 예를 들어

:

`define DEFAULT_CS_PATH(x,y) {"../../../fpgas/cs/", x, "/build/tmp/scalar", y, ".mif"} 

cs20_top #(
       .SCALAR_MEM_0 (`DEFAULT_CS_PATH("cs20","0")), 
       .SCALAR_MEM_1 (`DEFAULT_CS_PATH("cs20","1")), 
       .SCALAR_MEM_2 (`DEFAULT_CS_PATH("cs20","2")), 
       .SCALAR_MEM_3 (`DEFAULT_CS_PATH("cs20","3"))) 
     cs20_top (
      .CLK    (clk), 

      ... 
);