2014-10-09 119 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_counter <= __parsername_counter + 4'h1; 

我一直在使用

012也嘗試

哪個也不起作用。 任何幫助,將不勝感激。

+0

您還需要聲明新的'reg'和你需要的地方使用它了。這些都需要成爲你宏觀的一部分。 – toolic 2014-10-09 23:38:27

回答

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的。

所以如果有人想使用它: 設置 - >觀&合成設置 - > Verilog HDL和檢查的SystemVerilog

一些模擬器的可能,無論用它已選定的標準(如伊卡洛斯),這可能有點混亂。

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

      ... 
);