2014-10-09 2 views
2

Я пытаюсь использовать макрос препроцессора Verilog в Altera Quartus, требующий использования значения параметра внутри имени переменной.Verilog preccessor string concatenation

Пример:

`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; 

Я также попытался с помощью

__``parsername``_counter <= __``parsername``_counter + 4'h1; 

который также не работает. Любая помощь будет оценена по достоинству.

+0

Вы также должны объявить новый 'reg' и вам нужно будет использовать его где-то, тоже. Все они должны быть частью вашего макроса. – toolic

ответ

2

`` работает в VCS и Incisive, но я не знаю, о 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.

Так что, если кто-то хочет использовать его: Настройка-> Analysys & Синтез Настройка-> Verilog HDL и проверить SystemVerilog

Некоторые тренажеры могут использовать его независимо от стандарта выбраной (как Икар), которые могли бы быть немного запутанным.

0

Я смог использовать синтаксис {"a","b"} для конкатенации в макросе с параметрами.

Например:

`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), 

      ... 
);