双变量宏用法systemverilog

时间:2017-02-07 09:26:18

标签: macros system-verilog

我在网上搜索但找不到问题的答案。我正在尝试在systemverilog中使用双变量宏。

在一个文件中,我声明了以下宏:

`define TX_TOP_PATH(first_idx,second_idx)  aaa.F[first_idx].bbb.S[second_idx].ccc

在第二个文件(在模块中)中,我尝试使用此宏来生成嵌套for循环。例如:

wire if[15:0];
generate
    for (first_idx = 1; first_idx< 4; first_idx++)    
    begin : first_loop
       for (second_idx = 0; second_idx < 4; second_idx++)
       begin : second_loop
          assign if[4*first_idx + second_idx].clk = `TX_TOP_PATH(first_idx,second_idx).clk;
       end
    end
endgenerate

但是当我这样做时,我收到错误 - CUVFGS:“无效的生成索引”。

当我试图将宏定义放在括号中时,如下所示:

`define TX_TOP_PATH(first_idx,second_idx)  (aaa.F[first_idx].bbb.S[second_idx].ccc)

我收到错误 - EXPSMC:“期待分号(';')”

有什么想法吗?

Liav

1 个答案:

答案 0 :(得分:0)

我认为你有两个问题:

i)if是保留字。您无法致电wire if

ii)您需要将first_idxsecond_idx声明为genvar

  wire iif[15:0];    // "if" is a reserved word

  generate
    genvar first_idx, second_idx;    // these need to be declared as genvars
    for (first_idx = 1; first_idx< 4; first_idx++)    
    begin : first_loop
       for (second_idx = 0; second_idx < 4; second_idx++)
       begin : second_loop
         assign iif[4*first_idx + second_idx] = `TX_TOP_PATH(first_idx,second_idx).clk;
       end
    end
  endgenerate

https://www.edaplayground.com/x/m_6