Verilog 预处理器字符串连接

问题描述 投票:0回答:4

我正在尝试在 Altera Quartus 中使用 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;

我也尝试过使用

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

这也不起作用。 任何帮助将不胜感激。

verilog
4个回答
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

输出:

                   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

1
投票

我知道这有点老了,但正确的答案是串联在 SystemVerilog 之前都是可用的。

所以如果有人想使用它: Settings->Analysys & Synthesis Settings->Verilog HDL 并检查 SystemVerilog

某些模拟器可能会使用它,而不管选择的标准如何(例如 Icarus),这可能有点令人困惑。


1
投票

我能够使用

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

            ...
);

0
投票

也许你可以尝试一下:

`define PHANTOM(x) x
`define INCREMENT_COUNTER(parsername) \
__`PHANTOM(parsername)_counter <= __`PHANTOM(parsername)_counter + 4'h1;

它对我有用

Verilator 4.210 2021-07-07 rev v4.210

© www.soinside.com 2019 - 2024. All rights reserved.