我正在尝试在 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;
这也不起作用。 任何帮助将不胜感激。
``
适用于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
我知道这有点老了,但正确的答案是串联在 SystemVerilog 之前都是可用的。
所以如果有人想使用它: Settings->Analysys & Synthesis Settings->Verilog HDL 并检查 SystemVerilog
某些模拟器可能会使用它,而不管选择的标准如何(例如 Icarus),这可能有点令人困惑。
我能够使用
{"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),
...
);
也许你可以尝试一下:
`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