2014-10-09 104 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), 

      ... 
);